接下来判断用户访问的页码是否为第一页,若不是,则生成查询其他页记录的SQL语句。实现代码如下:
例程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";
}
}
最后查询数据库,获取符合条件并在当前页中显示的信息。实现代码如下:
例程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文件
本系统中所有访问后台操作的请求,都将其访问路径设置为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.创建显示信息的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> <!-- 输出信息发布时间 -->
<td><s2:if test="infoPayfor==1">是</s2:if><s2:else>否</s2:else></td> <!-- 输出付费状态-->
<td><s2:if test="infoState==1"><font color="red">是</font></s2:if><s2:else><b><font color="blue">否</font></b></s2:else></td> <!-- 输出审核状态-->
<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 信息审核的实现过程
信息审核用到的数据表:tb_info。
根据信息审核功能的介绍,进行信息审核操作,需要先进入信息审核页面,显示被审核信息的详细内容,然后管理员通过单击“通过审核”按钮,完成信息审核操作。下面按照这个流程来介绍信息审核的实现过程。
1.在信息列表显示页面中实现进入审核页面的超链接
在信息列表显示页面中提供了信息标题和“审核”超链接,单击超链接后即可进入信息审核页面。实现代码如下:
例程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>
根据在cityinfo.xml文件中对admin_*.action的配置,上述代码实现的超链接被触发后,将由AdminAction类中的CheckShow()方法进行处理。
2.在AdminAction类中创建CheckShow()方法
该方法用来显示被审核信息的详细内容。在该方法中,首先需要获取请求中传递的信息ID值,然后生成查询SQL语句,最后调用业务处理对象的OpSingleShow()方法返回封装信息的InfoSingle类对象。实现代码如下:
例程64 代码位置:光盘\TM\01\src\com\yxq\action\AdminAction.java
/** 功能:管理员操作-显示要审核的信息 */
public String CheckShow(){
request.setAttribute("mainPage","../info/checkshow.jsp");
comebackState(); //恢复在“显示方式”中选择的状态的方法
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()方法用来恢复在“显示方式”中选择的状态。实现代码如下:
例程65 代码位置:光盘\TM\01\src\com\yxq\action\AdminAction.java
/* 功能:恢复在“显示方式”中选择的状态 */
private void comebackState(){
/* 获取session中保存的选择状态。
* 将选择状态保存在session中,
* 是在管理员单击“显示”按钮请求列表显示时,
* 在ListShow()方法中实现的
*/
Integer getInfoType=(Integer)session.get("infoType");
String getPayForType=(String)session.get("payforType");
String getStateType=(String)session.get("stateType");
/* 恢复选择的状态 */
if(getPayForType!=null&&getStateType!=null&&getInfoType!=null){
showType.setInfoType(getInfoType.intValue());
showType.setPayforType(getPayForType);
showType.setStateType(getStateType);
}
}