(3)配置Struts 2.0配置文件。本系统创建了一个名为cityinfo.xml的配置文件,在该文件中配置用户请求动作。以下代码为对访问首页请求的配置:
例程28 代码位置:光盘\TM\01\WEB-INF\classes\cityinfo.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"https://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<package name="cityInfo" extends="struts-default">
<!-- 访问首页 -->
<action name="goindex" class="com.yxq.action.IndexAction">
<result>/view/IndexTemp.jsp</result>
</action>
</package>
</struts>
代码贴士
Struts 2.0配置文件的根元素。
配置包空间,name属性指定该空间的名称,extends属性指定继承的包空间。
配置Action动作,name属性指定Action动作名称,class属性指定Action处理类。
指定处理结束后,返回的视图资源。<result>元素的name属性指定了从IndexAction类中返回的字符串,省略name属性的<result>等价于<result name="success">。
通过上面的配置,则任何访问*/goindex.action路径的请求,都会由IndexAction类进行处理。下面在struts.xml文件中包含cityinfo.xml文件,对Struts 2.0中的配置文件的介绍可查看1.14.2节“Struts 2.0框架介绍”中的内容。struts.xml文件的配置如下:
例程29 代码位置:光盘\TM\01\WEB-INF\classes\struts.xml
<?xml version="1.0" encoding="UTF-8"?>
<!-- 指定配置文件的DTD信息 -->
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"https://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<!-- 通过include元素包含其他配置文件-->
<include file="cityinfo.xml"/>
</struts>
(4)创建用来显示首页内容的default.jsp文件,同时编写实现列表显示付费信息的代码。在该页面中通过Struts 2.0标签获取已存储request对象中的List集合对象,然后遍历该集合对象,输出信息。default.jsp文件中用来实现付费信息列表显示的代码如下:
例程30 代码位置:光盘\TM\01\view\default.jsp
<%@ taglib uri="/struts-tags" prefix="s2"%>
<!-- 缴费专区 -->
<s2:set name="payforlist" value="#request.payforlist"/>
<table>
<tr><td colspan="2"><font color="#004790"><b>■推荐信息</b>『缴费专区』</font></td></tr>
<tr>
<td>
<table>
<s2:if test="#payforlist==null||#payforlist.size()==0">
<tr height="30"><td>★★★ 缴费后,您发布信息就可在这里显示!★★★</td></tr>
</s2:if>
<s2:else>
<s2:iterator status="payforStatus" value="payforlist">
<s2:if test="#payforStatus.odd"><tr></s2:if>
<td>『<b><s2:property value="#session.typeMap[infoType]"/></b>』<a href="info_SingleShow.action?id=<s2:property value='id'/>"><s2:property value="getSubInfoTitle(20)"/></a></td>
<s2:if test="#payforStatus.even"></tr></s2:if>
</s2:iterator>
</s2:else>
</table>
</td>
</tr>
</table>
代码贴士
通过taglib指令引入Struts 2.0标签,并指定一个前缀。
获取request范围内根据payforlist属性存储的List集合对象,并赋值给变量payforlist。代码中value的属性#request.adminlistshow等价于request.getAttribute("adminlistshow")。
判断payforlist变量引用的List集合对象是否存在或大小是否为0。
遍历payforlist变量引用的List集合对象,属性status用来创建一个IteratorStatus类实例,IteratorStatus类封装了从value属性指定的集合对象中遍历出的当前元素在该集合对象中的状态,如在该集合对象中的索引序号(从0开始)、在该集合中的位置为奇数还是偶数、是否为该集合对象中的第一个元素或最后一个元素等。
代码中test属性指定的表达式的意义为:如果当前元素在集合对象中的位置是奇数,则输出标签体中的内容。
通过property标签输出付费信息。该行中第1个property标签输出信息类别,第2个property标签输出信息ID,第3个property标签输出InfoSingle类对象的getSubInfoTitle()方法返回的值。
在首页中列表显示付费信息的运行效果如图1.31所示。
列表显示免费信息的实现过程。
(1)根据1.7.2节中的首页列表显示免费信息技术的分析,在IndexAction类的execute()方法中编写如下代码来生成存储免费信息的List集合对象。
例程31 代码位置:光盘\TM\01\src\com\yxq\action\IndexAction.java
/* 查询免费信息,按发布时间降序排列 */
List allsublist=new ArrayList();
if(typeMap!=null&&typeMap.size()!=0){
Iterator itype=typeMap.keySet().iterator();
String sql2="SELECT TOP 5 * FROM tb_info WHERE (info_type = ?) AND (info_state='1') AND (info_payfor = '0') ORDER BY info_date DESC";
while(itype.hasNext()){
Integer sign=(Integer)itype.next(); //获取信息类别
Object[] params={sign};
List onesublist=myOp.OpListShow(sql2, params); //调用业务对象中获取信息列表的方法,返回List对象
allsublist.add(onesublist);
}
}
request.setAttribute("allsublist",allsublist);
代码贴士
先调用Map对象的keySet()方法获取typeMap对象中包含的所有key值,返回一个java.util.Set类对象,然后调用Set对象的iterator()方法转换为Iterator对象。
查询tb_info数据表中符合已通过审核、免费的和信息类别为指定值这3个条件的前5条记录,并按发布时间降序排列。
依次将typeMap对象中的key值作为中SQL语句的信息类别值查询tb_info数据表。在该while循环中将依次查询所有类别的符合条件的信息。
(2)在显示首页内容的default.jsp文件中,编写实现列表显示免费信息的代码。该页面中通过Struts 2.0标签获取已存储request对象中的allsublist集合对象,然后遍历该集合对象。如图1.36所示,从allsublist对象中遍历出的对象是一个存储了某一类信息的List集合对象,因此再对该对象进行遍历,输出该类中的信息。这样,就通过两个iretator标签实现了免费信息的列表显示,并进行归类。default.jsp文件中用来实现免费信息列表显示的代码如下:
例程32 代码位置:光盘\TM\01\view\default.jsp
<!-- 免费专区 -->
<s2:set name="allsublist" value="#request.allsublist"/>
<table>
<tr><td colspan="2"><font color="#004790"><b>■最新信息</b>『免费专区』</font></td></tr>
<s2:if test="#allsublist==null||#allsublist.size()==0">
<tr><td>★★★ 在这里显示免费发布的信息!★★★</td></tr>
</s2:if>
<s2:else>
<s2:iterator status="allStatus" value="allsublist">
<s2:if test="#allStatus.odd"><tr></s2:if>
<td align="center">
<table>
<s2:iterator status="oneStatus">
<s2:if test="#oneStatus.index==0">
<tr><td><b><font color="white">
▲<s2:property value="#session.typeMap[infoType]"/>
</font></b></td> </tr>
</s2:if>
<tr><td>★ <a href="info_SingleShow.action?id=<s2:property value='id'/>"><s2:property value="getSubInfoTitle(20)"/></a></td></tr>
<s2:if test="#oneStatus.last">
<tr><td><a href=info_ListShow.action?infoType=<s2:property value='infoType'/>">更多...</a> </td></tr>
</s2:if>
</s2:iterator>
</table>
</td>
<s2:if test="#allStatus.even"></tr></s2:if>
</s2:iterator>
</s2:else>
</table>