都市供求信息网(16)

(3)创建要在框架页面的内容显示区中显示的listhshow.jsp页面,在该页面中编码实现显示某类别中的所有信息。下面为列表显示免费信息的代码,显示付费信息的代码与此相同,这里不再给出。

例程36 代码位置:光盘\TM\01\view\default.jsp

<!-- 列表显示免费信息 -->

<s2:set name="onefreelist" value="#request.onefreelist"/>

<table>

<s2:if test="#onefreelist==null||#onefreelist.size()==0">

<tr><td align="center">★★★ 在这里显示免费发布的信息!★★★</td></tr></s2:if>

<s2:else>

<tr><td><font color="#004790"><b>

■最新<s2:property value="#session.typeMap[#onefreelist[0].infoType]"/></b>『免费专区』

</font></td></tr>

<s2:iterator status="onefreeStatus" value="onefreelist">

<s2:if test="#onefreeStatus.odd">

<tr><td align="center" style="border:1 solid" bgcolor="#F0F0F0"></s2:if>

<s2:else>

<tr><td align="center" style="border:1 solid" bgcolor="white"></s2:else>

<table>

<tr>

<td colspan="2">【<s2:property value="#session.typeMap[infoType]"/>】</td>

<td align="right">发布时间:『<s2:property value="infoDate"/>』 </td>

</tr>

<tr><td colspan="3"><s2:property value="infoContent"/></td></tr>

<tr>

<td>联系电话:<s2:property value="infoPhone"/></td>

<td>联系人:<s2:property value="infoLinkman"/></td>

<td>E-mail:<s2:property value="infoEmail"/></td>

</tr>

</table>

</td>

</tr>

<tr height="1"><td></td></tr>

</s2:iterator>

<tr><td align="center"><jsp:include page="/pages/page.jsp"/></td></tr> <!-- 包含分页导航栏页面 -->

</s2:else>

</table>

在例程36中,<jsp:include page="/pages/page.jsp"/>用来包含实现分页导航栏的页面。分页导航栏页面的代码如下:

例程37 代码位置:光盘\TM\01\pages\page.jsp

<%@ taglib uri="/struts-tags" prefix="s2"%>

<table>

<tr>

<td><s2:property escape="false" value="#request.createpage.PageInfo"/></td>

<td><s2:property escape="false" value="#request.createpage.PageLink"/></td>

</tr>

</table>

代码中设置了property标签的escape属性,它表示是否忽略HTML语言,false表示不忽略,则当输出value属性指定的值时,若其中包含“<”或“>”或其他HTML标识,则它们将在被解析为有效的HTML语法后输出;否则,设为true,则表示忽略HTML语言,将原封不动地输出value属性指定值。

1.7.4 显示信息详细内容的实现过程

显示信息详细内容用到的数据表:tb_info。

当用户在前台单击以超链接形式显示的某信息标题时,也就触发了查看信息详细内容的请求,该请求的处理是在InfoAction类中的SingleShow()方法中实现的,在请求处理结束后,即返回JSP页面进行显示。

1.创建处理请求的SingleShow()方法

在SingleShow()方法中,首先从请求中获取想要查看详细内容的信息的ID值,并定义查询SQL语句,然后将这两个值作为参数来调用业务处理对象myOp的OpSingleShow()方法,在该方法中将查询到的记录封装到InfoSingle类对象中,然后再返回该InfoSingle类对象,其具体代码可查看1.5.2节介绍的OpSingleShow()方法。SingleShow()方法的代码如下:

例程38 代码位置:光盘\TM\01\src\com\yxq\action\InfoAction.java

public String SingleShow(){

request.setAttribute("mainPage","/pages/show/singleshow.jsp");

String id=request.getParameter("id"); //获取请求中传递信息的ID

String sql="SELECT * FROM tb_info WHERE (id = ?)"; //生成查询SQL语句

Object[] params={id};

OpDB myOp=new OpDB(); //创建一个业务处理对象

infoSingle=myOp.OpSingleShow(sql, params); //获取要查看的信息

if(infoSingle==null){ //若为null,表示要查看的信息不存在

request.setAttribute("mainPage","/pages/error.jsp"); //设置要显示的JSP页面

addFieldError("SingleShowNoExist",getText("city.singleshow.no.exist")); //设置提示信息

}

return SUCCESS;

}

代码中将OpSingleShow()方法返回的InfoSingle类对象赋值给了infoSingle,infoSingle是在InfoAction类的父类InfoSuperAction中定义的属性。InfoSuperAction类的代码如下:

例程39 代码位置:光盘\TM\01\src\com\yxq\actionSuper\InfoSuperAction.java

package com.yxq.actionSuper;

import com.yxq.model.InfoSingle;

import com.yxq.model.SearchInfo;

public class InfoSuperAction extends MySuperAction {

protected InfoSingle infoSingle; //用来封装从数据表中查询出的记录和发布信息时的表单数据

protected SearchInfo searchInfo; //用来封装搜索时的表单数据

……//省略了属性的getXXX()与setXXX()方法

}

2.配置cityinfo.xml文件

对查看信息详细内容请求的配置,与列表显示某类别中所有信息请求的配置是同一个配置,可参看例程34。

3.创建显示详细信息的singleshow.jsp页面

singleshow.jsp页面内容将显示在框架页面中的内容显示区中,在该页面中编码实现要查看信息的详细内容。代码如下:

例程40 代码位置:光盘\TM\01\pages\show\singleshow.jsp

<table>

<s2:if test="infoSingle==null">

<tr ><td colspan="2">★★★ 查看信息详细内容出错!★★★</td></tr></s2:if>

<s2:else>

<tr>

<td>信息类别:</td>

<td><s2:property value="#session.typeMap[infoSingle.infoType]"/></td>

</tr>

<tr>

<td>发布时间:</td>

<td><s2:property value="infoSingle.infoDate"/></td>

</tr>

……//省略了显示其他信息的代码

</s2:else>

</table>

细心的读者可能会发现<s2:if test="infoSingle==null">中test属性所指定的表达式中没有使用“#”符号,这是因为请求从InfoAction类处理结束,转发到singleshow.jsp页面后,当前堆栈顶部存储的是InfoAction类对象的引用。因此,此时在singleshow.jsp页面中使用Struts 2.0标签时,都是以InfoAction类对象为基准,所以<s2:if test="infoSingle==null">中test属性指定的表达式,就相当于判断InfoAction类对象的getInfoSingle()方法返回的值是否为null。同理,在后面的property标签中,例如<s2:property value="infoSingle.infoDate"/>输出的值,这就相当于先调用InfoAction类对象的getInfoSingle()方法返回InfoSingle类对象,再调用InfoSingle对象的getInfoDate()方法,所以<s2:property value="infoSingle.info- Date"/>等价于<s2:property value="getInfoSingle().getInfoDate()"/>。

能够这样使用的前提是在InfoAction类中或其父类中提供infoSingle属性及属性的getInfoSingle()与setInfoSingle()方法,可查看例程39。最终的运行效果如图1.34所示。

读书导航