JSTL与Struts的结合(十一)

在这一小节中,将修改在第三章中曾经给出的Struts框架示例,以Struts框架和JSTL的协同工作来实现。

对于第三章的示例,要将JSTL整合进去,需要做以下几步工作。

1)下载JSTL并配置。

1)修改原先的web.xml使其作为Servlet2.4的实现。

3)修改JSP显示页面,整合JSTLStruts标签库一起工作。

9.9.1  下载JSTL并配置

可以从http://java.sun.com/products/jsp/jstl网址中下载JSTL1.1的最新版本。要使用这些标签库需要做3个步骤的工作。

1)将下载的jstl.jar放置到Web应用的WEB-INFlib目录下。

2)将下载的TLD文件放置到Web应用的WEB-INF目录下。

3)在需要使用的JSP页面中声明该标签库。

9.9.2  修改web.xml使其作为Servlet2.4的实现

在第三章的示例中所给出的web.xmlServlet2.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

         http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">

</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>标签还是有其优势的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不讲理的胖子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值