1.11 后台信息管理设计
1.11.1 信息管理功能概述
根据需求分析,后台信息的管理功能主要包括信息显示、信息审核、信息删除和信息付费设置。下面分别介绍后台信息管理中的各功能。
1.信息显示功能介绍
后台信息显示功能,分为信息的列表显示和详细内容显示。列表显示的信息由管理员选择的状态类型决定。显示状态分为付费状态和审核状态两种,如图1.53所示。
管理员在状态区域中选择显示方式,并在“信息类别”下拉列表框中选择要显示信息的信息类别,单击“显示”按钮提交表单,则程序会按照该显示方式列表显示出符合条件的所有信息,如图1.54所示。

图1.53 显示方式 图1.54 列表显示信息
当用户单击列表显示出的信息的标题或“审核”超链接后,将显示该信息的详细内容。
2.信息审核功能介绍
用户发布信息后,并不能直接显示在页面中,需要由管理员来审核该信息是否可以发布。要进行信息审核,首先需要显示出“未审核”的信息。可从后台主页右侧的功能区的“显示方式”栏中选择“付费状态”为“全部”,“审核状态”为“未审核”的显示方式,并在“信息类别”下拉列表框中选择信息类别,如图1.55所示,单击“显示”按钮,则显示该类别下的所有未审核信息。

图1.55 显示未审核信息
接下来单击要审核信息的标题或“审核”超链接,进入信息审核页面,如图1.56所示。

图1.56 信息审核页面
在该页面中查看信息详细内容,单击“通过审核”按钮,即可将该信息设置为已通过审核状态。信息审核成功后,会按照之前已选择的显示方式,重新进行查询并显示结果。
3.信息删除功能介绍
信息删除用来删除一些发布的无效信息,从图1.54可以看到,在每条信息的操作栏中,都提供了一个“删除”超链接,单击该超链接,即可删除对应的信息。另外,也可以通过图1.56所示信息审核页面中的“删除信息”按钮来实现删除操作。信息删除成功后,同样会按照之前已选择的显示方式,重新进行查询并显示结果。
4.信息付费管理功能概述
付费管理即将信息设置为“已付费”状态。对于已付费的信息在前台页面显示时,始终显示在页面的顶部位置,以便第一时间被浏览。在本系统中,用户在前台发布的信息,默认都是免费信息。若想将发布的信息在“缴费专区”中显示,信息发布者首先需要缴纳费用,然后提供信息的ID值,由系统管理员根据该ID值查询信息,最后将该信息设置为“已付费”状态。需要信息发布者提供的ID值,是在信息发布成功后,由系统提供给用户的。
管理员要进行付费设置,首先需要登录到后台,然后在功能区的“付费设置”栏中输入要进行付费设置的ID值,查询出该信息,如图1.57所示。单击“设为付费”按钮,可将该信息设置为“已付费”状态。

图1.57 付费设置页面
1.11.2 信息管理技术分析
1.信息显示技术分析
对于后台信息显示中的列表显示,主要用来显示符合指定条件的信息,该条件包括信息类别、付费状态和审核状态。
在数据表tb_info的设计中,设置了info_payfor和info_state两个字段,分别用来表示“付费状态”与“审核状态”。当info_payfor字段内容为1时,表示该信息已付费,为0时表示未付;同样,info_state字段内容为1时,表示已通过审核,为0时表示未通过审核。
所以,若要显示招聘信息类别下的“未审核”和“已付费”的信息,应执行如下的SQL语句。
SELECT * FROM tb_info WHERE (info_type=1) AND (info_state='0') AND (info_payfor='1')
若要显示培训信息类别下的“未审核”和“未付费”的信息,应执行如下的SQL语句。
SELECT * FROM tb_info WHERE (info_type=1) AND (info_state='0') AND (info_payfor='0')
因此,要获取符合条件的信息,只需要设置字段info_type、info_state和info_payfor的值即可。
本系统提供了两组单选按钮组成了“付费状态”和“审核状态”选项。对于“付费状态”选项组,选择“未付费”,则传递的值为“0”;选择“已付费”,则传递的值为“1”;若选择“全部”,则传递all。“审核状态”选项组的设置与此相同。另外,实现了一个下拉列表框,供用户选择信息类别。将这些单选按钮与下拉列表框都在一个表单中实现,
这样,当单击“显示”按钮提交表单后,选择的状态会通过表单进行传递。可创建一个JavaBean来封装表单数据,即保存选择的状态。
例如,按照图1.58所示的方式进行选择,则提交表单后请求中将添加如下参数:
showType.payforType=1&showType.stateType=0&showType.infoType=1
其中showType为封装表单数据的JavaBean实例,payforType为该JavaBean中保存“付费状态”的属性,stateType为保存“审核状态”的属性,infoType为保存“信息类别”的属性。
Action处理类接收表单请求后,获取表单数据:
int infoType=showType.getInfoType();
String stateType=showType.getStateType();
String payforType=showType.getPayforType();
然后生成SQL语句:
SELECT * FROM tb_info WHERE (info_type=?) AND (info_state=?) AND (info_payfor=?)
语句中的“?”最终将依次被设置为变量infoType、stateType和payforType的值。
对于后台信息显示中的详细内容显示,只需要获取要查看信息的ID值,然后通过如下的SQL语句查询数据表来实现。
SELECT * FROM tb_info WHERE (id = ?)
2.信息审核技术分析
对于信息审核,实现该功能的主要技术就是执行SQL语句更新数据表。首先需要获取信息的ID值,然后生成如下SQL语句。
UPDATE tb_info SET info_state = 1 WHERE (id = ?)
其中id字段的值将通过表单中的隐藏域字段进行传递,在Action处理类中可通过如下代码获取。
String checkID=request.getParameter("checkID")
最后执行该SQL语句更新数据表,完成信息审核操作。
3.信息删除技术分析
与信息审核技术的实现相同,首先获取信息的ID值,然后通过执行SQL语句来实现。该SQL语句如下:
DELETE tb_info WHERE (id = ?)
其中id字段的值将通过表单中的隐藏域字段进行传递,在Action处理类中可通过如下代码获取。
String deleteID=request.getParameter("deleteID")
最后执行该SQL语句更新数据表,完成信息删除操作。
4.信息付费设置技术分析
付费管理技术主要就是执行SQL语句更新数据表,将信息的付费状态设置为“已付费”。该SQL语句如下:
UPDATE tb_info SET info_payfor=1 WHERE (id = ?)
其中id字段的值将通过表单进行传递,在Action处理类中可通过如下代码获取。
String moneyID=request.getParameter("moneyID");
最后执行该SQL语句更新数据表,完成信息付费设置操作。
1.11.3 信息显示的实现过程
后台信息显示用到的数据表:tb_info。
1.在侧栏对应的right.jsp页面中编写实现显示方式的代码
根据信息显示功能的介绍及信息显示的技术分析,在right.jsp页面中编写如下代码。
例程54 代码位置:光盘\TM\01\pages\view\right.jsp
<%@ page import="java.util.Map,java.util.TreeMap" %>
<%@ taglib prefix="s2" uri="/struts-tags" %>
<%
Map checkState=new TreeMap(); //用来存储“审核状态”中的选项
checkState.put("1","已审核"); //Map对象的key值存储选项的值,value存储选项的标签
checkState.put("0","未审核");
checkState.put("all","全部");
Map payforState=new TreeMap(); //用来存储“付费状态”中的选项
payforState.put("1","已付费"); //Map对象的key值存储选项的值,value存储选项的标签
payforState.put("0","未付费");
payforState.put("all","全部");
request.setAttribute("checkState",checkState); //将Map对象保存在request范围内,
//以便radio标签遍历该Map对象生成一组单选按钮
request.setAttribute("payforState",payforState); //同上
%>
<s2:form action="admin_ListShow.action?" theme="simple">
<table>
<tr><td colspan="2">
<fieldset>
<legend>★付费状态</legend>
<s2:radio list="#request.payforState" name="showType.payforType" value="%{showType.payforType}"/>
</fieldset>
<fieldset>
<legend>★审核状态</legend>
<s2:radio list="#request.checkState" name="showType.stateType" value="%{showType.stateType}"/>
</fieldset>
</td></tr>
<tr><td>
信息类别:<s2:select emptyOption="true" list="#session.typeMap" name="showType.infoType"/>
<s2:submit value="显示"/>
</td></tr>
</table>
</s2:form>
……//省略了显示付费设置界面的代码
代码中用到了Struts 2.0中的radio标签,其用法与select标签的使用相同,可查看1.8.3节“信息发布实现过程”中对select标签的讲解。
2.创建JavaBean:AdminShowType
根据信息显示的技术分析,需要创建一个JavaBean来保存显示方式中的选择状态,实际上就是用来封装表单数据。关键代码如下:
例程55 代码位置:光盘\TM\01\src\com\yxq\model\AdminShowType.java
package com.yxq.model;
public class AdminShowType {
private String stateType; //保存审核状态
private String payforType; //保存付费状态
private int infoType; //保存信息类别
……//省略了属性的setXXX()与getXXX()方法
}
3.在AdminAction类中实现处理后台信息列表显示的方法
AdminAction类用来处理后台管理员请求的操作,其中后台信息列表显示的请求是在该类中的ListShow()方法中处理的,在该方法中,首先需要获取管理员选择的显示方式,所以在调用该方法之前,需要验证管理员是否选择了显示方式及信息类别,可创建validateListShow()验证方法实现,其代码可查看本书附带光盘。下面介绍ListShow()方法的实现代码。
例程56 代码位置:光盘\TM\01\src\com\yxq\action\AdminAction.java
int infoType=showType.getInfoType(); //获取选择的“信息类别”
String payforType=showType.getPayforType(); //获取选择的“付费状态”
String stateType=showType.getStateType(); //获取选择的“审核状态”
session.put("infoType",Integer.valueOf(infoType)); //保存已选择的“信息类别”
session.put("payforType",payforType); //保存已选择的“付费状态”
session.put("stateType",stateType); //保存已选择的“审核状态”
然后通过判断是否选中“付费状态”与“审核状态”中的“全部”单选按钮来生成相应的SQL语句。实现代码如下:
例程57 代码位置:光盘\TM\01\src\com\yxq\action\AdminAction.java
String sqlall=""; //用来保存查询所有记录的SQL语句
String sqlsub=""; //用来保存查询指定页中记录的SQL语句
Object[] params=null;
String mark ="";
int perR=8; //设置每页显示的记录数
if(!stateType.equals("all")&&!payforType.equals("all")){
mark="1";
sqlall="SELECT * FROM tb_info WHERE (info_type=?) AND (info_state=?) AND (info_payfor=?) ORDER BY info_date DESC";
sqlsub="SELECT TOP "+perR+" * FROM tb_info WHERE (info_type=?) AND (info_state=?) AND (info_payfor=?) ORDER BY info_date DESC";
params=new Object[3]; //声明一个大小为3的对象数组
params[0]=Integer.valueOf(infoType); //保存设置info_type字段的值
params[1]=stateType; //保存设置info_state字段的值
params[2]=payforType; //保存设置info_payfor字段的值
}else if(stateType.equals("all")&&payforType.equals("all")){
mark="2";
sqlall="SELECT * FROM tb_info WHERE (info_type=?) ORDER BY info_date DESC";
sqlsub="SELECT TOP "+perR+" * FROM tb_info WHERE (info_type=?) ORDER BY info_date DESC";
params=new Object[1]; //声明一个大小为1的对象数组
params[0]=Integer.valueOf(infoType); //保存设置info_type字段的值
}else if(payforType.equals("all")){
mark="3";
sqlall="SELECT * FROM tb_info WHERE (info_type=?) AND (info_state=?) ORDER BY info_date DESC";
sqlsub="SELECT TOP "+perR+" * FROM tb_info WHERE (info_type=?) AND (info_state=?) ORDER BY info_date DESC";
params=new Object[2]; //声明一个大小为2的对象数组
params[0]=Integer.valueOf(infoType); //保存设置info_type字段的值
params[1]=stateType; //保存设置info_state字段的值
}else if(stateType.equals("all")){
mark="4";
sqlall="SELECT * FROM tb_info WHERE (info_type=?) AND (info_payfor=?) ORDER BY info_date DESC";
sqlsub="SELECT TOP "+perR+" * FROM tb_info WHERE (info_type=?) AND (info_payfor=?) ORDER BY info_date DESC";
params=new Object[2]; //声明一个大小为2的对象数组
params[0]=Integer.valueOf(infoType); //保存设置info_type字段的值
params[1]=payforType; //保存设置info_payfor字段的值
}
U 代码贴士
u 没有同时选中“付费状态”与“审核状态”的“全部”单选按钮。
v 同时选中了“付费状态”与“审核状态”的“全部”单选按钮。
选中了“付费状态”中的“全部”单选按钮,“审核状态”任意。
选中了“审核状态”中的“全部”单选按钮,“付费状态”任意。
以上代码中加粗的SQL语句用来查询符合条件的第一页所包含的记录,其中变量perR表示每页显示的记录数。
接着获取存储分页信息的CreatePage类对象。实现代码如下:
例程58 代码位置:光盘\TM\01\src\com\yxq\action\AdminAction.java
String strCurrentP=request.getParameter("showpage"); //获取当前页码
String gowhich="admin_ListShow.action"; //设置分页超链接请求的资源
OpDB myOp=new OpDB(); //创建一个业务处理对象
CreatePage createPage=myOp.OpCreatePage(sqlall, params,perR,strCurrentP,gowhich); //调用OpDB类中的
//OpCreatePage()方法计算出总记录数、总页数,并且设置当前页码,这些信息都封装到了createPage对象中
接下来判断用户访问的页码是否为第一页,若不是,则生成查询其他页记录的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>
U 代码贴士
u 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);
}
}
3.创建显示审核信息的JSP页面
用来显示审核信息的页面为checkshow.jsp,该页面通过一个表单显示被审核信息的详细内容,并提供了“通过审核”与“删除信息”两个提交按钮。单击“通过审核”按钮,表单触发admin_Check动作,将由AdminAction类中的Check()方法来处理该请求;单击“删除信息”按钮,表单触发admin_Delete动作,将由AdminAction类中的Delete()方法处理请求。checkshow.jsp的代码如下:
例程66 代码位置:光盘\TM\01\pages\admin\info\checkshow.jsp
<s2:form theme="simple">
<input type="hidden" name="checkID" value="<s2:property value="infoSingle.id"/>">
<input type="hidden" name="deleteID" value="<s2:property value="infoSingle.id"/>">
<table>
<tr>
<td><b>审核信息 [ID值:<s2:property value="infoSingle.id"/>]</b></td>
<td colspan="2" align="right"><s2:fielderror/></td>
</tr>
……//省略了显示其他字段信息的代码
<tr>
<td>信息内容:</td>
<td>
<s2:if test="infoSingle.infoState==1"><s2:set name="forbid" value="true"/></s2:if>
<s2:else><s2:set name="forbid" value="false"/></s2:else>
<s2:submit action="admin_Check" value="√通过审核" disabled="%{forbid}"/>
</td>
<td><s2:submit action="admin_Delete" value="×删除信息" onclick="return really()"/></td>
</tr>
……//省略了显示其他字段信息的代码
</table>
</s2:form>
U 代码贴士
u 该form标签并没有设置action属性来指定表单触发的Action动作,则默认触发当前请求中的Action动作。
通过该submit标签的action属性设置表单触发的Action动作为admin_Check。
通过该submit标签的action属性设置表单触发的Action动作为admin_Delete。
4.在AdminAction类中创建信息审核的Check()方法
Check()方法将实现信息审核的操作。在该方法中,先获取请求中传递的信息ID值,然后生成SQL语句,最后调用业务处理对象的OpUpdate ()方法实现信息审核操作。其实现代码如下:
例程67 代码位置:光盘\TM\01\src\com\yxq\action\AdminAction.java
/** 功能:管理员操作-审核信息(更新数据库) */
public String Check(){
session.put("adminOP","Check"); //记录当前操作为“审核信息”
String checkID=request.getParameter("checkID"); //获取信息ID值
String sql="UPDATE tb_info SET info_state = 1 WHERE (id = ?)";
Object[] params={checkID};
OpDB myOp=new OpDB();
int i=myOp.OpUpdate(sql, params); //更新数据表,实现信息审核操作
if(i>0) //审核信息成功
return "checkSuccess";
else{ //审核信息失败
comebackState();
addFieldError("AdminCheckUnSuccess",getText("city.admin.check.no.success"));
request.setAttribute("mainPage","/pages/error.jsp");
return "UnSuccess";
}
}
5.配置cityinfo.xml文件
对信息审核操作的配置与对信息显示的操作的配置使用的是同一个配置,读者可查看1.11.3节中配置cityinfo.xml文件中的代码,只不过在该<action>元素中需要增加对<result>元素的配置,来指定信息审核操作成功和失败后返回的视图。配置代码如下:
例程68 代码位置:光盘\TM\01\WEB-INF\classes\cityinfo.xml
<result name="checkSuccess" type="redirectAction">
<param name="actionName">admin_*</param>
<param name="method">ListShow</param>
</result>
<result name="deleteSuccess" type="redirectAction">
admin_ListShow.action
</result>
<result name="UnSuccess">/pages/admin/view/AdminTemp.jsp</result>
U 代码贴士
u 该<result>元素用来指定信息审核成功后返回的视图,其中type属性指定返回视图的类型,redirectAction表示返回的视图类型为Action动作;该<result>元素中的第一个<param>元素用来指定返回的Action动作,第二个<param>元素指定了要执行的方法。若程序返回由该<result>元素指定的视图,则会生成如下请求:http://localhost:8080/CityInfo/ admin_*!ListShow.action。
该<result>元素用来指定信息删除成功后返回的视图,若程序返回由该<result>元素指定的视图,则会生成如下请求:http://localhost:8080/CityInfo/admin_ListShow.action。
1.11.5 信息付费设置的实现过程
信息付费设置用到的数据表:tb_info。
根据信息付费设置功能介绍,进行信息付费设置操作,需要先查询出要进行付费设置的信息,在页面中显示要进行付费设置信息的详细内容,然后管理员通过单击“设为付费”按钮,完成信息付费设置操作。实际上,信息付费设置的实现与信息审核的实现是相同的,只不过在查询被操作的信息时,信息审核操作的实现,是将要查询信息的ID值在超链接中传递,而信息付费设置需要管理员向表单中输入信息ID值,然后提交表单进行传递。下面介绍信息付费设置的实现过程。
1.在侧栏对应的right.jsp页面中编写实现付费设置页面的代码
该编码要实现一个表单,在表单中提供一个文本输入框和一个提交按钮,文本框用来接收管理员输入的信息ID值。实现代码如下:
例程69 代码位置:光盘\TM\01\pages\admin\view\right.jsp
<!-- 设置已付费信息 -->
<form action="admin_SetMoneyShow.action">
<tr><td>
<table>
<tr><td>请输入要设为已付费状态的信息ID:</td></tr>
<tr><td >
<input type="text" name="moneyID" value="${param['moneyID']}" size="24"/>
<input type="submit" value="查询"/>
</td></tr>
</table>
</td></tr>
</form>
代码中${param['moneyID']}为JSP的EL表达式,它表示获取请求中名为moneyID的参数的值,也可以写成${param.moneyID}形式。
根据在cityinfo.xml文件中对admin_*.action的配置,上述代码实现的表单被提交后,将由AdminAction类中的SetMoneyShow()方法进行处理。
2.在AdminAction类中创建SetMoneyShow()方法
该方法用来显示要进行付费设置的信息的详细内容。在该方法中,首先需要获取通过表单传递的信息ID值,然后生成查询SQL语句,最后调用业务处理对象的OpSingleShow()方法返回封装信息的InfoSingle类对象。在此之前,需要验证是否输入了信息的ID值和ID值是否为数字格式,该验证可在validateSetMoneyShow ()方法中实现,具体代码可查看本书附带光盘。SetMoneyShow()方法的关键代码如下:
例程70 代码位置:光盘\TM\01\src\com\yxq\action\AdminAction.java
String moneyID=request.getParameter("moneyID"); //获取信息ID值
String sql="SELECT * FROM tb_info WHERE (id = ?)"; //生成SQL语句
Object[] params={moneyID};
OpDB myOp=new OpDB(); //创建业务对象
infoSingle=myOp.OpSingleShow(sql, params); //返回InfoSingle类对象
3.创建显示付费信息的JSP页面
该页面的编码与显示审核信息的JSP页面的编码相同,其关键代码如下:
例程71 代码位置:光盘\TM\01\pages\admin\info\moneyshow.jsp
<s2:form theme="simple">
<input type="hidden" name="moneyID " value="<s2:property value="infoSingle.id"/>">
<input type="hidden" name="deleteID" value="<s2:property value="infoSingle.id"/>">
<table>
<tr>
<td><b>付费设置[ID值:<s2:property value="infoSingle.id"/>]</b></td>
<td colspan="2"><s2:fielderror/></td>
</tr>
……//省略了显示其他字段信息的代码
<tr>
<td>信息内容:</td>
<td>
<s2:if test="infoSingle.infoState==1"><s2:set name="forbid" value="true"/></s2:if>
<s2:else><s2:set name="forbid" value="false"/></s2:else>
<s2:submit action="admin_SetMoney " value="√设为付费" disabled="%{forbid}"/>
</td>
<td><s2:submit action="admin_Delete" value="×删除信息" onclick="return really()"/></td>
</tr>
……//省略了显示其他字段信息的代码
</table>
</s2:form>
4.在AdminAction类中创建付费设置的SetMoney ()方法
SetMoney ()方法将实现付费设置的操作。在该方法中,首先获取表单中传递的信息ID值,然后生成SQL语句,最后调用业务处理对象的OpUpdate ()方法实现付费设置的操作。关键代码如下:
例程72 代码位置:光盘\TM\01\src\com\yxq\action\AdminAction.java
String moneyID=request.getParameter("moneyID"); //获取信息ID值
String sql="UPDATE tb_info SET info_payfor=1 WHERE (id = ?)"; //生成SQL语句
Object[] params={Integer.valueOf(moneyID)};
OpDB myOp=new OpDB(); //创建业务对象
int i=myOp.OpUpdate(sql, params); //执行付费设置操作





