`
ihuashao
  • 浏览: 4721903 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

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
查询的对象的信息:现在是:200629
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%">

相关推荐

    java面试——Nginx面试专题.zip

    本面试专题主要围绕Nginx的基础概念、功能特性、配置与优化以及其在Java应用中的作用展开。 Nginx是一款高性能的Web服务器和反向代理服务器,它以其轻量级的进程模型、高效的异步非阻塞I/O处理能力而闻名。Nginx的...

    java面试——Spring面试专题.zip

    在Java开发领域,Spring框架是不可或缺的重要组成部分,它极大地简化了企业级应用的开发工作。...理解并掌握以上知识点,将有助于你在Java面试中脱颖而出,展示出对Spring框架的深入理解和实践经验。

    专题一——专题九的练习题及答案.rar

    《专题一——专题九的练习题及答案》这个压缩包文件包含了从专题一开始到专题九结束的完整练习题目和对应的解答。这样的资源对于学习者来说是极其宝贵的,它提供了全面的复习材料,帮助巩固和检验在各个专题学习中的...

    java面试——SpringMVC面试专题.zip

    SpringMVC是Java web开发中的一个核心框架,它在企业级应用中被广泛使用,因此在面试中,对SpringMVC的理解和掌握是衡量开发者能力的重要标准。本篇将深入探讨SpringMVC的相关知识点,帮助你更好地准备Java面试。 1...

    地理信息系统二次开发教程——语言篇1

    《地理信息系统二次开发教程——语言篇1》是针对地理信息系统(GIS)的深入学习与实践指导,主要聚焦于GIS的编程和定制化开发。在这一领域,开发者利用特定的编程语言来扩展GIS的功能,实现对地理数据的高效管理和...

    实习 报告 jsp java

    该系统有助于提高信息发布的效率,方便用户获取信息,同时也是对Java Web技术的一次深入实践,有助于提升开发者的综合技能。 4.2 新闻发布系统概述 4.2.1 功能需求概述 系统需实现新闻的发布、修改、删除,用户的...

    Java培训教程,PPt版本的.

    Java是一种广泛使用的高级编程语言,尤其在企业级应用开发领域占据主导地位。这份"Java培训教程,PPt版本的"包含...每个PPT文件都代表了一个专题,通过深入学习和实践,可以逐步掌握Java编程的各个环节,提升开发能力。

    Java思维导图

    Java编程是一种广泛使用的高级编程语言,...通过这些思维导图,开发者可以系统地梳理和学习Java的核心概念、最佳实践以及最新发展。它们是学习和复习Java知识的有效工具,帮助程序员构建一个清晰、全面的Java知识体系。

    基于学生核心素养的高职课程体系研究——以电子信息工程技术专业为例 (2).pdf

    2. 引入新技术课程:针对互联网+和智能制造的需求,增设嵌入式系统、Android应用开发、Java编程等课程,配套实践课程以提升新技术应用和创新能力。 3. 拓宽知识领域:开设Web数据库、3D打印技术、物联网前沿科技、...

    JSP&WEB;\06-09

    \06-09" 暗示这是一个关于Java Server Pages(JSP)和Web开发的专题,可能是一个课程、教程或项目的第6到第9部分的内容。在这个主题中,我们将深入探讨JSP的核心概念、Web应用程序的开发以及这两者如何协同工作来...

    IntelliJ IDEA 简体中文专题教程.pdf

    2. **Java Web项目环境搭建**:指导用户在Eclipse中搭建Java Web项目的环境。 3. **Maven项目搭建**:详细解释了使用Maven构建Java项目的步骤和关键点。 #### 调试与重构技巧 1. **Debug技巧**:介绍了IDEA中的调试...

    java学习网站

    ### Java学习网站:基于Struts2的专题学习 ...通过上述内容的学习与实践,参与者不仅能够掌握Struts2框架的基本使用方法,还能了解到如何进行Web应用的设计与开发,最终实现一个功能完善的Java专题学习网站。

    javaee经典学习资料大全

    Java EE(Java Platform, Enterprise Edition)是Java SE(Java Platform, Standard Edition)的扩展,主要用于开发企业级应用,包括了多种技术和API。对于Java EE的学习,以下知识点是根据提供的文件内容整理出来的...

    面向开发人员之ASP.NET开发技术系列课程(6):JSP Tab Library开发人员篇——ASP.NET技术介绍

    【标题】:“面向开发人员之ASP.NET开发技术系列课程(6):JSP Tab Library开发人员篇——...通过深入学习和实践这些知识点,开发者不仅能提升个人技能,还能更好地应对实际工作中面临的挑战,实现高效的Web应用开发。

    xfire+spring+webservice+client

    标题中的“xfire+spring+webservice+client”是一个关于集成XFire、Spring框架和Web服务客户端的专题,这涉及到Java开发中的一项重要技术——Web服务的消费与提供。在这个主题下,我们将深入探讨以下几个核心知识点...

    CSDN社区电子杂志

    例如“Struts最佳实践”、“J2EE Web框架汇总”等专题深入探讨了Java Web开发的各个方面。 - **Web技术**:包括了对Web技术发展历程的回顾,如“Web技术史话”,以及对特定技术如Servlet规范的介绍。 - **框架和技术...

    Struts2_OGNL

    Struts2_OGNL是一个关于Java Web开发框架Struts2中的一个重要组件——OGNL(Object-Graph Navigation Language)的讨论。OGNL是Struts2的核心表达式语言,它用于在Action对象和视图之间传递数据,提供了强大的数据访问...

    学习方法归纳

    ### 学习方法归纳——Java学习策略 #### 标题解析 标题“学习方法归纳”指的是一种系统化的学习方式汇总,旨在帮助学习者高效掌握某一领域的知识与技能。本篇着重于Java编程语言的学习方法。 #### 描述解析 描述中...

    ASP毕业LW管理系统的设计(源代码+LW).zip

    《ASP毕业设计——LW管理系统的设计与实现》 在信息技术高度发达的今天,软件系统已经渗透到各行各业,其中教育领域的管理系统的开发尤为重要。本压缩包中的"ASP毕业LW管理系统"是一个基于ASP(Active Server Pages...

Global site tag (gtag.js) - Google Analytics