正文

都市供求信息网(14)

JSP项目开发案例全程实录(第2版) 作者:明日科技


(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>


上一章目录下一章

Copyright © 读书网 www.dushu.com 2005-2020, All Rights Reserved.
鄂ICP备15019699号 鄂公网安备 42010302001612号