接下來判斷用戶訪問的頁碼是否為第一頁,若不是,則生成查詢其他頁記錄的SQL語句。實現(xiàn)代碼如下:
例程59 代碼位置:光盤\TM\01\src\com\yxq\action\AdminAction.java
int currentP=createPage.getCurrentP(); //獲取當前頁碼
if(currentP>1){ //如果不是第一頁
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ù)庫,獲取符合條件并在當前頁中顯示的信息。實現(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)中所有訪問后臺操作的請求,都將其訪問路徑設置為admin_xxx.action,然后在cityinfo.xml配置文件中,將該路徑模式與AdminAction后臺處理類進行指定,這樣所有訪問admin_*.action的請求都會由AdminAction類進行處理。其配置代碼如下:
例程61 代碼位置:光盤\TM\01\WEB-INF\classes\cityinfo.xml
<!-- 后臺管理員操作 -->
<action name="admin_*" class="com.yxq.action.AdminAction" method="{1}">
<result name="input">/pages/admin/view/AdminTemp.jsp</result> <!-- 指定表單驗證失敗后返回的資源-->
<result>/pages/admin/view/AdminTemp.jsp</result> <!-- 指定信息顯示請求處理成功后返回的資源 -->
</action>
5.創(chuàng)建顯示信息的JSP文件
在獲取了符合條件的信息后,應返回JSP頁面進行顯示。其關鍵代碼如下:
例程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> <!-- 輸出序號 -->
<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> <!-- 以超鏈接形式輸出信息標題 -->
<td><s2:property value="infoDate"/></td> <!-- 輸出信息發(fā)布時間 -->
<td><s2:if test="infoPayfor==1">是</s2:if><s2:else>否</s2:else></td> <!-- 輸出付費狀態(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標簽用來為變量賦值,并將該變量保存到指定范圍內。其中,name屬性指定變量名,value屬性指定變量值,代碼中value的屬性值#request.adminlistshow等價于request.getAttribute("adminlistshow");可通過scope屬性指定變量的存儲范圍,可選值為application、session、request、page和action。
注意,該property標簽并不是輸出字符串id,而是輸出當前遍歷出的元素的getId()方法返回的值。
1.11.4 信息審核的實現(xiàn)過程
信息審核用到的數(shù)據(jù)表:tb_info。
根據(jù)信息審核功能的介紹,進行信息審核操作,需要先進入信息審核頁面,顯示被審核信息的詳細內容,然后管理員通過單擊“通過審核”按鈕,完成信息審核操作。下面按照這個流程來介紹信息審核的實現(xiàn)過程。
1.在信息列表顯示頁面中實現(xiàn)進入審核頁面的超鏈接
在信息列表顯示頁面中提供了信息標題和“審核”超鏈接,單擊超鏈接后即可進入信息審核頁面。實現(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文件中對admin_*.action的配置,上述代碼實現(xiàn)的超鏈接被觸發(fā)后,將由AdminAction類中的CheckShow()方法進行處理。
2.在AdminAction類中創(chuàng)建CheckShow()方法
該方法用來顯示被審核信息的詳細內容。在該方法中,首先需要獲取請求中傳遞的信息ID值,然后生成查詢SQL語句,最后調用業(yè)務處理對象的OpSingleShow()方法返回封裝信息的InfoSingle類對象。實現(xiàn)代碼如下:
例程64 代碼位置:光盤\TM\01\src\com\yxq\action\AdminAction.java
/** 功能:管理員操作-顯示要審核的信息 */
public String CheckShow(){
request.setAttribute("mainPage","../info/checkshow.jsp");
comebackState(); //恢復在“顯示方式”中選擇的狀態(tài)的方法
String sql="SELECT * FROM tb_info WHERE (id = ?)";
String checkID=request.getParameter("checkID"); //獲取請求中傳遞的信息ID值
if(checkID==null||checkID.equals(""))
checkID="-1";
Object[] params={checkID};
OpDB myOp=new OpDB();
infoSingle=myOp.OpSingleShow(sql, params); //返回InfoSingle類對象
if(infoSingle==null){ //信息不存在
request.setAttribute("mainPage","/pages/error.jsp");
addFieldError("AdminShowNoExist",getText("city.singleshow.no.exist")); //保存提示信息
}
return SUCCESS;
}
代碼中調用的comebackState()方法用來恢復在“顯示方式”中選擇的狀態(tài)。實現(xiàn)代碼如下:
例程65 代碼位置:光盤\TM\01\src\com\yxq\action\AdminAction.java
/* 功能:恢復在“顯示方式”中選擇的狀態(tài) */
private void comebackState(){
/* 獲取session中保存的選擇狀態(tài)。
* 將選擇狀態(tài)保存在session中,
* 是在管理員單擊“顯示”按鈕請求列表顯示時,
* 在ListShow()方法中實現(xiàn)的
*/
Integer getInfoType=(Integer)session.get("infoType");
String getPayForType=(String)session.get("payforType");
String getStateType=(String)session.get("stateType");
/* 恢復選擇的狀態(tài) */
if(getPayForType!=null&&getStateType!=null&&getInfoType!=null){
showType.setInfoType(getInfoType.intValue());
showType.setPayforType(getPayForType);
showType.setStateType(getStateType);
}
}