接下來(lái)判斷用戶訪問的頁(yè)碼是否為第一頁(yè),若不是,則生成查詢其他頁(yè)記錄的SQL語(yǔ)句。實(shí)現(xiàn)代碼如下:
例程59 代碼位置:光盤\TM\01\src\com\yxq\action\AdminAction.java
int currentP=createPage.getCurrentP(); //獲取當(dāng)前頁(yè)碼
if(currentP>1){ //如果不是第一頁(yè)
int top=(currentP-1)*perR;
if(mark.equals("1")){
sqlsub="SELECT TOP "+perR+" * FROM tb_info i WHERE (info_type = ?) AND (info_payfor = ?) AND (info _state = ?) AND (info_date < (SELECT MIN(info_date) FROM (SELECT TOP "+top+" (info_date) FROM tb_info WHERE (info_type = i.info_type) AND (info_payfor = i.info_payfor) AND (info_state = i.info_state) ORDER BY info_date DESC) AS mindate)) ORDER BY info_date DESC";
}
else if(mark.equals("2")){
sqlsub="SELECT TOP "+perR+" * FROM tb_info i WHERE (info_type = ?) AND (info_date < (SELECT MIN(info_date) FROM (SELECT TOP "+top+" (info_date) FROM tb_info WHERE (info_type = i.info_type) ORDER BY info_date DESC) AS mindate)) ORDER BY info_date DESC";
}
else if(mark.equals("3")){
sqlsub="SELECT TOP "+perR+" * FROM tb_info i WHERE (info_type = ?) AND (info_state = ?) AND (info _date < (SELECT MIN(info_date) FROM (SELECT TOP "+top+" (info_date) FROM tb_info WHERE (info_type = i.info_type) AND (info_state = i.info_state) ORDER BY info_date DESC) AS mindate)) ORDER BY info_date DESC";
}
else if(mark.equals("4")){
sqlsub="SELECT TOP "+perR+" * FROM tb_info i WHERE (info_type = ?) AND (info_payfor = ?) AND (info _date < (SELECT MIN(info_date) FROM (SELECT TOP "+top+" (info_date) FROM tb_info WHERE (info_type = i.info_type) AND (info_payfor = i.info_payfor) ORDER BY info_date DESC) AS mindate)) ORDER BY info_date DESC";
}
}
最后查詢數(shù)據(jù)庫(kù),獲取符合條件并在當(dāng)前頁(yè)中顯示的信息。實(shí)現(xiàn)代碼如下:
例程60 代碼位置:光盤\TM\01\src\com\yxq\action\AdminAction.java
List adminlistshow=myOp.OpListShow(sqlsub, params);
request.setAttribute("adminlistshow",adminlistshow);
request.setAttribute("createpage",createPage);
4.配置cityinfo.xml文件
本系統(tǒng)中所有訪問后臺(tái)操作的請(qǐng)求,都將其訪問路徑設(shè)置為admin_xxx.action,然后在cityinfo.xml配置文件中,將該路徑模式與AdminAction后臺(tái)處理類進(jìn)行指定,這樣所有訪問admin_*.action的請(qǐng)求都會(huì)由AdminAction類進(jìn)行處理。其配置代碼如下:
例程61 代碼位置:光盤\TM\01\WEB-INF\classes\cityinfo.xml
<!-- 后臺(tái)管理員操作 -->
<action name="admin_*" class="com.yxq.action.AdminAction" method="{1}">
<result name="input">/pages/admin/view/AdminTemp.jsp</result> <!-- 指定表單驗(yàn)證失敗后返回的資源-->
<result>/pages/admin/view/AdminTemp.jsp</result> <!-- 指定信息顯示請(qǐng)求處理成功后返回的資源 -->
</action>
5.創(chuàng)建顯示信息的JSP文件
在獲取了符合條件的信息后,應(yīng)返回JSP頁(yè)面進(jìn)行顯示。其關(guān)鍵代碼如下:
例程62 代碼位置:光盤\TM\01\pages\admin\info\listshow.jsp
<s2:set name="listshow" value="#request.adminlistshow"/>
……//省略了部分代碼
<s2:iterator status="status" value="listshow">
<s2:if test="#status.odd">
<tr></s2:if>
<s2:else>
<tr bgcolor="#F9F9F9"></s2:else>
<td><b><s2:property value="#status.index+1"/></b></td> <!-- 輸出序號(hào) -->
<td><s2:property value="id"/></td> <!-- 輸出信息ID值 -->
<td><a href="admin_CheckShow.action? checkID =<s2:property value='id'/>"><s2:property value="getSubInfoTitle(17)"/></a></td> <!-- 以超鏈接形式輸出信息標(biāo)題 -->
<td><s2:property value="infoDate"/></td> <!-- 輸出信息發(fā)布時(shí)間 -->
<td><s2:if test="infoPayfor==1">是</s2:if><s2:else>否</s2:else></td> <!-- 輸出付費(fèi)狀態(tài)-->
<td><s2:if test="infoState==1"><font color="red">是</font></s2:if><s2:else><b><font color="blue">否</font></b></s2:else></td> <!-- 輸出審核狀態(tài)-->
<td><a href="admin_CheckShow.action? checkID =<s2:property value='id'/>">√審核</a></td>
<td><a href="admin_Delete.action? deleteID=<s2:property value='id'/>" onclick="return really()">×刪除</a></td>
</tr>
</s2:iterator>
代碼貼士
set標(biāo)簽用來(lái)為變量賦值,并將該變量保存到指定范圍內(nèi)。其中,name屬性指定變量名,value屬性指定變量值,代碼中value的屬性值#request.adminlistshow等價(jià)于request.getAttribute("adminlistshow");可通過scope屬性指定變量的存儲(chǔ)范圍,可選值為application、session、request、page和action。
注意,該property標(biāo)簽并不是輸出字符串id,而是輸出當(dāng)前遍歷出的元素的getId()方法返回的值。
1.11.4 信息審核的實(shí)現(xiàn)過程
信息審核用到的數(shù)據(jù)表:tb_info。
根據(jù)信息審核功能的介紹,進(jìn)行信息審核操作,需要先進(jìn)入信息審核頁(yè)面,顯示被審核信息的詳細(xì)內(nèi)容,然后管理員通過單擊“通過審核”按鈕,完成信息審核操作。下面按照這個(gè)流程來(lái)介紹信息審核的實(shí)現(xiàn)過程。
1.在信息列表顯示頁(yè)面中實(shí)現(xiàn)進(jìn)入審核頁(yè)面的超鏈接
在信息列表顯示頁(yè)面中提供了信息標(biāo)題和“審核”超鏈接,單擊超鏈接后即可進(jìn)入信息審核頁(yè)面。實(shí)現(xiàn)代碼如下:
例程63 代碼位置:光盤\TM\01\pages\admin\info\listshow.jsp
<td><a href="admin_CheckShow.action? checkID=<s2:property value='id'/>"><s2:property value="getSubInfoTitle(17)"/> </a></td>
……
<td><a href="admin_CheckShow.action? checkID =<s2:property value='id'/>">√審核</a></td>
根據(jù)在cityinfo.xml文件中對(duì)admin_*.action的配置,上述代碼實(shí)現(xiàn)的超鏈接被觸發(fā)后,將由AdminAction類中的CheckShow()方法進(jìn)行處理。
2.在AdminAction類中創(chuàng)建CheckShow()方法
該方法用來(lái)顯示被審核信息的詳細(xì)內(nèi)容。在該方法中,首先需要獲取請(qǐng)求中傳遞的信息ID值,然后生成查詢SQL語(yǔ)句,最后調(diào)用業(yè)務(wù)處理對(duì)象的OpSingleShow()方法返回封裝信息的InfoSingle類對(duì)象。實(shí)現(xiàn)代碼如下:
例程64 代碼位置:光盤\TM\01\src\com\yxq\action\AdminAction.java
/** 功能:管理員操作-顯示要審核的信息 */
public String CheckShow(){
request.setAttribute("mainPage","../info/checkshow.jsp");
comebackState(); //恢復(fù)在“顯示方式”中選擇的狀態(tài)的方法
String sql="SELECT * FROM tb_info WHERE (id = ?)";
String checkID=request.getParameter("checkID"); //獲取請(qǐng)求中傳遞的信息ID值
if(checkID==null||checkID.equals(""))
checkID="-1";
Object[] params={checkID};
OpDB myOp=new OpDB();
infoSingle=myOp.OpSingleShow(sql, params); //返回InfoSingle類對(duì)象
if(infoSingle==null){ //信息不存在
request.setAttribute("mainPage","/pages/error.jsp");
addFieldError("AdminShowNoExist",getText("city.singleshow.no.exist")); //保存提示信息
}
return SUCCESS;
}
代碼中調(diào)用的comebackState()方法用來(lái)恢復(fù)在“顯示方式”中選擇的狀態(tài)。實(shí)現(xiàn)代碼如下:
例程65 代碼位置:光盤\TM\01\src\com\yxq\action\AdminAction.java
/* 功能:恢復(fù)在“顯示方式”中選擇的狀態(tài) */
private void comebackState(){
/* 獲取session中保存的選擇狀態(tài)。
* 將選擇狀態(tài)保存在session中,
* 是在管理員單擊“顯示”按鈕請(qǐng)求列表顯示時(shí),
* 在ListShow()方法中實(shí)現(xiàn)的
*/
Integer getInfoType=(Integer)session.get("infoType");
String getPayForType=(String)session.get("payforType");
String getStateType=(String)session.get("stateType");
/* 恢復(fù)選擇的狀態(tài) */
if(getPayForType!=null&&getStateType!=null&&getInfoType!=null){
showType.setInfoType(getInfoType.intValue());
showType.setPayforType(getPayForType);
showType.setStateType(getStateType);
}
}