都市供求信息网(25)

接下来判断用户访问的页码是否为第一页,若不是,则生成查询其他页记录的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);

}

}

读书导航