随笔 - 5  文章 - 17  trackbacks - 0
<2008年3月>
2425262728291
2345678
9101112131415
16171819202122
23242526272829
303112345

常用链接

留言簿(3)

随笔分类

随笔档案

搜索

  •  

最新评论

阅读排行榜

评论排行榜

举一个例子:工程中有一个公司列表页面companyList.jsp、一个公司信息编辑页面companyForm.jsp,一个action CompanyAction。在公司列表页面上点击某个公司的Id字段就跳转到公司信息编辑页面,编辑完成后点击save按钮又返回到companyList.jsp。

companyList.jsp的代码:
<%@ include file="/common/taglibs.jsp"%>  
  
<head>  
    
<title><fmt:message key="companyList.title"/></title>  
    
<meta name="heading" content="<fmt:message key='companyList.heading'/>"/>  
    
<meta name="menu" content="CompanyMenu"/>  
</head>  
  
<c:out value="${buttons}" escapeXml="false" />  
  
<display:table name="companies" class="table" requestURI="" id="companyList" export="true" pagesize="25">  
    
<display:column property="id" sortable="true" href="editCompany.html" media="html"  
        paramId
="id" paramProperty="id" titleKey="company.id"/>  
    
<display:column property="name" sortable="true" titleKey="company.name"/>  
</display:table>  
  
<script type="text/javascript">  
    highlightTableRows(
"companyList");  
</script>
其中id列的连接为editCompany.html,实际上就是companyForm.jsp,Struts 2会进行映射的。

companyForm.jsp的代码:
<%@ include file="/common/taglibs.jsp"%>  
  
<head>  
    
<title><fmt:message key="companyDetail.title"/></title>  
    
<meta name="heading" content="<fmt:message key='companyDetail.heading'/>"/>  
</head>  
  
<s:form id="companyForm" action="saveCompany" method="post" validate="true">  
    
<li style="display: none">  
        
<s:hidden key="company.id"/>  
    
</li>  
    
<s:textfield key="company.name" required="false" maxlength="50" cssClass="text medium"/>  
  
    
<li class="buttonBar bottom">  
        
<s:submit cssClass="button" method="save" key="button.save" theme="simple"/>  
            
<s:submit cssClass="button" method="delete" key="button.delete"  
                onclick
="return confirmDelete('Company')" theme="simple"/>  
        
<s:submit cssClass="button" method="cancel" key="button.cancel" theme="simple"/>  
    
</li>  
</s:form>  
  
<script type="text/javascript">  
    Form.focusFirstElement($(
"companyForm"));  
</script>

CompanyAction的代码:
public class CompanyAction extends BaseAction implements Preparable {  
    
private GenericManager<Company, Long> companyManager;  
    
private Company company;  
    
private Long  id;  
  
    
public void setCompanyManager(GenericManager<Company, Long> companyManager) {  
        
this.companyManager = companyManager;  
    }  
  
    
public void setId(Long  id) {  
        
this. id =  id;  
    }  
  
    
public Company getCompany() {  
        
return company;  
    }  
  
    
public void setCompany(Company company) {  
        
this.company = company;  
    }  
  
    
public String delete() {  
        companyManager.remove(company.getId());  
  
        
return SUCCESS;  
    }  
  
    
public String edit() {  
        
if (id != null) {  
            company 
= companyManager.get(id);  
        } 
else {  
            company 
= new Company();  
        }  
  
        
return SUCCESS;  
    }  
  
    
public String save() throws Exception {  
        
if (cancel != null) {  
            
return "cancel";  
        }  
  
        
if (delete != null) {  
            
return delete();  
        }  
  
        
boolean isNew = (company.getId() == null);  
  
        companyManager.save(company);  
  
        return SUCCESS;  
    }  
}

struts.xml中的相关配置:
<action name="editCompany" class="com.opentide.openstore.webapp.action.CompanyAction" method="edit">  
    
<result>/WEB-INF/pages/companyForm.jsp</result>  
    
<result name="error">/WEB-INF/pages/companyList.jsp</result>  
</action>  
  
<action name="saveCompany" class="com.opentide.openstore.webapp.action.CompanyAction" method="save">  
    
<result name="input">/WEB-INF/pages/companyForm.jsp</result>  
    
<result name="cancel" type="redirect">companyList.jsp</result>  
    
<result name="delete" type="redirect">companyList.jsp</result>  
    
<result name="success" type="redirect">companyList.jsp</result>  
</action> 

如果现在有一个customerForm.jsp,要在该页面上提供编辑公司信息的入口,编辑完毕并保存后返回到customerForm.jsp。这个要求可以扩展为“从哪个页面转进来,处理完毕后就转到原来的页面”,这该如何实现呢?

在目前的配置中,CompanyAction的各个result指向的页面是写死的,如果能够在运行时才确定各个result指向的页面就好了,恰好Struts 2提供了这样的方法。

修改CompanyAction,为它增加一个属性ReturnUrl,用来保存处理完毕时要跳转回去的页面:
private String returnUrl;  
  
public String getReturnUrl() {  
    
return returnUrl;  
}  
  
public void setReturnUrl(String returnUrl) {  
    
this.returnUrl = returnUrl;  
}

修改struts.xml中saveCompany的配置,各个result指向的页面从returnUrl参数取得:
<action name="saveCompany" class="com.opentide.openstore.webapp.action.CompanyAction" method="save">    
    
<result name="input">/WEB-INF/pages/companyForm.jsp</result>    
    
<result name="cancel" type="redirect">${returnUrl}</result>    
    
<result name="delete" type="redirect">${returnUrl}</result>    
    
<result name="success" type="redirect">${returnUrl}</result>    
</action> 

修改companyForm.jsp,为表单增加一个名为returnUrl的隐藏域,用于记录returnUrl参数的值,并且在提交表单的时候为该参数重新赋值:
<s:hidden key="returnUrl" />

最后修改companyList.jsp,为跳转到companyForm.jsp的连接增加returnUrl参数,参数值为companyList.jsp本身(即通知companyForm.jsp,处理完毕后还回到现在companyList.jsp页面):
<display:column property="id" sortable="true" href="editCompany.html?returnUrl=companyList.jsp" media="html"  
    paramId
="id" paramProperty="id" titleKey="company.id"/>

发布修改后的工程并运行,果然达到了预期的目的。

要在其它页面上提供公司信息编辑的入口,只要在该页面上提供一个连接,连接地址为editCompany.html?returnUrl=<当前页面地址>即可。

posted on 2008-03-13 21:14 雨奏 阅读(3818) 评论(2)  编辑  收藏 所属分类: Java

FeedBack:
# re: 使用Struts 2实现从哪个页面转进来,处理完毕后就转到原来的页面 2008-03-15 02:43 隔叶黄莺
很好很实用,顶一下  回复  更多评论
  
# re: 使用Struts 2实现从哪个页面转进来,处理完毕后就转到原来的页面[未登录] 2008-09-02 13:58 zy
没有baseaction的内容阿  回复  更多评论
  

只有注册用户登录后才能发表评论。


网站导航: