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 常用的
基本操作
C
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】
5
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条)