JSTL与Struts的结合(八)

9.9 完整示例
在这一小节中,将修改在第三章中曾经给出的 Struts 框架示例,以 Struts 框架和 JSTL 的协同工作来实现。
对于第三章的示例,要将 JSTL 整合进去,需要做以下几步工作。
1 )下载 JSTL 并配置。
1 )修改原先的 web.xml 使其作为 Servlet2.4 的实现。
3 )修改 JSP 显示页面,整合 JSTL Struts 标签库一起工作。
9.9.1 下载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 页面中声明该标签库。
9.9.2 修改web.xml使其作为Servlet2.4的实现
在第三章的示例中所给出的 web.xml Servlet2.3 规范的,因此无法很好的支持 JSTL1.1 ,要修改为符合 Servlet2.4 规范的代码。使 web.xml 成为 Servlet2.4 规范是十分容易的,需要修改的是其头部 DTD 声明。
Servlet2.3 之前,校验和规范 web.xml 都是使用 DTD ,因此其头部声明如下:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd">
<web-app>
</web-app>
而到了 Servlet2.4 规范,首此使用了 xmlns 来声明 web.xml ,因此其头部声明为:
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.4"
         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
</web-app>
所以,为了支持 Servlet2.4 规范,应该将第三章示例的 web.xml 改成如例 9.6 的样子。
9.6 :修改后的 web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.4"
         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">
 <filter>
      <filter-name>Set Character Encoding</filter-name>
      <filter-class>struts.sample.cap1.sample3.util.SetCharacterEncodingFilter</filter-class>
      <init-param>
                <param-name>encoding</param-name>
                <param-value>UTF-8</param-value>
      </init-param>
 </filter>
 <filter-mapping>
      <filter-name>Set Character Encoding</filter-name>
      <url-pattern>*.do</url-pattern>
 </filter-mapping>
 <servlet>
    <servlet-name>action</servlet-name>
    <servlet-class>org.apache.struts.action.ActionServlet</servlet-class>
    <init-param>
      <param-name>config</param-name>
      <param-value>/WEB-INF/struts-config.xml</param-value>
    </init-param>
    <init-param>
      <param-name>debug</param-name>
      <param-value>2</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
 </servlet>
 <servlet-mapping>
    <servlet-name>action</servlet-name>
    <url-pattern>*.do</url-pattern>
 </servlet-mapping>
 <welcome-file-list>
    <welcome-file>setSolution.jsp</welcome-file>
 </welcome-file-list>
 <taglib>
    <taglib-uri>/WEB-INF/struts-template.tld</taglib-uri>
    <taglib-location>/WEB-INF/struts-template.tld</taglib-location>
 </taglib>
 <taglib>
    <taglib-uri>/WEB-INF/struts-bean.tld</taglib-uri>
    <taglib-location>/WEB-INF/struts-bean.tld</taglib-location>
 </taglib>
 <taglib>
    <taglib-uri>/WEB-INF/struts-html.tld</taglib-uri>
    <taglib-location>/WEB-INF/struts-html.tld</taglib-location>
 </taglib>
 <taglib>
    <taglib-uri>/WEB-INF/struts-logic.tld</taglib-uri>
    <taglib-location>/WEB-INF/struts-logic.tld</taglib-location>
 </taglib>
 <taglib>
    <taglib-uri>/WEB-INF/struts-template.tld</taglib-uri>
    <taglib-location>/WEB-INF/struts-template.tld</taglib-location>
 </taglib>
 <taglib>
    <taglib-uri>/WEB-INF/struts-tiles.tld</taglib-uri>
    <taglib-location>/WEB-INF/struts-tiles.tld</taglib-location>
 </taglib>
 <taglib>
    <taglib-uri>/WEB-INF/struts-nested.tld</taglib-uri>
    <taglib-location>/WEB-INF/struts-nested.tld</taglib-location>
 </taglib>
</web-app>
修改的地方不多,仅仅是 头部 的声明。其他地方完全不必改动,这样的 web.xml 已经支持了 Servlet2.4 规范了。
9.9.3 JSP部分:<logic:notEmpty><c:if>标签
对于 JSP 显示页面的修改是整合的核心部分,在第三章示例的 showAttackSolution.jsp 中出现了这样的语句:
<logic:notEmpty name="allAttackSolution">
...
</logic:notEmpty>
将类型为 ArrayList 的变量“ allAttackSolution ”从作用范围中取出,利用 <logic:notEmpty> 标签判断该 ArrayList 是否为空。
根据之前讨论的“所有判断标签被 EL 表达式和 <c:if> 标签替换”,可以利用 <c:if> 标签和 EL 表达式来修改该段 JSP 代码。
修改后的结果如下:
<c:if test="${(requestScope.allAttackSolution != null)
&& fn:length(requestScope.allAttackSolution) != 0}">
...
</c:if>
<logic:notEmpty> 标签其本身具有多种功能:
q         一是判断是否为 null
q         二是当它为 String 类型的变量时,判断字符串长度是否为 0
q         三是当它为集合类型的 变量 时,利用集合类的 isEmpty 方法可以判断是否是一个空的集合。
本示例既然要在替换后与替换前的工作一致,就应该对集合做两个判断:
q         一是该集合不为 null
q         二是该集合中的对象数量不为 0
!=null ”的 EL 表达式实现了 集合 实例不为 null 的判断; fn:length() 函数实现了集合内对象数量不为 0 的判断,两个判断用“ && ”连接起来就实现了 <logic:notEmpty> 标签对于集合判断的工作。
在这里应该利用“ <logic:notEmpty> 标签 ”,还是利用“ EL 表达式 <c:if> 标签”呢? <logic:notEmpty> 标签相对来说 可读性 更强些, EL 表达式作为判断条件则可读性稍差些。然而,这些仅是就本 示例 的改动而言的,其他情况下,利用 EL 表达式和 <c:if> 标签还是有其优势的。
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值