(3)創(chuàng)建要在框架頁面的內(nèi)容顯示區(qū)中顯示的listhshow.jsp頁面,在該頁面中編碼實現(xiàn)顯示某類別中的所有信息。下面為列表顯示免費信息的代碼,顯示付費信息的代碼與此相同,這里不再給出。
例程36 代碼位置:光盤\TM\01\view\default.jsp
<!-- 列表顯示免費信息 -->
<s2:set name="onefreelist" value="#request.onefreelist"/>
<table>
<s2:if test="#onefreelist==null||#onefreelist.size()==0">
<tr><td align="center">★★★ 在這里顯示免費發(fā)布的信息!★★★</td></tr></s2:if>
<s2:else>
<tr><td><font color="#004790"><b>
■最新<s2:property value="#session.typeMap[#onefreelist[0].infoType]"/></b>『免費專區(qū)』
</font></td></tr>
<s2:iterator status="onefreeStatus" value="onefreelist">
<s2:if test="#onefreeStatus.odd">
<tr><td align="center" style="border:1 solid" bgcolor="#F0F0F0"></s2:if>
<s2:else>
<tr><td align="center" style="border:1 solid" bgcolor="white"></s2:else>
<table>
<tr>
<td colspan="2">【<s2:property value="#session.typeMap[infoType]"/>】</td>
<td align="right">發(fā)布時間:『<s2:property value="infoDate"/>』 </td>
</tr>
<tr><td colspan="3"><s2:property value="infoContent"/></td></tr>
<tr>
<td>聯(lián)系電話:<s2:property value="infoPhone"/></td>
<td>聯(lián)系人:<s2:property value="infoLinkman"/></td>
<td>E-mail:<s2:property value="infoEmail"/></td>
</tr>
</table>
</td>
</tr>
<tr height="1"><td></td></tr>
</s2:iterator>
<tr><td align="center"><jsp:include page="/pages/page.jsp"/></td></tr> <!-- 包含分頁導(dǎo)航欄頁面 -->
</s2:else>
</table>
在例程36中,<jsp:include page="/pages/page.jsp"/>用來包含實現(xiàn)分頁導(dǎo)航欄的頁面。分頁導(dǎo)航欄頁面的代碼如下:
例程37 代碼位置:光盤\TM\01\pages\page.jsp
<%@ taglib uri="/struts-tags" prefix="s2"%>
<table>
<tr>
<td><s2:property escape="false" value="#request.createpage.PageInfo"/></td>
<td><s2:property escape="false" value="#request.createpage.PageLink"/></td>
</tr>
</table>
代碼中設(shè)置了property標簽的escape屬性,它表示是否忽略HTML語言,false表示不忽略,則當輸出value屬性指定的值時,若其中包含“<”或“>”或其他HTML標識,則它們將在被解析為有效的HTML語法后輸出;否則,設(shè)為true,則表示忽略HTML語言,將原封不動地輸出value屬性指定值。
1.7.4 顯示信息詳細內(nèi)容的實現(xiàn)過程
顯示信息詳細內(nèi)容用到的數(shù)據(jù)表:tb_info。
當用戶在前臺單擊以超鏈接形式顯示的某信息標題時,也就觸發(fā)了查看信息詳細內(nèi)容的請求,該請求的處理是在InfoAction類中的SingleShow()方法中實現(xiàn)的,在請求處理結(jié)束后,即返回JSP頁面進行顯示。
1.創(chuàng)建處理請求的SingleShow()方法
在SingleShow()方法中,首先從請求中獲取想要查看詳細內(nèi)容的信息的ID值,并定義查詢SQL語句,然后將這兩個值作為參數(shù)來調(diào)用業(yè)務(wù)處理對象myOp的OpSingleShow()方法,在該方法中將查詢到的記錄封裝到InfoSingle類對象中,然后再返回該InfoSingle類對象,其具體代碼可查看1.5.2節(jié)介紹的OpSingleShow()方法。SingleShow()方法的代碼如下:
例程38 代碼位置:光盤\TM\01\src\com\yxq\action\InfoAction.java
public String SingleShow(){
request.setAttribute("mainPage","/pages/show/singleshow.jsp");
String id=request.getParameter("id"); //獲取請求中傳遞信息的ID
String sql="SELECT * FROM tb_info WHERE (id = ?)"; //生成查詢SQL語句
Object[] params={id};
OpDB myOp=new OpDB(); //創(chuàng)建一個業(yè)務(wù)處理對象
infoSingle=myOp.OpSingleShow(sql, params); //獲取要查看的信息
if(infoSingle==null){ //若為null,表示要查看的信息不存在
request.setAttribute("mainPage","/pages/error.jsp"); //設(shè)置要顯示的JSP頁面
addFieldError("SingleShowNoExist",getText("city.singleshow.no.exist")); //設(shè)置提示信息
}
return SUCCESS;
}
代碼中將OpSingleShow()方法返回的InfoSingle類對象賦值給了infoSingle,infoSingle是在InfoAction類的父類InfoSuperAction中定義的屬性。InfoSuperAction類的代碼如下:
例程39 代碼位置:光盤\TM\01\src\com\yxq\actionSuper\InfoSuperAction.java
package com.yxq.actionSuper;
import com.yxq.model.InfoSingle;
import com.yxq.model.SearchInfo;
public class InfoSuperAction extends MySuperAction {
protected InfoSingle infoSingle; //用來封裝從數(shù)據(jù)表中查詢出的記錄和發(fā)布信息時的表單數(shù)據(jù)
protected SearchInfo searchInfo; //用來封裝搜索時的表單數(shù)據(jù)
……//省略了屬性的getXXX()與setXXX()方法
}
2.配置cityinfo.xml文件
對查看信息詳細內(nèi)容請求的配置,與列表顯示某類別中所有信息請求的配置是同一個配置,可參看例程34。
3.創(chuàng)建顯示詳細信息的singleshow.jsp頁面
singleshow.jsp頁面內(nèi)容將顯示在框架頁面中的內(nèi)容顯示區(qū)中,在該頁面中編碼實現(xiàn)要查看信息的詳細內(nèi)容。代碼如下:
例程40 代碼位置:光盤\TM\01\pages\show\singleshow.jsp
<table>
<s2:if test="infoSingle==null">
<tr ><td colspan="2">★★★ 查看信息詳細內(nèi)容出錯!★★★</td></tr></s2:if>
<s2:else>
<tr>
<td>信息類別:</td>
<td><s2:property value="#session.typeMap[infoSingle.infoType]"/></td>
</tr>
<tr>
<td>發(fā)布時間:</td>
<td><s2:property value="infoSingle.infoDate"/></td>
</tr>
……//省略了顯示其他信息的代碼
</s2:else>
</table>
細心的讀者可能會發(fā)現(xiàn)<s2:if test="infoSingle==null">中test屬性所指定的表達式中沒有使用“#”符號,這是因為請求從InfoAction類處理結(jié)束,轉(zhuǎn)發(fā)到singleshow.jsp頁面后,當前堆棧頂部存儲的是InfoAction類對象的引用。因此,此時在singleshow.jsp頁面中使用Struts 2.0標簽時,都是以InfoAction類對象為基準,所以<s2:if test="infoSingle==null">中test屬性指定的表達式,就相當于判斷InfoAction類對象的getInfoSingle()方法返回的值是否為null。同理,在后面的property標簽中,例如<s2:property value="infoSingle.infoDate"/>輸出的值,這就相當于先調(diào)用InfoAction類對象的getInfoSingle()方法返回InfoSingle類對象,再調(diào)用InfoSingle對象的getInfoDate()方法,所以<s2:property value="infoSingle.info- Date"/>等價于<s2:property value="getInfoSingle().getInfoDate()"/>。
能夠這樣使用的前提是在InfoAction類中或其父類中提供infoSingle屬性及屬性的getInfoSingle()與setInfoSingle()方法,可查看例程39。最終的運行效果如圖1.34所示。