正文

都市供求信息網(wǎng)(14)

JSP項(xiàng)目開發(fā)案例全程實(shí)錄(第2版) 作者:明日科技


(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>


上一章目錄下一章

Copyright ? 讀書網(wǎng) m.ranfinancial.com 2005-2020, All Rights Reserved.
鄂ICP備15019699號(hào) 鄂公網(wǎng)安備 42010302001612號(hào)