Java Web实践专题——信息显示

经典的显示方法
本章主要介绍如果控制页面的输出,如何控制查询结果的显示,不可否认的是Web应用的是很多功能都要显示数据。
向用户输出的信息包括静态页面和动态页面:静态页面就是我们编写好的html文件,不包含任何的处理代码,我们不管什么时候访问这些页面效果都是一样的,除非把页面替换了;动态页面也就是包含了动态信息的页面,这些页面在不同的运行时刻或者由不同的人访问结果都可能不一样,也就是说它的内容会发生变化。
静态页面主要是由美工来完成的,程序员可以不关心。
动态页面在运行过程中会发生变化,但是如果注意的话,这些变化并不是完全没有规律,例如,在一个学生成绩管理系统中,有一个页面用于显示某个学生的信息,这个页面不同的学生访问的时候,看到的结果不一样,但是不能否认的是,不管哪个学生访问,查看的都还是成绩,不同的是每个学生看到的都是自己的成绩。也就是说,动态页面不是完全动态的,而是由静态的格式和动态的信息组成的。我们所关注的是动态信息的输出。
在Web应用中,动态页面的动态信息主要包括以下几个方面:
Ø 查询的结果
查询的结果可以是单个的信息,例如某个人的信息,记录的个数等,也可以是批量的信息,例如用户列表,图书列表等。基本的信息的输出,我们在第一部分进行介绍,批量信息的输出我们在第三部分进行介绍。
Ø 执行状态信息
为了系统界面友好,通常系统执行的结果都应该对用户进行反馈,例如添加信息是否成功,查询到的信息有多少条等。这些内容在第一部分介绍。
Ø 执行的错误信息
在执行的过程中可能会有一些异常产生,例如当用户注册的时候,输入的信息格式可能不合适,用户ID可能已经存在。应该把这些错误信息告诉用户。这部分内容在第一部分进行介绍。
Ø 根据不同的条件进行不同的显示
系统中不同的用户权限可能不同,所以在访问相同的页面的时候看到的结果也是不同的。有些页面对于登陆用户和非登陆用户来说看到的是不一样的。这部分内容在第二部分进行介绍。
基本信息的输出
假设我们要输出的基本信息包括以下几种类型:
异常信息:通常保存在request对象中,假设名字为myexception,类型为Exception,当然在我们的实际应用中,可以构造自己的异常类型,在使用上没有任何区别。
执行状态信息:通常使用字符串表示执行的状态,然后把字符串保存在request对象中,这里假设我们的状态信息的名字是status,类型是String。
查询的结果(单个的变量):通常保存在request对象中,假设名字为result,类型为String。
查询的结果(对象):通常保存在request对象中,假设名字为resultobject,类型为Calendar,在实际的应用中应该是我们自己的类型。
其它的一些变量:例如session中的信息、application中的信息、当前页面的信息、请求信息、请求头信息等。我们通过下面的代码完成以上信息的保存:
<%
String result = "平均成绩为75";
//表示查询的结果
Calendar c = Calendar.getInstance();
//表示查询的对象
String status="操作完成";
//表示查询的结果
Exception myexception= new Exception("异常信息:我们假设的异常!");
//表示异常信息
String sessionInfo = "这是session中的信息!";
//表示session中保存的一般信息
String applicationInfo = "这是application中的信息!";
//表示application中存储的一般信息
String requestInfo = "这是request中的信息!";
//表示request中存储的一般信息
request.setAttribute("result",result);
//把查询结果保存到request中
request.setAttribute("resultojbec",c);
//把查询的对象结果保存在request中
request.setAttribute("status",status);
//把状态信息保存在request对象中
request.setAttribute("myexception",myexception);
//把异常信息保存在request对象中
request.setAttribute("requestinfo",requestInfo);
//request存储一些一般信息
session.setAttribute("sessioninfo",sessionInfo);
//在session中保存一些一般信息
application.setAttribute("applicationinfo",applicationInfo);
//在application中保存一些基本信息
%>
多数情况下我们也是这样处理的,但不一定使用Java脚本存储,可以在Servlet中完成这些工作,或者在Struts应用中的Action中实现。
下面我们分别介绍在3种方式下这些信息如何输出:第一种方式是使用Java脚本进行输出,第二种方式是使用标准标签库进行输出,第三种方式是使用现在比较流行的Struts标签库进行输出。
使用Java脚本输出
使用Java脚本进行输出,主要是通过内部对象out的print进行输出,但是需要使用内部对象request、session、application等的方法获取到相应的信息。除了使用out的println方法之外,可以使用表达式输出,下面的代码演示了两者的用法:
<%
String str = “test”;
out.println(str);
%>
<%=str%>
对于前面定义的信息的获取,使用下面的代码:
使用Java脚本显示信息<br>
<br>
请求头信息:
<%
String pa = request.getHeader("Accept-language");
out.println("使用的语言为:"+pa);
%>
<br>请求信息:
<%
String para = request.getParameter("para");
out.println(para);
%>
<br>状态信息:
<%
String gstatus = (String)request.getAttribute("status");
out.println(gstatus);
%>
<br>异常信息:
<%
Exception gexception = (Exception)request.getAttribute("myexception");
out.println(gexception.toString());
%>
<br>查询的结果:
<%
String gresult = (String)request.getAttribute("result");
out.println(gresult);
%>
<br>查询的对象的信息:
<%
Calendar gc = (Calendar)request.getAttribute("resultobject");
out.println("现在是:"+gc.get(Calendar.YEAR)+"年"+(gc.get(Calendar.MONTH)+1)+"月"+gc.get(Calendar.DATE)+"日");
%>
<br>request中的一般信息:
<%
String grequestinfo = (String)request.getAttribute("requestinfo");
%>
<%=grequestinfo%>
<br>session中的一般信息:
<%
String gsessioninfo = (String)session.getAttribute("sessioninfo");
%>
<%=gsessioninfo%>
<br>application中的一般信息:
<%
String gapplicationinfo = (String)application.getAttribute("applicationinfo");
%>
<%=gapplicationinfo%>
需要注意几点:
第一, 需要在前面引入java.util.Calendar类;
第二, 如果要运行需要把前面的代码放在这段代码之前,或者分别保存两个代码,然后再前面的代码中增加一行<jsp:forward>语句,跳转到后者。
第三, 在运行的时候,需要在请求的后面添加“?para=ffff”,其中“ffff”可以随便写,目的是传值,与表单提交的作用是相同的。
第四, request的getHeader方法用于获取请求头信息,参数是请求头中的某个属性,代码中的参数“Accept-language”是指使用的默认语言。
部署、运行程序,在地址栏中输入下面的请求:
会得到下面的运行结果:
使用Java脚本显示信息

请求头信息: 使用的语言为:zh-cn
请求信息: fffff
状态信息:操作完成
异常信息: java.lang.Exception: 异常信息:我们假设的异常!
查询的结果:平均成绩为75
查询的对象的信息:现在是:2006 年2月9日
request中的一般信息: 这是request中的信息!
session中的一般信息: 这是session中的信息!
application中的一般信息: 这是application中的信息!
使用标准标签库输出
使用标准标签库进行输出,主要使用标准标签库中的<c:out>标签,但前提需要把标签标签库引入:
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
并且要保证相应的tld文件和压缩包文件在相应的位置,如果你使用集成开发环境,这些工作不需要自己动手,系统会自动完成。下面的代码完成了和上面相同的功能:
使用标准标签库显示信息<br>
<br>请求头信息:
${header["accept-language"]}
<br>请求信息:
<c:out value="${param.para}">
</c:out>
<br>状态信息:
<c:out value="${requestScope.status}">
</c:out>
<br>异常信息:
<c:out value="${requestScope.myexception}">
</c:out>
<br>查询的结果:
<c:out value="${requestScope.result}">
</c:out>
<br>查询的对象的信息:
${requestScope.resultobject["time"]}
<br>request中的一般信息:
<c:out value="${requestScope.requestinfo}">
</c:out>
<br>session中的一般信息:
<c:out value="${sessionScope.sessioninfo}">
</c:out>
<br>application中的一般信息:
<c:out value="${applicationScope.applicationinfo}">
</c:out>
这个代码看起来要比使用Java脚本来的简单,但是代价是多了标注标签库的实现文件和tld文件。
主要的代码是两种输出语句:
使用表达式语言:${header["accept-language"]}
使用<c:out>标签:<c:out value="${applicationScope.applicationinfo}"></c:out>
这个运行结果与上面的运行结果基本相同,只是显示时间的地方不太一样,运行的方式相同,运行后的结果为:
使用标准标签库显示信息

请求头信息 : zh-cn
请求信息: fffff
状态信息:操作完成
异常信息: java.lang.Exception: 异常信息 : 我们假设的异常 !
查询的结果:平均成绩为 75
查询的对象的信息: Thu Feb 09 16:23:03 CST 2006
request
中的一般信息:这是 request 中的信息!
session
中的一般信息:这是 session 中的信息!
application
中的一般信息:这是 application 中的信息!
使用Struts标签库输出
如果你使用Struts框架的话,可以使用该框架提供的<bean:write>标签完成上面相同的功能,下面的代码就是使用Struts标签库完成了相同的功能:
使用Struts标签库显示信息<br>
<br>请求头信息:
<bean:header id="blanguage" name="Accept-language"/>
使用的默认语言为:<bean:write name="blanguage"/>
<br>请求信息:
<bean:parameter id="bpara" name="para"/>
<bean:write name="bpara"/>
<br>状态信息:
<bean:write name="status"/>
<br>异常信息:
<bean:write name="myexception"/>
<br>查询的结果:
<bean:write name="result"/>
<br>查询的对象的信息:
<bean:write name="resultobject" property="time"/>
<br>request中的一般信息:
<bean:write name="requestinfo"/>
<br>session中的一般信息:
<bean:write name="sessioninfo"/>
<br>application中的一般信息:
<bean:write name="applicationinfo"/>
使用<bean:write>标签完成输出,同样需要引入声明自定义标签库:
<%@ taglib uri="/WEB-INF/struts-bean.tld" prefix="bean" %>
运行过程和运行结果和使用标准标签库完全相同。
3种输出方式的比较
上面的3种方式把JSP的输出信息基本上都包含了,从代码上来看,第一种使用嵌入Java脚本的方式,代码量比较大,并且程序的结构不如后两者清晰,但是也有它的好处,就是非常灵活。
使用标准标签库和Struts标签库,从本质上说没有太大的区别,都是采用自定义标签库来减少界面中的代码,方便用户便写代码。两者在使用的时候也有一些细微的差别。标签标签库与表达式语言结合,代码看起来更简单,并且不管访问什么信息,采用的格式基本上是相同的。但是Struts标签库,在访问page、request、session和application范围内的变量比较方便,并且不需要指定是哪个作用范围内的变量,但是访问Cookie、Header、Parameter信息的时候,就不是非常灵活。
实现条件性的输出
条件性输出,也就是在满足一定条件才输出,或者不输出。条件性输出是比较基本的功能。
假设我们要完成这样的功能:有一个学习网站,某个网页上面显示了一些主题,包括Java、JSP和J2EE相关的多个主题,如果没有任何控制我们将看到最左边的图所示的界面,我们希望进行控制,如果用户选择Java,只显示与Java相关的主题,如果用户选择Jsp,则显示与JSP相关的主题,如果用户选择J2EE则显示与J2EE相关的主题,如果用户不选择,则显示全部主题。下图中间和右边显示了另外两种情况。
在没有添加控制代码之前界面的代码如下:
<%@ page contentType="text/html; charset=GBK" %>
<html>
<head>
<title>
controlleddisplay
</title>
</head>
<body bgcolor="#ffffff">
<h4>
选择性输出测试
</h4>
<h5>Java</h5>
<h6>概述</h6>
<h6>基本语法</h6>
<h6>面向对象编程</h6>
<h6>高级特性</h6>
<h5>JSP</h5>
<h6>概述</h6>
<h6>语法基础</h6>
<h6>JavaBean</h6>
<h6>Servlet</h6>
<h6>JDBC</h6>
<h5>J2EE</h5>
<h6>概述</h6>
<h6>Web应用</h6>
<h6>EJB应用</h6>
<h6>相关服务</h6>
</body>
</html>
下面我们仍然分别采用Java脚本、标准标签库和Struts标签库实现以上功能,希望读者不要考虑这里的逻辑和需求是否合理,主要是介绍怎样进行控制性的输出。
用Java脚本实现条件性的输出
使用Java脚本,主要通过Java语言本身提供的if语句,这个基本语法比较简单,但是对于初学者来说,主要问题,在于Java代码与html代码之间的配合不太好理解。
例如,初学者可能会写下面的代码:
<%
if(para==null||para.length()==0||para.equalsIgnoreCase("java"))
{
<h5>Java</h5>
<h6>概述</h6>
<h6>基本语法</h6>
<h6>面向对象编程</h6>
<h6>高级特性</h6>
}
%>
这样的代码,在运行的时候会报错。因为在脚本(“<%”和“%>”)中只能出现Java代码。
还有一种错误,如果if条件满足的时候,要执行的语句只有一句,可能会写成:
<%
if(para==null||para.length()==0||para.equalsIgnoreCase("java"))
%>
<h5>Java</h5>
同样这时候会出错。怎么处理呢?一个非常简单的方法,分两步走:第一步,不管是Java代码,还是html代码,先按照逻辑写出来,例如:
if(para==null||para.length()==0||para.equalsIgnoreCase("java"))
{
<h5>Java</h5>
<h6>概述</h6>
<h6>基本语法</h6>
<h6>面向对象编程</h6>
<h6>高级特性</h6>
}
第二步,如果是Java脚本使用“<%”“%>”括起来,就可以了:
<%
if(para==null||para.length()==0||para.equalsIgnoreCase("java"))
{
%>
<h5>Java</h5>
<h6>概述</h6>
<h6>基本语法</h6>
<h6>面向对象编程</h6>
<h6>高级特性</h6>
<%
}
%>
下面代码使用Java脚本完成控制性的输出,代码本身不难理解,所以没有给出太多解释。
<%@ page contentType="text/html; charset=GBK" %>
<%@ taglib uri="/WEB-INF/struts-logic.tld" prefix="logic" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<html>
<head>
<title>
controlleddisplay
</title>
</head>
<body bgcolor="#ffffff">
<%
String para = request.getParameter("para");
//通过request的getParameter方法获取用户的控制条
%>
<h4>
选择性输出测试
</h4>
<%
if(para==null||para.length()==0||para.equalsIgnoreCase("java"))
{
%>
<h5>Java</h5>
<h6>概述</h6>
<h6>基本语法</h6>
<h6>面向对象编程</h6>
<h6>高级特性</h6>
<%
}
%>
<%
if(para==null||para.length()==0||para.equalsIgnoreCase("jsp"))
{
%>
<h5>JSP</h5>
<h6>概述</h6>
<h6>语法基础</h6>
<h6>JavaBean</h6>
<h6>Servlet</h6>
<h6>JDBC</h6>
<%
}
%>
<%
if(para==null||para.length()==0||para.equalsIgnoreCase("j2ee"))
{
%>
<h5>J2EE</h5>
<h6>概述</h6>
<h6>Web应用</h6>
<h6>EJB应用</h6>
<h6>相关服务</h6>
<%
}
%>
</body>
</html>
使用标准标签库实现条件性的输出
使用标签库的主要作用也就是把if语句隐藏起来,由标准标签库来实现,我们需要做的是调用标准标签库。
标准标签库中实现条件性输出可以通过<c:if>标签完成的。<c:if>的基本格式如下:
<c:if test=”expression” var=”varname” scope=”scopevalue”/>
或者
<c:if test=”expression” var=”varname” scope=”scopevalue”></c:if>
其中,test后面是逻辑表达式,var用于定义变量,可以把test的结果保存到该变量中,scope指定该变量的作用范围。
下面的就是使用标准标签库中的<c:if>标签实现的条件性输出的完整代码:
<%@ page contentType="text/html; charset=GBK" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<html>
<head>
<title>
controlleddisplay
</title>
</head>
<body bgcolor="#ffffff">
<h4>
选择性输出测试
</h4>
<c:if test="${param.para==null || param.para=='' || param.para=='java'}">
<h5>Java</h5>
<h6>概述</h6>
<h6>基本语法</h6>
<h6>面向对象编程</h6>
<h6>高级特性</h6>
</c:if>
<c:if test="${param.para==null || param.para=='' || param.para=='jsp'}">
<h5>JSP</h5>
<h6>概述</h6>
<h6>语法基础</h6>
<h6>JavaBean</h6>
<h6>Servlet</h6>
<h6>JDBC</h6>
</c:if>
<c:if test="${param.para==null || param.para=='' || param.para=='j2ee'}" var="j2ee">
</c:if>
<c:if test="${j2ee}">
<h5>J2EE</h5>
<h6>概述</h6>
<h6>Web应用</h6>
<h6>EJB应用</h6>
<h6>相关服务</h6>
</c:if>
</body>
</html>
如果是在多个条件中选择的话,可以使用<c:choose>标签,与java中的switch语句的作用非常像。下面是使用<c:choose>实现的完整的代码:
<%@ page contentType="text/html; charset=GBK" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<html>
<head>
<title>
controlleddisplay
</title>
</head>
<body bgcolor="#ffffff">
<h4>
选择性输出测试
</h4>
<c:choose>
<c:when test="${param.para==null || param.para=='' || param.para=='java'}">
<h5>Java</h5>
<h6>概述</h6>
<h6>基本语法</h6>
<h6>面向对象编程</h6>
<h6>高级特性</h6>
</c:when>
<c:when test="${param.para==null || param.para=='' || param.para=='jsp'}">
<h5>JSP</h5>
<h6>概述</h6>
<h6>语法基础</h6>
<h6>JavaBean</h6>
<h6>Servlet</h6>
<h6>JDBC</h6>
</c:when>
<c:when test="${param.para==null || param.para=='' || param.para=='j2ee'}">
<h5>J2EE</h5>
<h6>概述</h6>
<h6>Web应用</h6>
<h6>EJB应用</h6>
<h6>相关服务</h6>
</c:when>
<c:otherwise>
你选择的信息不正确
</c:otherwise>
</c:choose>
</body>
</html>
使用Struts标签库实现条件性的输出
Struts标签库关于判断的标签比较多:
<logic:empty> 判断是否为空
<logic:notEmpty> 判断是否不为空
<logic:present>判断是否存在
<logic:notPresent>判断是否不存在
<logic:match>判断是否匹配
<logic:notMatch> 判断是否不匹配
<logic:greaterThan>判断是否大于
<logic:greaterEqual>判断是否大于等于
<logic:equal>判断是否等于
<logic:notEqual>判断是否不等
<logic:lessThan>判断是否小于
<logic:lessEqual>判断是否小于等于
这些标签的用法基本相同,前面4个判断某个变量存在不存在,某个变量是否为空,后面8个是判断某个变量与某个值之间的关系,关系从标签的名字上能够比较明显的看出。
这些标签的值的来源可以是多种情况:
请求参数,使用parameter确定,例如:
<logic:match value=”zhangsan” parameter=”pp”>
Cookie信息,使用Cookie确定,例如:
<logic:match value=”zhangsan” cookie=”user”>
Header信息,使用Header确定,例如:
<logic:match value=”zhangsan” header=”user”>
page、request、session或者application中的信息,通过name确定,如果是某个JavaBean的属性,通过name和property确定,可以通过scope确定哪个范围内的变量,如果不指定,按照page、request、session和application的顺序找,例如:
<logic:match value=”zhangsan” name=”user”>
<logic:match value=”zhangsan” name=”user” property=”username”>
<logic:match value=”zhangsan” name=”user” property=”username” scope=”request”>
第一行代码,使用user变量与“zhangsan”比较,user变量可能是page、request、session也可能是application中的变量。
第二行代码,使用user对象的username属性与“zhangsan”比较,对象也可能是各种作用范围。
第三行代码,同样使用user对象的username属性与“zhangsan”比较,对象是request作用范围的对象。
下面的代码是使用Struts标签库中的两个标签完成条件性输出的完整代码:
<%@ page contentType="text/html; charset=GBK" %>
<%@ taglib uri="/WEB-INF/struts-logic.tld" prefix="logic" %>
<html>
<head>
<title>
controlleddisplay
</title>
</head>
<body bgcolor="#ffffff">
<h4>
选择性输出测试
</h4>
<logic:notPresent parameter="para">
<h5>Java</h5>
<h6>概述</h6>
<h6>基本语法</h6>
<h6>面向对象编程</h6>
<h6>高级特性</h6>
<h5>JSP</h5>
<h6>概述</h6>
<h6>语法基础</h6>
<h6>JavaBean</h6>
<h6>Servlet</h6>
<h6>JDBC</h6>
<h5>J2EE</h5>
<h6>概述</h6>
<h6>Web应用</h6>
<h6>EJB应用</h6>
<h6>相关服务</h6>
</logic:notPresent>
<logic:present parameter="para">
<logic:match value="java" parameter="para">
<h5>Java</h5>
<h6>概述</h6>
<h6>基本语法</h6>
<h6>面向对象编程</h6>
<h6>高级特性</h6>
</logic:match>
<logic:match value="jsp" parameter="para">
<h5>JSP</h5>
<h6>概述</h6>
<h6>语法基础</h6>
<h6>JavaBean</h6>
<h6>Servlet</h6>
<h6>JDBC</h6>
</logic:match>
<logic:match value="j2ee" parameter="para">
<h5>J2EE</h5>
<h6>概述</h6>
<h6>Web应用</h6>
<h6>EJB应用</h6>
<h6>相关服务</h6>
</logic:match>
</logic:present>
</body>
</html>
查询数据的显示
前面介绍的信息的显示通常都是少量的信息的显示,而很多时候查询到的数据是批量的,这时候我们就必须使用循环来处理,我们可以使用在JSP嵌入Java脚本的方式嵌入for循环,或者while循环,同时在JSP的标准标签库中也提供了相应的标签来实现循环的功能,现在比较成熟的Struts中提供了相应的标签。
这一节内容,我们仍然通过这3种方式来分别实现对批量数据的显示。在开始具体的数据显示之前,我们需要进行一些准备工作,准备工作主要的目的就是获取要显示的数据,如果你对数据获取本身不感兴趣,可以跳过前面的准备工作部分,但是需要知道在显示之前,request中应该有ArrayList对象,名字是books,里面的对象类型是Book,有4个属性:bookid,bookname,price和author,其中只有price是float类型,其它都是String类型。
具体的准备工作包括以下几个方面:
(0)声明:因为此处的内容主要关注显示,所以其它代码中可能会存在不合理的地方。
(1)数据库准备:使用mysql数据库
创建数据库:数据库名字是webtest。
创建表:图书表,表结构如下:
create table book
{
bookid varchar(10) primary key,
bookname varchar(50),
price float,
author varchar(10)
}
(2)创建工程,使用Eclipse或者JBuider都可以。
(3)创建Web应用,这里Web应用的名字是display,选择使用Struts1.2和JSTL。
(4)创建一个初始界面index.jsp,非常简单,代码如下:
<%@ page contentType="text/html; charset=GBK" %>
<html>
<head>
<title>
index
</title>
</head>
<body bgcolor="#ffffff">
<h1>
<a href="findAction.do">查看所有图书</a>
</h1>
</body>
</html>
完成的主要功能就是通过超链链接到查询图书信息的Action。
(5)创建管理数据库连接的JavaBean,这里使用了包com.li.bo。
package com.li.bo;
import java.sql.*;
public class DBHelper {
private String dbdriver = "com.mysql.jdbc.Driver";
private String url = "jdbc:mysql://localhost:3306/webtest";
private String user = "root";
private String pass = "";
private Connection con;
/*
public DBHelper(String dbdriver,String url,String user,String pass)
{
this.dbdriver = dbdriver;
this.url = url;
this.user = user;
this.pass = pass;
}
*/
public Connection getConnection()
{
try {
Class.forName(dbdriver);
con = DriverManager.getConnection(url,user,pass);
}
catch(Exception e){System.out.println(e.toString());}
return con;
}
public void releaseConnection()
{
try {
con.close();
}
catch (SQLException ex) {
}
}
}
(6)创建业务模型Book,包名是com.li.bo。
package com.li.bo;
import java.util.*;
import java.sql.*;
public class Book implements java.io.Serializable
{
private String bookid;
private float price;
private String author;
public Book(){
}
public static ArrayList findAllBooks()
{
ArrayList books = new ArrayList();
//保存所有图书
DBHelper dbh = new DBHelper();
//创建数据库连接Bean
try
{
Connection con = dbh.getConnection();
//获取连接
Statement stmt = con.createStatement();
//创建语句对象
ResultSet rs = stmt.executeQuery("select * from book");
//查询然后获取结果集
while(rs.next()) //对结果集进行遍历
{
String bookid = rs.getString(1);
//获取书号
String bookname = rs.getString(2);
//获取书名
bookname = new String(bookname.getBytes("8859_1"));
//对书名进行编码转化,因为数据库中的编码是8859_1,如果是gb2312,就不需要转换了
float price = rs.getFloat(3);
//获取图书价格
String author = rs.getString(4);
//获取图书作者
author = new String(author.getBytes("8859_1"));
//对作者进行编码转化
Book b = new Book(bookid,bookname,price,author);
//根据这些信息构造图书对象
books.add(b);
//把图书对象添加到图书列表中
}
rs.close();
stmt.close();
dbh.releaseConnection();
}catch(Exception e)
{System.out.println(e.toString());}
return books;
//返回图书列表
}
public Book(String bookid,String bookname,float price,String author)
{
this.bookid = bookid;
this.bookname = bookname;
this.price = price;
this.author = author;
}
private String bookname;
public void setBookid(String bookid) {
this.bookid = bookid;
}
public void setBookname(String bookname) {
this.bookname = bookname;
}
public void setPrice(float price) {
this.price = price;
}
public void setAuthor(String author) {
this.author = author;
}
public String getBookid() {
return bookid;
}
public String getBookname() {
return bookname;
}
public float getPrice() {
return price;
}
public String getAuthor() {
return author;
}
}
该代码的主要作用是封装图书信息,其中有一个业务方法findAllBooks用于查询数据库中所有的图书,然后以集合的方式把图书列表返回,而不是返回结果集,如果返回结果集,对数据库的连接时间会比较长。
(7)创建查询Action,功能比较简单,代码如下:
package com.li.action;
import com.li.bo.*;
import java.util.*;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.action.ActionForm;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.Action;
public class FindAction
extends Action {
public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request,
HttpServletResponse response) {
ArrayList books = Book.findAllBooks();
//查询图书信息
request.setAttribute("books",books);
//把图书信息保存到request对象中
return mapping.findForward("success");
//选择界面对用户进行响应
}
}
主要功能,调用业务模型Book的静态方法findAllBooks获取所有的图书列表,然后把这个信息保存在request对象中,最后选择结面对用户进行响应。
(8)修改配置文件struts-config.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.2//EN" "http://struts.apache.org/dtds/struts-config_1_2.dtd">
<struts-config>
<action-mappings>
<action path="/findAction" type="com.li.action.FindAction">
<forward name="success" path="/test.jsp" />
</action>
</action-mappings>
<message-resources parameter="ApplicationResources" />
</struts-config>
需要注意的是<action>的配置,path是“/findAction”,就是我们在index.jsp中编写超链的时候使用的名字,另外配置了一个<forward>元素,name属性是success,path是/test.jsp,success是Action中所使用的响应的界面的别名,test.jsp就是用于显示数据的界面。至此我们的准备工作就完成了,虽然比较麻烦,但是如果没有以上这些准备工作,下面的内容就没有办法运行。
使用Java脚本的方式显示数据
因为Java脚本与html代码之间的交叉比较多,所以这个过程我们比较详细的介绍。
首先,我们要知道最终要显示成什么效果,下面就是我们最重要显示的结果,里面的信息都是静态的:
表格对应的代码如下:
<table border="2" align="center" width="70%">
<thead align="center">
JAVA WEB实现图书管理系统 —— 主页面图书信息显示 图书信息显示页面如下: 一、编写Book类,封装图书的信息 package entity; public class Book { private String id; private String name; private String price; private String num; private String type; public Book() { super(); // TODO Auto-generated constructor stub } public 阅读详情

相关推荐

Java Web 开发入门与实践

本文是一篇关于JavaWeb开发的入门与实践指南,详细介绍了JavaWeb开发的基础知识、开发环境搭建、核心概念、常用框架以及开发实践中的常见问题与解决方案。文章首先强调了Java基础和Web基础的重要性,然后详细讲解了如何搭建JavaWeb开发环境,包括开发工具、服务器和依赖管理工具的使用。接着,深入探讨了Servlet、JSP和MVC模式等JavaWeb开发的核心概念,并介绍了SpringFramework、MyBatis和Hibernate等流行框架

哎 你看的博客 1193

Java实战:Web实时消息推送技术

本文作为优快云 Java专家博主的分享,将深入探讨Web实时消息推送的底层原理、主流技术选型以及基于Java实现的具体示例,以帮助开发者构建高效稳定的实时推送系统。

oandy0的博客 5599

Java Web实现的学生信息管理实践项目

本文还有配套的精品资源,点击获取 简介:学生信息管理系统是一个基于Java Web技术的综合性项目,通过MVC架构模式实现高效的学校学生信息管理和查询。系统利用Ajax技术提升用户体验,实现了学生信息的动态增删改查。同时,该系统还包含数据库设计文档和源代码包,为开发者提供了完整的Java Web开发流程参考。 1. Java Web技术应用 1.1 Web应...

weixin_42575109的博客 861

java实现在web页面实时展现内容

实时展现内容,就像tail -f命令的功能一样,可能不同的人有不同的表述方法,但是其实是殊途同归。 我想在网页上实时展示服务器上某个日志文件(内容随时在变化)的变化,怎么做呢?是有这样的场景的,再比如,我现在需要点击一个按钮执行服务器上的一个shell脚本,脚本会把执行过程中的信息输出到一个文件sh.log中,我现在需要实时展示sh.log的内容,跟上面的那个日志文件也是一个道理。 实现思路:...

xiaozhuangyumaotao的博客 2124

2023-11-20 MySQL ARM64 银河麒麟

背景 MySQL是常用数据库,Windows安装比较容易,笔者也有记录。现在国产化系统银河麒麟中安装,不同的是软件安装包不容易下载。一是安装的方式,再一个是MySQL本身的版本,网上很多文档说明其实都是对的,但是为什么那么多都不一样呢?就是MySQL本身的版本差异比较大,这些差异笔者也不是很清楚,但是不要用8和5.7的差异非常大,8即使安装的很顺利,在使用过程也会很多坑,导致我宁愿卸载8,也要重新...

jxmh1991@163.com 811

详解Σ-Δ型ADC拓扑结构的基本原理

现在,总环路滤波器的H(f)具有更大的滚降,Mod 2型的噪声传递函数具有40 dB/十倍频程的上升速率。同样,当正弦波输入为负满量程时,+1和–1之间的转换会减少,输出以–1为主。噪声传递函数是一个高通滤波器函数,提供噪声整形,在DC附近的较低频率,对量化噪声有很强的抑制。H(f)是环路滤波器的函数,定义噪声和信号的传递函数。Σ-Δ型ADC的噪底由热噪声决定,而不受量化噪声的限制。量化噪声为量化器的输入与输出之差。图5. Mod 1 Σ-Δ环路的线性模型(b),包括方程、滤波器、信号和噪声传递函数图。

qq_43416206的博客 1810

基于Java Web的“使用Ajax实现无刷新实时显示公告信息”实验

学习和掌握jQuery获取网页元素对象的格式。使用JDBC进行数据库的连接以及使用Statement对象执行SQL查询语句。掌握使用Properties类加载Properties文件中参数的方式。使用$.get方法向服务器发送请求以及获取服务器中的数据。.properties文件是ideal生成的文本文件,用于存储数据库连接等配置信息。在创建和编辑配置文件时,需要遵循特定的格式要求,并注意保护敏感信息的安全性和提高配置文件的可维护性。jQuery是一个快速、小巧、功能丰富的JavaScript库。

2301_79218588的博客 895

ENVI遥感技术

记录2024.03.06所遇到的遥感问题

qq_44453923的博客 4332

Java发布公告的实现流程

Java发布公告的实现的详细流程。

m0_72958694的博客 1230

ThingsBoard 3.1.1版本在window本地运行之TB-Gateway服务搭建(三)

TB-gateway服务是TB不可或缺的部分,很多的协议都需要TB-gateway来做分类处理,今天我们就来做TB-Gateway服务搭建。

晚点遇见你,余生都是你! 2475

halcon 检测直线

图中后三个对象既是检测出的图像;

qq_59062726的博客 666

实现数据库中信息在网页显示

文章目录一、java读取数据库中信息1、java中定义类存放数据库记录2、JDBC读取数据库信息二、web网页显示信息内容1、在java页面跳转到.jsp文件展示数据2、设置网页界面显示三、显示结果 一、java读取数据库中信息 1、java中定义类存放数据库记录 package com.study.web.entity; public class Book { private Integer id; private String name; private String publ

m0_51649818的博客 1万+

2、MOSFET基本物理效应及其BSIM4模型解析

本文深入探讨了MOSFET的基本物理效应及其在BSIM4模型中的数学表述,涵盖门和沟道的几何结构、温度依赖性、材料模型选项、阈值电压计算、以及其他关键物理效应如LDD电阻、有限电荷厚度、有效迁移率等。同时解析了机械应力、邻近效应及布局依赖效应对MOSFET性能的影响,并通过参数表和建模流程提供了精确建模的指导,旨在帮助读者优化MOSFET器件性能与可靠性。

purple的博客 566

Java Web学习十二:商品列表的显示

Java Web学习十二:商品列表的显示一:案例分析二:创建商品数据库&连接IDEA三:前期准备工作四:创建实例对象domain和Servlet五:jsp页面动态操作 一:案例分析 最核心的思想就是在Servlet中获取到数据库的数据,然后放到一个List集合中 通过request域存储数据,然后发送到对应的jsp页面,页面通过request拿取数据 jsp再进行动态的显示商品信息。 二...

rnang0的博客 1665

yolov26改进 | 检测头篇 | 利用渐近特征金字塔网络AFPN改进yolov26检测头融合P2网络结构(让小目标无所遁形,全网独家首发)

本文介绍一种基于AFPN渐近特征金字塔网络改进的YOLOv26四检测头Detect_FPN。AFPN通过逐级融合底层细节、中层结构与高层语义特征,缩小不同尺度特征之间的语义差距,减少直接融合带来的信息冲突,使检测头获得更稳定、更充分的多尺度表达。本文进一步增加高分辨率小目标检测分支,强化对微小目标、密集目标和复杂背景目标的感知能力,适合工业缺陷、遥感及无人机等场景。文中将展示基础模型与改进模型的训练对比结果,并提供完整代码、配置文件、模块注册方法及Codex修改思路,方便直接复现和二次创新。

Snu77的博客 373

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

Java Web可视化实践项目

Java Web可视化实践指导书

二哈喇子! 1366

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

JAVA WEB----显示数据库用户列表信息

我们要在网页管理系统中查询数据库user的成员信息 第一步:在pom中插入fastjson <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.68</version> </dependency>

a1422346935的博客 3230

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

java怎么做一个图片管理程序_Java Web实践专题——图片管理

在一个网站中可能会存在大量的图片,有些图片对于所有的网页是相同的,例如网页的LOGO,主页中的图片,这些图片就像普通的html文件一样,这些图片的处理通常使用网页编辑工具来完成的,也就是说通常是由美工完成的。主要使用下面的html标签: 其中src指定文件的路径,使用相对路径,通常我们会在web应用中专门创建一个文件夹images存放所有的图片。这些图片的处理一般不需要Java程序员管理。还有一些...

weixin_39966765的博客 547

用JAVA实现大文件上传及显示进度信息

用JAVA实现大文件上传及显示进度信息 ---解析HTTP MultiPart协议  (本文提供全部源码下载,请访问 http://c7.gg/cdpA6)   一. 大文件上传基础描述:   各种WEB框架中,对于浏览器上传文件的请求,都有自己的处理对象负责对Http MultiPart协议内容进行解析,并供开发人员调用请求的表单内容。 比如: Spring 框架中使用类似Comm...

bcuidenghong的专栏 1893

web程序_通过学号查询学生信息_笔记

在之前的博客中我写过关于简易的查询四级成绩的web程序,在这里,我们连接了数据库,写一个通过输入学生的学号查询学生成绩的web小程序。 其实这是非常简单的,大体就是在之前的小程序上加了一个jdbc,从显示随机数到显示数据库中的内容。两个程序大部分内容相似度还是非常高的,就是在选择继承或者实现servlet类/接口方面发生了改变。四级是实现Servlet接口,学生信息查询是继承HttpServlet...

General_Ma的博客 7659
上一篇: Java Web实践专题——信息查询方式总结
下一篇: Java Web实践专题——应用分层
Java_Web_Book
博客等级 码龄18年 8粉丝 3原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值