JSTL与Struts的结合(十一)

来源:百度文库 编辑:神马文学网 时间:2024/04/28 16:07:42
分类:我的著作
完整示例
在这一小节中,将修改在第三章中曾经给出的Struts框架示例,以Struts框架和JSTL的协同工作来实现。
对于第三章的示例,要将JSTL整合进去,需要做以下几步工作。
(1)下载JSTL并配置。
(1)修改原先的web.xml使其作为Servlet2.4的实现。
(3)修改JSP显示页面,整合JSTL和Struts标签库一起工作。
下载JSTL并配置
可以从http://java.sun.com/products/jsp/jstl网址中下载JSTL1.1的最新版本。要使用这些标签库需要做3个步骤的工作。
(1)将下载的jstl.jar放置到Web应用的WEB-INF的lib目录下。
(2)将下载的TLD文件放置到Web应用的WEB-INF目录下。
(3)在需要使用的JSP页面中声明该标签库。
修改web.xml使其作为Servlet2.4的实现
在第三章的示例中所给出的web.xml是Servlet2.3规范的,因此无法很好的支持JSTL1.1,要修改为符合Servlet2.4规范的代码。使web.xml成为Servlet2.4规范是十分容易的,需要修改的是其头部DTD声明。
在Servlet2.3之前,校验和规范web.xml都是使用DTD,因此其头部声明如下:





而到了Servlet2.4规范,首此使用了xmlns来声明web.xml,因此其头部声明为:

xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">


所以,为了支持Servlet2.4规范,应该将第三章示例的web.xml改成如例9.6的样子。
例9.6:修改后的web.xml

xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">

Set Character Encoding
struts.sample.cap1.sample3.util.SetCharacterEncodingFilter

encoding
UTF-8



Set Character Encoding
*.do


action
org.apache.struts.action.ActionServlet

config
/WEB-INF/struts-config.xml


debug
2

1


action
*.do


setSolution.jsp


/WEB-INF/struts-template.tld
/WEB-INF/struts-template.tld


/WEB-INF/struts-bean.tld
/WEB-INF/struts-bean.tld


/WEB-INF/struts-html.tld
/WEB-INF/struts-html.tld


/WEB-INF/struts-logic.tld
/WEB-INF/struts-logic.tld


/WEB-INF/struts-template.tld
/WEB-INF/struts-template.tld


/WEB-INF/struts-tiles.tld
/WEB-INF/struts-tiles.tld


/WEB-INF/struts-nested.tld
/WEB-INF/struts-nested.tld


修改的地方不多,仅仅是的声明。其他地方完全不必改动,这样的web.xml已经支持了Servlet2.4规范了。
部分:标签
对于JSP显示页面的修改是整合的核心部分,在第三章示例的showAttackSolution.jsp中出现了这样的语句:

...

将类型为ArrayList的变量“allAttackSolution”从作用范围中取出,利用标签判断该ArrayList是否为空。
根据之前讨论的“所有判断标签被EL表达式和标签替换”,可以利用标签和EL表达式来修改该段JSP代码。
修改后的结果如下:

...

标签其本身具有多种功能:
q         一是判断是否为null。
q         二是当它为String类型的变量时,判断字符串长度是否为0。
q         三是当它为集合类型的时,利用集合类的isEmpty方法可以判断是否是一个空的集合。
本示例既然要在替换后与替换前的工作一致,就应该对集合做两个判断:
q         一是该集合不为null。
q         二是该集合中的对象数量不为0。
“!=null”的EL表达式实现了实例不为null的判断;fn:length()函数实现了集合内对象数量不为0的判断,两个判断用“&&”连接起来就实现了标签对于集合判断的工作。
在这里应该利用“”,还是利用“EL和标签”呢?标签相对来说更强些,EL表达式作为判断条件则可读性稍差些。然而,这些仅是就本的改动而言的,其他情况下,利用EL表达式和标签还是有其优势的。