分類:我的著作
在這一小節(jié)中,將修改在第三章中曾經(jīng)給出的Struts框架示例,以Struts框架和JSTL的協(xié)同工作來實現(xiàn)。
對于第三章的示例,要將JSTL整合進去,需要做以下幾步工作。
(1)下載JSTL并配置。
(1)修改原先的web.xml使其作為Servlet2.4的實現(xiàn)。
(3)修改JSP顯示頁面,整合JSTL和Struts標簽庫一起工作。
可以從http://java.sun.com/products/jsp/jstl網(wǎng)址中下載JSTL1.1的最新版本。要使用這些標簽庫需要做3個步驟的工作。
(1)將下載的jstl.jar放置到Web應用的WEB-INF的lib目錄下。
(2)將下載的TLD文件放置到Web應用的WEB-INF目錄下。
(3)在需要使用的JSP頁面中聲明該標簽庫。
在第三章的示例中所給出的web.xml是Servlet2.3規(guī)范的,因此無法很好的支持JSTL1.1,要修改為符合Servlet2.4規(guī)范的代碼。使web.xml成為Servlet2.4規(guī)范是十分容易的,需要修改的是其頭部DTD聲明。
在Servlet2.3之前,校驗和規(guī)范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規(guī)范,首此使用了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規(guī)范,應該將第三章示例的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>
修改的地方不多,僅僅是
對于JSP顯示頁面的修改是整合的核心部分,在第三章示例的showAttackSolution.jsp中出現(xiàn)了這樣的語句:
<logic:notEmpty name="allAttackSolution">
...
</logic:notEmpty>
將類型為ArrayList的變量“allAttackSolution”從作用范圍中取出,利用<logic:notEmpty>標簽判斷該ArrayList是否為空。
根據(jù)之前討論的“所有判斷標簽被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 三是當它為集合類型的
本示例既然要在替換后與替換前的工作一致,就應該對集合做兩個判斷:
q 一是該集合不為null。
q 二是該集合中的對象數(shù)量不為0。
“!=null”的EL表達式實現(xiàn)了
在這里應該利用“<logic:notEmpty>