(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所示。