用JSTL简化Java Web开发

用JSTL简化Java Web开发


2024年4月9日发(作者:)

维普资讯

… 

_En_0RI&C0l_l_U_I哪ION 一 . … 、… …,……… … …… … …… .… ………….…… …… 

一 

用JSTL简化Java Web开发 

徐翔斌 

~ 

如 

一 

摘要本文在介绍JSTL的安装、功能和使用方法的基础上,以某系统的图书管理模块为 

例,详细说明如何运用JSTL进行快速Java Web开发。 

关键词 JSTL,JST,图书管理 

JSTL是Apache的一个开源项目,它是为解决传统JSP文 

件在数据表示、逻辑控制和数据库访问等方面的不足而提出的 

的标签库描述符(TLD)文件中指定。如果使用的是符合JSP 

1.2/Servlet 2.3的容器,比如Tomcat 4.x或者更高,可以在 

JSP页面的tag ̄b指令中使用绝对路径。因此,只要在需要使 

用JSTL的JSP文件的开始加入以下语句: 

<%@taglib prefix= C uri= http://java.sun.com/jsp/ 

jstl/core %> 

<%@taglib prefix= fmt uri= http://java.sun.com/jsp/ 

jstI/fmt %> 

个有效的解决方案。编写过JSP应用程序的程序员都知道, 

传统的JSP文件是采用HTML标记中嵌入Java Scriptlet的方式 

来实现的,使得JSP文件中包含大量的Java代码,这~一方面造 

成页面内容的臃肿、难以维护,另一方面使得JSP程序员和美 

工之间的交流十分困难。JSP文件的这些缺陷催生了对解决类 

似通用问题的独立标记库的需求。在Java Community Process 

<%@tag“b prefix= sql uri= http://java.sun.com/jsp/ 

jstl/sql %> 

<%@taglib prefix= fn uri= http://java.sun.com/jsp/ 

jstl/functions %> 

(JSR 52)的赞助下创建了JSTL(JavaServer Pages Standard Tag 

Library,JSP)标准标记库,为解决这些通用功能提供一个单 

的标准解决方案。 

就开始使用JSTL。 

下载和安装 

要使用JSTL,首先必须到apache的官方网站下载JSTL的 

二、主要功能 

JSTL是一个在不断开发和完善的开放源代码的JSP标签 

库,它支持多种标签,在开发中常用的有以下4种标签,如下 

表所示。 

JSTL中常用的四种标签 

标签 

NOTICE 

安装包(下载地址:http://jakarta. apache.org/site/down— 

loads/downloads

taglibs—standard.cgi),JSTL目前的最高版本 

_

是JSTL1 1版,笔者建议下载经过编译的二进制(Binary)包 

文件。下载后解压,得到图1所示的目录结构。 

j j j 

doc javadoc lib ttd 

翌 

LICENSE 

UIL 

hItp://java.8m ∞ jgl】, 

c魄e 

默认前缀 主要功能 

支持J 常用的 

基本操作 

ore标签 

Database 8class htlp://ja,a 8m ∞ jst】, 

( Q )标签 

I18N ent ̄le http://ja,,a.f;I.a'l  ̄,./jstV 

hn∞面g标签 rift 

ir

ft 

支持J 对数据 

库的操作 

支持对 页面 

的国际化操作 

支持J 对XML 

文档的处理 

图1 jakarta—taglibs—standard一1.1.2目录结构 

XML ∞e8曲 

标签 

htp://java.Sial e0叫8t】, 

xm1 

doc目录下是使用说明文档,javadoc目录是API的说明文 

档,lm目录下有jst1.jar和standard jar两个类库,它们处理标 

JSTL标签库功能十分强大,本文只是介绍一些最常用的 

标签的使用方法。 

1.获取请求参数 

在JSP中,获取表单递交的请求参数是通过re— 

quest.getparameter(“attribuatename”)语句来处理的,这在表 

单提交的数据域比较多的时候显得非常烦琐,而JSTL提供一 

种非常简洁的方式: 

记库的解析。tld目录下所有以 tld后缀的文件就是JSTL的标 

志库文件。 

安装JSTL过程比较简单,将解压后l 目录下的istl iar 

和standard jar两个类库拷贝到应用程序的/WEB—INF/lib目 

录下就可以了。从Servlet 2 3后,标签库的绝对URI在该库 

维普资讯

‘ l…………一……。’…… ’’…………一………一……。 

实用第一 智慧密集 

… … …… ……………… …… ……… .。… …… 

¥{param,name}和¥{paramValues.name} 

( bookdelete ){ 

) 

%> 

需要说明的是,JSTL采用一种表达语言(Expression I.an— 

guage,简称EL),EL表达式都被¥ll括起来,param和param— 

values分别是在EL中定义的两个内置对象。它们的功能等同 

于JSP中的request.getParameter(Stirng nalne)和re— 

2)<c:choose>标签 

<c:choose>标签用来选择判断,它有两个子标签<c: 

when>和<c:otherwise>,其典型的用法是: 

<c:choose> 

quest.getParameterValues(Stirng nalne),分别用来获取单个和数 

组类型的请求参数。 

JSTL其他常用的内置对象还有header和headerValues,它 

<c:when test= ¥{param action== bookdelete ) > 

</c:when> 

们等同于JSP中的request.getHeader(stri“g nanle)和re— 

quest.getHeaders(Stirng nalne),用于获取请求头的信息。 

关于EL中定义的其他的内置变量及其使用方法,读者可 

<c:whentest= ¥{param.action== bookadd ) > 

</c:when> 

以参考JSTL的官方文档和相关的技术手册进行学习和使用。 

2.Core标签库主要用法 

<c:otherwise> 

</c:otherwise> 

</c choose> 

(1)通用标签 

1)<c:0ut>标签 

<c:out>/ ̄签用于在JSP中显示数据,它的典型用法是: 

<c:out value=”¥{username}”/> 

相当于JSP中的: 

<%if(request getParameter(“action”).equal 

它相当于JSP中的 

request,setAttribute( username , JSTL ) 

<%out。println(request.getAttribute( username ):%> 

(“bookdelete”){ 

)else if(request.getParameter(“action”).equal(“bookadd”) 

{ 

需要注意的是:显示username的值默认是从request(page) 

中取,如果request中没有名为username的对象,则从session 

中取,session中没有,则从application(servletContext)中取。如 

果没有取到任何值,则不显示。 

2)<c:set>标签 

)else{ 

) 

%> 

, 

(3)循环控制标签 

1)<c:forEach>标签 

<c:set> ̄签用于保存数据,它的典型用法是: 

<c:setvalue= JSTL var= test scope= session /> 

<c:forEach>标签用于循环读取数据集合中的数据,它是 

相当于JSP中的 

<%request.getSession().setAttribute( test . JSTL ):%> 

JSTL中最常用的一种标签。其典型用法如下: 

<c:forEach items=“¥{datas)”var=“var”> 

<c:outvalue=“Svar)”/> 

</c:forEach> 

它在session中设置test属性,值为JSTL。 

3)<c:remove> ̄签 

<c:remove>标签用于删除<c:set>标签设置的数据,用法 

如下: 

<c:remove var= test scope= session /> 

在这里,¥{datas}指的是放置在request或者sessioD中的数 

据集合,它可以是数组、链表、向量、集合等。它相当于JSP 

中的: 

request.getSession().setAttribute( datas ,datas): 

<% 

相当于JSP中的 

<%request.getSession【).removeAttribute l test ):%> 

for IintI-O:i<datas.size():i++)【 

out.println(datas,get(i)): 

) 

%> 

它从session中删除test属性。 

(2)流控制标签 

I)<c:if>标签 

在这里datas是一个java.util.Vector对象,里面存放的是 

Stirng数据,var是当前循环条件下String对象。可以看出,采 

用<c:forEach>标签进行循环遍历操作非常方便、简洁,<c: 

forEach>标签还可以控制循环的步长,可以参考JSTL的相关文 

档。 

2)<c:redirect>J( ̄签 

<c:if>标签用来条件判断,其典型用法是: 

<c:iftest= ¥{param.action== bookdelete ) > 

</c:if> 

相当于JSP中的: 

<%if(request.getParameter( action ).equal 

毫■■毫技巧与簟 

维普资讯

 -+ t

_E咖矗X&COMMUNiC盯ION- …… , .一.. ………………… . …一………… .……… …………… 

</sql:update> 

<c:redirect>标签用于页面的转发,用法如下: 

<c:redirect url= bookdisplay.isp ></c:redirect> 

将需要执行的SQL语句传递给<sqhupdate>标签,同时将 

执行参数传递给<sqh update>的<sq[iaram>子标签就可以 

了。<sqhparam>子标签中参数的顺序必须与SQL语句中 

“?”的数序一致。删除数据和更新数据的<sqh update> ̄n 

下: 

<sql:update dataSource: ¥{bookdb} > 

delete frOm book where bookid=7 

就会自动将用户请求转发到bookdisplay.jsp页面。 

3.SQL标志库基本用法 

(1)<sql:setDataSource>标签 

<sqh setDataSource/>) ̄签用来设置数据源。用法如下: 

<sql:setDataSource 

var= bookdb 

driver= net.sourceforge.jtds.jdbc.Driver 

url= jdbc:jtds:sqlserver://Iocalhost:1 433;Database— 

<sql:paramvalue= ¥{param.bookid} /> 

</sql:update> 

Name=book 

user= sa 

password= ecjtu 

scope= application 

/> 

这里的driver、url、user、password属性分别是数据库驱 

动、数据库连接字符串、登录名和登录密码。<sqh setData— 

Source>标签将建立的数据源放置在var属性中(在这里是 

bookdb),供后续<sqh query>和<sqh update> ̄签使用。 

<sqh setDataSource>有一个scope属性,其值可以设置为 

page、session、application等,分别表示将该数据源存放在 

pageContext、Session和ServletContext中。scope=”application” 

意味着该数据源存放在ServletContext中,可以供应用程序所 

有JSP页面中JSTI 的<sqh query>和<sqh update>) ̄签使用。 

(2)<sqh queyr>标签 

<sqh query>用来进行数据的查询,用法如下: 

<sql:query var: results dataSource= ¥{bookdb) > 

select frOm COUrses 

</sql:query> 

<sqh quer)r>使用十分简单,将<sql:setDatasUurce>标签设 

置好的数据源传递给它的dataSource属性,然后将执 查询的 

SQL语句传递给它就可以了。<sqlqueyr>将查询得到的数据 

集放置在var属性中(在这里是results),这时候多半是用< 

C forEach>标签来循环遍历查询的结果(也就是results变 

量)。如下所示: 

<c:forEach var= row items= ¥{results.rowsBylndex) > 

<c:outvalue= ¥{row【0】) /> 

<c:outvalue= ¥{row【1】) /> 

</c:forEach> 

(3)<sqh update>标签 

<sqh update>标签用来进行数据的删除、更新、插入、设 

置创建数据表的SQL操作,它的典型用法如F: 

<sql:update dataSource= ¥{bookdb) > 

insert into book values(?,?) 

<sql:param value= ¥{param.bookid) /> 

<sql:paramvalue= ¥{param.bookname) /> 

<sql:updatedataSource= ¥{bookdb} > 

delete fr0m book where bookid=7 

<sql:param value= ¥{deleteid) /> 

</sql:update> 

4.I18N标志库 

I18N标志库的标志前缀一般用fmt。它主要是用来解析和 

格式化数字和E1期。 

(1)<fmt:formatNumber>标签 

<fmt:formatNumber>标签用来格式化数据。它的典型用法 

是: 

<fmt:fOrmatNumbervalue= 3456 789 type= 

currency var= price /> 

其中,type属性可以指定为currency、percent、number类 

型,<fmt:formatNumber>标签根据指定的类型对value属性中 

的值进行格式化,并将格式化的结构放置在var变量中。在本 

例中调用 

<c:outvalue= ¥{price) /> 

在页面输出的结果是¥3,456 79 

(2)<fmt:parseNumber>标签 

<fert:parseNumber>标签用来解析指定格式数据,它的典 

型用法是: 

<fmt:parseNumber value= ¥3.456.79 type= 

currency var= parsedNumber />  .

它的作用相当于<fmt:formatNumber>逆过程,从¥3,456.79 

提取价格数据,放置在var变量中。在本例中,调用<c:out 

value=“¥{parsedNumber}”/>,在页面输出的结果是 

3456 79。 - 

(3)<fmt:formatDate>和<fmt:parseDate>标签 

<fmt:formatDate>和<fmt:parseDate>标签使用分别同< 

fert:f0rmatNumber>和<fert:parseNumber>相似,读者可以参考 

JSTL的使用文档。 

三、开发实例 

在熟悉了JSTL的基本功能和常见用法之后,笔者以最近 

参与开发的一个信息系统为例,详细介绍如何应用JSTL进行 

Java Web开发。 

维普资讯

实用第一 智慧密集 

限于篇幅,笔者对该项目进行适当的简化,就是完成某单 

位图书管理过程中对图书的增、删、查、改等基本功能。这些 

功能虽然简单,却是绝大多数信息系统的基本要求和常见功 

能。笔者在开发过程中,考虑到项目的开发周期和开发成本, 

并没有采用常用的Sturts、Spring、Hibernate来开发一个分层的 

J2EE系统,而是采用JSTL标志库,用JSP页面作为显示逻辑 

和业务逻辑来完成系统的开发。整个图书管理模块(简化后) 

由index.jsp、bookdisplay.jsp、bookadd.jsp、bookedit.jsp4个页 

面组成。页面之间的导航关系如图2所示。 

批量删除 

图2图书管理模块页面组成和导航关系图 

1.数据库设计 

在SQLSERVER2000中新建一数据库book,并添加book 

和booktype表,创建表的SQL语句如下: 

CREATETABLE【dbo】.【book】( 

【bookid】【int】IDENTITY(1。1)NOTNULL。 

【booktypeid】【int】NULL, 

【booknameI【varchar】(50)COLLATE Chinese PRC—CI—AS 

NULL. 

【bookisbn】【varchar】(50)COLLATE Chinese PRC

CLAS 

NULL. 

【bookbarcode】 lvarchar】 (5O) COLLATE Chi— 

nese

_

PRC

CI S NULL, 

【bookpubtime】【datetime】NULL, 

【bookpubhouse】 【varchar】 (50) COLLATE Chi— 

nese

PRC_cI S NULL, 

【bookprice】Ivarchar】(50)COLLATE Chinese RC_j:l S 

NULL. 

【bookauthorl【varchar】(50)COLLATEChinese_PRC_cI S 

、 NULL. 

【bookinfo】【varchar】(200)COLLATE Chinese—PRC—CLAS 

NULL 

)0N【PRIMARY】 

GO 

CREATETABLE【dbo】【booktype】( 

【booktypeidl【int】IDENTITY(1,1)NOTNULL, 

I booktypename】 I varchar】 {50) COL E Chi— 

nese—PRC LAS NULL 

)0N【PRIMARY】 

2,..薯=‘2 ;0-_0囊7.交12舀

与t 

G0 

ALTERTABLE【dbo】.【book】ADD 

CONSTRAINT【FK_book_booktype】FOREIGN KEY 

( 

【booktypeid】 

)REFERENCES【dbo1【booktype】( 

【booktypeid】 

) 

GO 

2.建立book应用程序结构 

创建book应用程序,将JSTL的两个必需类库jst1.jar, 

standard.jar和sQLsERVER2o0O的数据库驱动类库jtds— 

1.0.3.jar拷贝到book应用程序的/WEB/lib目录下,在book 

应用程序的根目录新建index.jsp、bookdisplay.jsp、 

bookadd.jsp、bookedit.jsp4个文件。 

(1)index.jsp文件 

index.jsp是book应用程序的默认页面,内容如下: 

<%@page language= java contentType= text/html; 

charset=GBK %> 

<%@taglib prefix= c uri= http://java.sun.com/jsp/ 

jstl/core %> 

<%@taglibprefix= sql uri= http://java.sun.com/jsp/ 

jstl/sql %> 

<!一一设置数据源一一> 

<sql:setDataSOurce 

driver= net.sourceforge.jtds.jdbc.Driver 

url= jdbc:jtds:sqlserver://Iocalhost:1433;Database— 

Name=book 

user=”sa 

password= ecjtu 

scope= application 

var= bookdb 

/> 

<c:redirect url= bookdisplay.isp ></c:redirect> 

当用户登录book应用程序,默认的index.jsp文件先利用 

<sql:setDataSource>标志设置数据源,并将它放置在整个应用 

程序范围(ServletContext)中的名为“bookdb”的属性中。这 

样,整个应用程序的<sql:que ̄>和<sql:update>标签都可以使 

用该数据源。设置完数据源后调用,<eredirect>标志将用户 

带人bookdisplay.jsp页面,显示系统所有的图书信息。 

(2)bookdisplay.jsp文件 

采用Model1方式的Java Web应用程序仅由JSP文件构 

成,这样JSP文件充当业务逻辑和显示逻辑双重角色, 

bookdisplay.jsp文件就是这样一个典型的例子。bookdisplay.jsp 

的代码(简化后)如下: 

<%@page language= java contentType: text/html; 

charset=gb231 2 %> 

<%@taglibprefix= c uri= http://java.sun.com/jsp/ 

istl/core %> 

维普资讯

NETWORK&C0啊啊U_lC盯iON 

<%@taglib prefix= 

fmt uri= http://java sun.com/jsp/ 

istl/fmt %> 

<%@taglibprefix= 

sql uri= http://java sun.com/jsp/ 

jstl/sql %> 

<htmt> 

<head> 

<title>图书信息维护</title> 

</head> 

<fmt:requestEncOding value= gb231 2 /> 

<body> 

<f一一业务逻辑一一…增加图书部分一一> 

<c:iftest= ¥{param action== bookadd ) > 

<sql:transaction> 

<sql:update dataSource= ¥{bookdb) > 

insertinto bookvalues(7,7,7,7,7,7,7,7,7) 

<sql:param value= ¥{param.booktype1 /> 

<sql:paramvalue= ¥{【)aram.bookname) /> 

<sql:param value= ¥{【)aram,bookisbn) /> 

<sql:param value= ¥{【)aram.bookbarcode) /> 

<sql:param value= ¥{【)aram bookpubtime) /> 

<sql:param value= ¥{E)aram.b00kpubh0use) /> 

<sql:param value= ¥{【)aram.bookprice) /> 

<sql:paramvalue= ¥{【)aram.bookauthor) /> 

<sql:param value= ¥{【)aram bookinfo) /> 

</sql:update> 

</sql:transaction> 

</c:if> 

<j一一业务逻辑…一一编辑图书部分一一> 

<c:iftest= ¥{param.action== bookedit ) > 

<sql:transaction> 

<sql:update dataSource= ¥{bookdb) > 

update book set 

booktypeid=7. 

bookname=7. 

bookisbn=7. 

b00kbarc0de=7. 

bookpubtime=7. 

b00kpubh0use=7, 

bookprice=7. 

bookauthor=7. 

bookinfo=7 where bookid=7 

<sql:f:)aramvalue= ¥{I3aram.booktype) /> 

<sql:f:)aramvalue= ¥{f3aram bookname) /> 

<sqh【)aram value= ¥{I:)aram.bookisbn) /> 

<sql:【)aram value= ¥{I:)aram.bookbarcode) /> 

<sql:【)aram value= ¥{I:)aram.bookpubtime) /> 

<sql:f)aram value= ¥{f3aram bookpubh0use) /> 

<sql:【)aram value= ¥{f:)aram.bookprice) /> 

<sqh j)aramvalue= ¥f J3aram.bookauthor) /> 

<sql:【)aram value= ¥{【)aram bookinfo) /> 

<sql:【)aram value= ¥{【)aram bookid) /> 

</sql:update> 

</sql:transaction> 

</c:if> 

<!一一业务逻辑…一一删除图书部分一一> 

<c:iftest= ¥(param.action== bookdelete 1 > 

<sqh transaction> 

<sqt:updatedataSource= ¥{bookdb) > 

delete fr0m book where bookid=7 

<sql:param value= ¥{param.bookid) /> 

</sql:update> 

</sql:transaction> 

</c:if> 

<!一一业务逻辑一…一批量删除图书部分一一> 

<c:iftest= ¥{param.action== bookdelmany 1 > 

<c forEach var= deleteid items= 

¥{paramValues.deleteids1 > 

<sql:transaction> 

<sql:update dataSource= ¥{bookdb) > 

delete frOm book where bookid=7 

<sql:param value= ¥{deleteid) /> 

</sql:update> 

</sqh transaction> 

</c:forEach> 

</c:if> 

<!一一显示逻辑…显示图书信息一~> 

<h1> 

<c:outvalue= 图书列表 /> 

</h1> 

<form name= delete action= bookdisplay jsp /> 

<inputtype= hidden name= action value= bookdel— 

many /> 

<sql:query dataSource= ¥(bookdb) var= result > 

SELECT bookid,bookname.booktypename,bookisbn,bO0k- 

barcode,bookpubtime,bO0kpubhOuse,bookprice,bookau— 

thor, bookinfo FROM book b, booktype bt where 

b.booktypeid=bt.bookWpeid 

</sql:query> 

<table> 

<tr> 

<td> 

选择 

</td> 

<td> 

图书名称 

</td> 

<td> 

图书类别 

</td> 

<td> 

图书编号 

</td> 

<td> 

图书条码 

</td> 

<td> 

维普资讯

………………………………………………………… 

实用第一 智慧密集 

………………………………………………………… 

出版时间 

</td> 

<td> 

出版社 

</td> 

<td> 

图书价格 

</td> 

<td> 

作者 

</td> 

<td> 

说明 

</td> 

<td> 

操作 

</td> 

</tr> 

<c: forEach var=’ row’items=’ 

¥{result.rowsBylndex)’> 

<tr> 

<td> 

<input type=’ checkbox’ 

name= deleteids value=’¥{row【0】) /> 

</td> 

<td> 

<c:outvalue=’¥{row【1】)’/> 

</td> 

<td> 

<c:outvalue=’¥(rowI21)’/> 

</td> 

<td> 

<c:outvalue=’¥{row[3】)’/> 

</td> 

<td> 

<c:outvalue=’¥{row【4】)’/> 

</td> 

<td> 

<fmt:formatDatevalue= ¥{row【5】)’timeStyle= long 

dateStyle= long /> 

</td> 

<td> 

<c-outvalue= ¥{row【6】) /> 

</td> 

<td> 

<c-outvalue=’¥{row【7】) /> 

</td> 

<td> 

<c:outvalue= ¥{row【8】) /> 

</td> 

<td> 

<c-outvalMe= ¥{row【9】) /> 

</td> 

<td> 

<a href=’bookedit.isp?bookid=¥{row【0】)’>编辑</a> 

<a href=’bookdisplay.jsp?action=bookdelete&bookid= 

¥{row【0】)’>删除</a> 

</td> 

</tr> 

</c:forEach> 

</table> 

<inputtype=’submit’value=’删除所选图书’/> 

</form> 

<a href=’bookadd.jsp >增加新图书</a> 

</body> 

</html> 

bookdisplay.jsp的前半部分完成应用程序的业务逻辑,包 

括图书的增加、图书的更新、图书的删除和图书的批量删除等 

操作,其功能主要是通过JSTL的SQL标志库中的<sql:up— 

date>标志来实现的。从代码中可以看出,用<sql:update>标志 

来完成数据的增、删、更新,只要将相应的SQL语句和SQL 

参数分别传递给<sql:update>标志和它的<sql:param>子标志 

就可以了。相对于传统JSP中处理数据库操作的方式,代码量 

大大减少,JSP页面非常简洁和整齐,方便美工操作。bookdis- 

play.jsp是根据请求页面传来的action属性的值判断和调用相 

应的业务逻辑来完成图书的增加、删除、更新和批量删除操作 

的。 

由于checkbox传递过来的是一个字符串数组,因此采用 

¥{paramValues.bookidsl表达式来获取递交的参数数组,然后再 

在<c:forEach>标志中对该数组进行遍历,获取每一本待删图 

书的id,再调用<sql:update>进行删除操作。 

对于<sql:update>标志的操作,应该在<sql:transaction>¥ ̄ 

志内进行,这是因为增、删、更新操作必须在事务中进行,以 

保证在并发情况下数据的完整性。 

bookdisplay.jsp的后半部分完成应用程序的显示逻辑,其 

功能主要是通过JSTL的SQL标志库中的<sql:query>标志来实 

现的。将相应的SELECT语句和参数分别传递给<sql:update> 

标志和它的<sql:p ̄am>子标志,<sql:query>就可以帮助我们 

完成数据库的查询操作。同时将查询的数据集放置在一个名为 

result的变量中,再使用<c:forEach>标记对这个变量进行遍历 

和显示。 

(3)bookadd.jsp文件 

bookadd.jsp文件的主要内容是一个用于增加图书的表单, 

实现代码如下: 

<%@page language= java contentType= text/htmI: 

charset=gb2312 %> 

<%@taglib prefix= C uri= http://java.sun.com/jsp/ 

jstl/core %> 

<%@taglibprefix= sql uri= http://java.sun.com/jsp/ 

维普资讯

NETWORK&COMMUNi哪ION 

jstl/sql %> 

<htmf> 

<head> 

</head> 

<body> 

<sql:query var= booktypes dataSource: 

¥{bookdb) > 

select frOm booktype 

</sqh query> 

<form name= bookadd action= bookdisplay.jsp 

method= post /> 

<inputtype= hidden name= action value= bookadd /> 

图书名称: 

<inputtype: text name= bookname /> 

<br/> 

图书类别: 

<select name: bookt ̄ pe > 

<c:forEach var= booktype items= 

¥{booktypes.rowsBylndex) > 

<option value= ¥{booktype【O1) > 

¥{booktype【1】) 

</option> 

</c:forEach> 

</select> 

<br/> 

图书编号: 

<inputtype: text name= bookisbn /> 

<br/> 

图书条码: 

<input type= text name= bookbarcode /> 

<br/> 

出版时间: 

<inputtype= text name= bookpubtime /> 

<br/> 

出版社: 

<input type= text name= bookpubhouse /> 

<br/> 

图书价格 

<inputtype= text name= bookprice /> 

<br/> 

图书作者: 

<inputtype= text name= bookauthor /> 

<br/> 

图书说明: 

<textarea name: bookinfo rows: 5 > 

</textarea> 

<br/> 

<inputtype=”submit value± 增加图书 /> 

</form> 

</body> 

</html> 

用户在表单的文本框中输入相应的内容后,按“增加图 

书”按钮,Web容器会将表单中输入的内容放置在request 

中,提交给bookdisplay.jsp,进行与图书增加相关的数据库 

SQL动作。 

在bookadd.jsp文件的表单中也有一个名称为“action”的 

隐藏属性,其值为“bookadd”,将它传递给bookdis— 

play.jsp,用于指示bookdisplay.jsp文件调用图书增加相关的业 

务逻辑。 

(4)bookedit.jsp文件 

bookedit.jsp文件内容如下: 

<%@page language= java contentType= text/htmf: 

charset=gb2312 %> 

<%@taglib prefix= c uri= http://java.sun.com/jsp/ 

stl/core %> 

<%@taglib prefix= sql uri= http://java.sun.com/jsp/ 

jstl/sql %> 

<htmf 

<head> 

</head> 

<body> 

<sql:queryvar: booktypes dataSource= ¥{bookdb} > 

select frOm booktype 

</sql:query> 

<sqh queryvar= books dataSource= ¥{bookdb} > 

select frOm book where bookid=? 

<sql:param value: ¥{param.bookid} /> 

</sql:query> 

<form name: bookedit action= bookdisplay jsp 

method= post /> 

<input type= hidden name= action value= 

bookedit /> 

<c-forEach var= FOW items= 

¥{books.rowsBylndex) > 

<inputtype= hidden name= bookid value= ¥{row 

【01) /> 

<br/> 

图书类别: 

<select name= booktype > 

<c: forEach var= booktype items= 

¥{booktypes rowsBylndex) > 

<c:choose> 

<c:whentest= ¥{booktype【0】::row【1】} > 

<option value= <c:out value= ¥{booktype【0】} 

?> selected> 

<c:outvalue= ¥{booktype【1】) /> 

</option> 

</c:when> 

<c:otherwise> 

<option value= <c:outvalue= ¥{booktype【0】} /> > 

<c:outvalue= ¥{booktype【1 1) /> 

</option> 

</c:otherwise> 

</c:choose> 

</c:forEach> 

一 

维普资讯

… ……‘ 

. 

实用第一/智慧密 集 

…………………一………… ………. …….. …,….… 

</select> 

<br/> 

</textarea> 

<br/> 

图书名称: 

<inputtype= text name: bookname val— 

<inputtype= submit value: 修改完成 /> 

</c:forEach> 

<br/> 

</form> 

</body> 

</html> 

ue= ¥l row【2】) /> 

<br/> 

图书编号: 

<Inputtype: text name= bookisbn value= 

¥{rowf3】) /> 

<br/> 

当用户在bookdisplay,jsp显示的图书列表中对相关的图书 

进行编辑操作的时候,会调用该页面,同时会把将要编辑图书 

惟一的id传递给bookedit.jsp文件。该文件通过 

图书条码: 

<‘niputtype= text name= bo0kbarcode val— 

ue= ¥{row【4l1 /> 

¥{param,bookid}表达式获取图书的id,从数据库中查询和提取 

<br/> 

该图书的相关信息,填充到图书编辑表单相应数据域中,供用 

出版时间: 

户参考和修改。用户修改完毕后,按“修改完成”按钮, 

< niputtype: text name= bookpubtime val— 

ue= ¥{rowf5】) /> 

Web容器会将表单中输入的内容放置在request中,提交给 

<br/> 

bookdisplay jsp,进行与图书信息更新相关的数据库SQL动 

出版社: 

作。同样在bookedit.jsp文件中表单中也有一个名称为 

<‘niputtype= text name: bookpubhouse 

action”的隐藏属性,其值为“bookedit”,用于指示 

value= ¥{rowf6】) /> 

<br/> 

bookdisplay.jsp文件调用图书更新相关的业务逻辑。 

图书价格: 

四、结语 

< ̄nput type: text name= bookprice val— 

ue= ¥{rowf7】) /> 

三层结构的J2EE应用程序是由数据持久层、业务逻辑 

<br/> 

层、表现层组成,各层可以用相应的开源框架和组件来进行配 

图书作者: 

< ̄nput type= text name= bookauthor val— 

置和开发(如Hibernate、Spring、Struts等),有利于系统的维 

ue= ¥{rowf8】) /> 

护和扩展,这对于构建大型应用程序是必须的。采用JSTL技 

<br/> 

术来精简JSP文件的代码,简化开发过程,本文在这方面给出 

图书说明: 了一个较好的解决方案。 

<textarea name= bookinfo rows= 5 val— 

(收稿日期:2007年11月6日) 

ue= ¥{rowf9】} > 

(上接第13页) 

End 

;dt.Value=0 

EndSub 

continue:Close filenumber 

启动时让“开始粉碎“按钮失效,因为列表中还没有文件 

Kill List1.List(i) 文件粉碎结束后将其删除 

Private Sub Form

._

Load() 

Nexti 

Command3.Enabled=False 

MsgBox 完成文件粉碎! 

EndSub 

List1.Clear 

鼠标双击某一列表项,可以移除该项,不用粉碎.. 

Command3.Enabled=False 使“开始粉碎”按钮有效 

Private Sub List1 DblClick() 

EndSub 

List1.Removeltem List1.Listlndex 

EndSub 

六、其他功能 

七、结语 

其他相关功能的实现代码如下: 

通过“文件粉碎机”的学习,读者能更深该地理解文件在 

如果文件选择错误,可以清空列表重新选择 

Private Sub Command4_Click() 清空列表 

计算机里的存在形式,对电子文件管理有一定的指导意义。 

List1.Clear 

EndSub 

参考文献: 

关闭程序 

MSDN Library Visual Studio 6.0版. 

PrivateSubCommand5

_

Click() 退出系统 

(收稿日期:2007年11月26日) 

56 li 2涵007i重,爱12为与簟Ijl; 


发布者:admin,转转请注明出处:http://www.yc00.com/news/1712627873a2092573.html

相关推荐

发表回复

评论列表(0条)

  • 暂无评论

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信