(3)配置Struts 2.0配置文件。本系統(tǒng)創(chuàng)建了一個(gè)名為cityinfo.xml的配置文件,在該文件中配置用戶請(qǐng)求動(dòng)作。以下代碼為對(duì)訪問首頁(yè)請(qǐng)求的配置:
例程28 代碼位置:光盤\TM\01\WEB-INF\classes\cityinfo.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"https://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<package name="cityInfo" extends="struts-default">
<!-- 訪問首頁(yè) -->
<action name="goindex" class="com.yxq.action.IndexAction">
<result>/view/IndexTemp.jsp</result>
</action>
</package>
</struts>
代碼貼士
Struts 2.0配置文件的根元素。
配置包空間,name屬性指定該空間的名稱,extends屬性指定繼承的包空間。
配置Action動(dòng)作,name屬性指定Action動(dòng)作名稱,class屬性指定Action處理類。
指定處理結(jié)束后,返回的視圖資源。<result>元素的name屬性指定了從IndexAction類中返回的字符串,省略name屬性的<result>等價(jià)于<result name="success">。
通過上面的配置,則任何訪問*/goindex.action路徑的請(qǐng)求,都會(huì)由IndexAction類進(jìn)行處理。下面在struts.xml文件中包含cityinfo.xml文件,對(duì)Struts 2.0中的配置文件的介紹可查看1.14.2節(jié)“Struts 2.0框架介紹”中的內(nèi)容。struts.xml文件的配置如下:
例程29 代碼位置:光盤\TM\01\WEB-INF\classes\struts.xml
<?xml version="1.0" encoding="UTF-8"?>
<!-- 指定配置文件的DTD信息 -->
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"https://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<!-- 通過include元素包含其他配置文件-->
<include file="cityinfo.xml"/>
</struts>
(4)創(chuàng)建用來顯示首頁(yè)內(nèi)容的default.jsp文件,同時(shí)編寫實(shí)現(xiàn)列表顯示付費(fèi)信息的代碼。在該頁(yè)面中通過Struts 2.0標(biāo)簽獲取已存儲(chǔ)request對(duì)象中的List集合對(duì)象,然后遍歷該集合對(duì)象,輸出信息。default.jsp文件中用來實(shí)現(xiàn)付費(fèi)信息列表顯示的代碼如下:
例程30 代碼位置:光盤\TM\01\view\default.jsp
<%@ taglib uri="/struts-tags" prefix="s2"%>
<!-- 繳費(fèi)專區(qū) -->
<s2:set name="payforlist" value="#request.payforlist"/>
<table>
<tr><td colspan="2"><font color="#004790"><b>■推薦信息</b>『繳費(fèi)專區(qū)』</font></td></tr>
<tr>
<td>
<table>
<s2:if test="#payforlist==null||#payforlist.size()==0">
<tr height="30"><td>★★★ 繳費(fèi)后,您發(fā)布信息就可在這里顯示!★★★</td></tr>
</s2:if>
<s2:else>
<s2:iterator status="payforStatus" value="payforlist">
<s2:if test="#payforStatus.odd"><tr></s2:if>
<td>『<b><s2:property value="#session.typeMap[infoType]"/></b>』<a href="info_SingleShow.action?id=<s2:property value='id'/>"><s2:property value="getSubInfoTitle(20)"/></a></td>
<s2:if test="#payforStatus.even"></tr></s2:if>
</s2:iterator>
</s2:else>
</table>
</td>
</tr>
</table>
代碼貼士
通過taglib指令引入Struts 2.0標(biāo)簽,并指定一個(gè)前綴。
獲取request范圍內(nèi)根據(jù)payforlist屬性存儲(chǔ)的List集合對(duì)象,并賦值給變量payforlist。代碼中value的屬性#request.adminlistshow等價(jià)于request.getAttribute("adminlistshow")。
判斷payforlist變量引用的List集合對(duì)象是否存在或大小是否為0。
遍歷payforlist變量引用的List集合對(duì)象,屬性status用來創(chuàng)建一個(gè)IteratorStatus類實(shí)例,IteratorStatus類封裝了從value屬性指定的集合對(duì)象中遍歷出的當(dāng)前元素在該集合對(duì)象中的狀態(tài),如在該集合對(duì)象中的索引序號(hào)(從0開始)、在該集合中的位置為奇數(shù)還是偶數(shù)、是否為該集合對(duì)象中的第一個(gè)元素或最后一個(gè)元素等。
代碼中test屬性指定的表達(dá)式的意義為:如果當(dāng)前元素在集合對(duì)象中的位置是奇數(shù),則輸出標(biāo)簽體中的內(nèi)容。
通過property標(biāo)簽輸出付費(fèi)信息。該行中第1個(gè)property標(biāo)簽輸出信息類別,第2個(gè)property標(biāo)簽輸出信息ID,第3個(gè)property標(biāo)簽輸出InfoSingle類對(duì)象的getSubInfoTitle()方法返回的值。
在首頁(yè)中列表顯示付費(fèi)信息的運(yùn)行效果如圖1.31所示。
列表顯示免費(fèi)信息的實(shí)現(xiàn)過程。
(1)根據(jù)1.7.2節(jié)中的首頁(yè)列表顯示免費(fèi)信息技術(shù)的分析,在IndexAction類的execute()方法中編寫如下代碼來生成存儲(chǔ)免費(fèi)信息的List集合對(duì)象。
例程31 代碼位置:光盤\TM\01\src\com\yxq\action\IndexAction.java
/* 查詢免費(fèi)信息,按發(fā)布時(shí)間降序排列 */
List allsublist=new ArrayList();
if(typeMap!=null&&typeMap.size()!=0){
Iterator itype=typeMap.keySet().iterator();
String sql2="SELECT TOP 5 * FROM tb_info WHERE (info_type = ?) AND (info_state='1') AND (info_payfor = '0') ORDER BY info_date DESC";
while(itype.hasNext()){
Integer sign=(Integer)itype.next(); //獲取信息類別
Object[] params={sign};
List onesublist=myOp.OpListShow(sql2, params); //調(diào)用業(yè)務(wù)對(duì)象中獲取信息列表的方法,返回List對(duì)象
allsublist.add(onesublist);
}
}
request.setAttribute("allsublist",allsublist);
代碼貼士
先調(diào)用Map對(duì)象的keySet()方法獲取typeMap對(duì)象中包含的所有key值,返回一個(gè)java.util.Set類對(duì)象,然后調(diào)用Set對(duì)象的iterator()方法轉(zhuǎn)換為Iterator對(duì)象。
查詢tb_info數(shù)據(jù)表中符合已通過審核、免費(fèi)的和信息類別為指定值這3個(gè)條件的前5條記錄,并按發(fā)布時(shí)間降序排列。
依次將typeMap對(duì)象中的key值作為中SQL語(yǔ)句的信息類別值查詢tb_info數(shù)據(jù)表。在該while循環(huán)中將依次查詢所有類別的符合條件的信息。
(2)在顯示首頁(yè)內(nèi)容的default.jsp文件中,編寫實(shí)現(xiàn)列表顯示免費(fèi)信息的代碼。該頁(yè)面中通過Struts 2.0標(biāo)簽獲取已存儲(chǔ)request對(duì)象中的allsublist集合對(duì)象,然后遍歷該集合對(duì)象。如圖1.36所示,從allsublist對(duì)象中遍歷出的對(duì)象是一個(gè)存儲(chǔ)了某一類信息的List集合對(duì)象,因此再對(duì)該對(duì)象進(jìn)行遍歷,輸出該類中的信息。這樣,就通過兩個(gè)iretator標(biāo)簽實(shí)現(xiàn)了免費(fèi)信息的列表顯示,并進(jìn)行歸類。default.jsp文件中用來實(shí)現(xiàn)免費(fèi)信息列表顯示的代碼如下:
例程32 代碼位置:光盤\TM\01\view\default.jsp
<!-- 免費(fèi)專區(qū) -->
<s2:set name="allsublist" value="#request.allsublist"/>
<table>
<tr><td colspan="2"><font color="#004790"><b>■最新信息</b>『免費(fèi)專區(qū)』</font></td></tr>
<s2:if test="#allsublist==null||#allsublist.size()==0">
<tr><td>★★★ 在這里顯示免費(fèi)發(fā)布的信息!★★★</td></tr>
</s2:if>
<s2:else>
<s2:iterator status="allStatus" value="allsublist">
<s2:if test="#allStatus.odd"><tr></s2:if>
<td align="center">
<table>
<s2:iterator status="oneStatus">
<s2:if test="#oneStatus.index==0">
<tr><td><b><font color="white">
▲<s2:property value="#session.typeMap[infoType]"/>
</font></b></td> </tr>
</s2:if>
<tr><td>★ <a href="info_SingleShow.action?id=<s2:property value='id'/>"><s2:property value="getSubInfoTitle(20)"/></a></td></tr>
<s2:if test="#oneStatus.last">
<tr><td><a href=info_ListShow.action?infoType=<s2:property value='infoType'/>">更多...</a> </td></tr>
</s2:if>
</s2:iterator>
</table>
</td>
<s2:if test="#allStatus.even"></tr></s2:if>
</s2:iterator>
</s2:else>
</table>