以前做项目时老师说这是一个很著名的问题,我后来一想也是,不光是struts会有这个问题,可能控制层框架(control)都会存在这个问题,那这应该也算是思想的一种体现咯?
当你在一个editUI.jsp中保存编辑,此时向action中传递一个info对象,action跳转到listUI方法,listUI方法跳转到listUI.jsp,不想在listUI.jsp搜索框中回显出刚刚传递的info对象相关信息时,可以在info-struts.xml中设置
<action name="info_*" class="cn.itcast.nsfw.info.action.InfoAction" method="{1}">
<result name="{1}">/WEB-INF/jsp/nsfw/info/{1}.jsp</result>
<result name="list" type="redirectAction">
<param name="actionName">info_listUI</param>
<param name="info.title">${strTitle}</param> <!--here-->
<param name="pageNo">${pageNo}</param>
<param name="encode">true</param>
</result>
</action>
infoAction中设置成员变量private String strTitle;
在editUI.jsp中设置一个<s:hidden name="strTitle"/>
infoAction中
//列表页面
<span style="white-space:pre"> </span>public String listUI() throws Exception{
<span style="white-space:pre"> </span>//加载分类集合
<span style="white-space:pre"> </span>ActionContext.getContext().getContextMap().put("infoTypeMap", Info.INFO_TYPE_MAP);
<span style="white-space:pre"> </span>QueryHelper queryHelper = new QueryHelper(Info.class, "i");
<span style="white-space:pre"> </span>try {
<span style="white-space:pre"> </span>if(info != null){
<span style="white-space:pre"> </span>if(StringUtils.isNotBlank(info.getTitle())){
<span style="white-space:pre"> </span>info.setTitle(URLDecoder.decode(info.getTitle(), "utf-8"));
<span style="white-space:pre"> </span>queryHelper.addCondition("i.title like ?", "%" + info.getTitle() + "%");
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>//根据创建时间降序排序
<span style="white-space:pre"> </span>queryHelper.addOrderByProperty("i.createTime", QueryHelper.ORDER_BY_DESC);
<span style="white-space:pre"> </span>pageResult = infoService.getPageResult(queryHelper, getPageNo(), getPageSize());
<span style="white-space:pre"> </span>} catch (Exception e) {
<span style="white-space:pre"> </span>throw new Exception(e.getMessage());
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>
<span style="white-space:pre"> </span>return "listUI";
<span style="white-space:pre"> </span>}
//跳转到编辑页面
public String editUI(){
//加载分类集合
ActionContext.getContext().getContextMap().put("infoTypeMap", Info.INFO_TYPE_MAP);
if (info != null && info.getInfoId() != null) {
//解决查询条件覆盖的问题
strTitle = info.getTitle();//将搜索栏的标题传递给strTitle
info = infoService.findObjectById(info.getInfoId());
}
return "editUI";
}
//保存编辑
public String edit(){
try {
if(info != null){
infoService.update(info);
}
} catch (Exception e) {
e.printStackTrace();
}
return "list";
}
逻辑其实很简单从listUI.jsp到editUI.jsp这个过程中,editUI方法将info的title赋值给成员变量strTitle,转到editUI.jsp时,因为有隐藏域,strTitle值得以保留,点击保存跳转到listUI方法时,在配置文件中因为<param name="info.title">${strTitle}</param>覆盖action中info对象中title的值,使搜索条件不被改变