[英]how to return to the invoke action in struts2
我正在使用struts 2,現在我有a,b,c,d四個動作。 在所有四個頁面中都有一個"mobile view"
鏈接,如果單擊該鏈接,它將轉到mobileCheck action
來設置會話。 因此,在執行mobileCheck操作之后,我想返回到調用操作,例如
1. click link in action a ==>mobileCheck action ==> return to a.action
2. click link in action b ==>mobileCheck action ==> return to b.action
3. click link in action c ==>mobileCheck action ==> return to c.action
4. click link in action d ==>mobileCheck action ==> return to d.action
在我的項目中有數十種這樣的操作,是否需要設置任何變量,我應該怎么做,非常感謝。
如果所有這些動作都具有相同的業務,那么更好的設計是使每個動作都擴展MobileCheck動作 。
修改MobileCheck Action以使用public String mobileView()
方法(而不是execute)進行業務;
修改動作A,B,C,D進行擴展( public class ActionA extends MobileCheck
),並將其業務包含在execute()
;
最后,使mobileView()
方法返回execute()
:它將返回您正在運行的Action的execute()
方法:
public class MobileCheck extends ActionSupport {
public String execute() throws Exception{
log.debug("MobileCheck execute() should never be invoked");
return SUCCESS;
}
public String mobileView() throws Exception{
// do something
log.debug("mobileView() business performed");
return execute(); /* THIS IS THE TRICK */
}
}
public class ActionA extends MobileCheck {
public String execute() throws Exception{
// do something
log.debug("ActionA execute() is invoked");
return SUCCESS;
}
}
public class ActionB extends MobileCheck {
public String execute() throws Exception{
// do something
log.debug("ActionB execute() is invoked");
return SUCCESS;
}
}
a.jsp
<s:form>
<s:submit method="mobileView" action="actionA"
value="call mobileView() and re-execute Action A" />
</s:form>
b.jsp
<s:form>
<s:submit method="mobileView" action="actionB"
value="call mobileView() and re-execute Action B" />
</s:form>
struts.xml
<action name="actionA" class="foo.bar.ActionA">
<result>a.jsp</result>
</action>
<action name="actionB" class="foo.bar.ActionB">
<result>b.jsp</result>
</action>
親吻的勝利范例
我這樣解決了這個問題,我將URL保存在會話中,並保存在action類中,將該會話值保存到nextURL變量中,然后操作結果將使用此變量$ {nextURL}進行重定向。
1)在每個a,b,c,d jsp中,都包含相同的代碼:
<ul>
<li><a href="<s:url action="viewFullSite.action" namespace="" />" id="viewFullSite">View Full Site</a></li>
</ul>
並保存當前頁面uri:
HttpServletRequest req = ServletActionContext.getRequest();
String uri = "";
String paramString = "";
if(ServletActionContext.getActionMapping()!=null){
String namespace = ServletActionContext.getActionMapping().getNamespace();
String action = ServletActionContext.getActionMapping().getName();
uri = namespace + "/" + action + ".action";
if (req.getQueryString() != null){
paramString = "?" + req.getQueryString();
uri += paramString;
}
req.getSession().setAttribute(RequestParam.invoke_uri.toString(), uri);
}
2)在xml中:
<action name="viewFullSite" class="tlc.ui.action.MobileOrFullViewSwitch" method="switchFullSiteView">
<result name="success_nextURL" type="redirect">${nextURL}</result>
</action>
3)在動作類中:
public class MobileOrFullViewSwitch extends TLCAction {
private static final Logger logger = LoggerManager.getLogger(Account.class);
private String nextURL = "";
public String switchFullSiteView(){
request.getSession().setAttribute(SessionConstants.IGNORE_MOBILEVIEW, "true");
// set the nextURL property if it was specified
this.nextURL = (String)request.getSession().getAttribute(RequestParam.invoke_uri.toString());
if (this.nextURL == null) this.nextURL = "";
// security check: only support relative URLs; anything else is ignored
if (!this.nextURL.startsWith("/")) this.nextURL = "";
if (isEmpty(this.nextURL)) {
this.nextURL = "/home.action";
}
return ResultCode.SUCCESS_NEXT_URL;
}
public String switchMobileView(){
return ResultCode.SUCCESS_NEXT_URL;
}
public String getNextURL() {
return nextURL;
}
}
它可以工作,但是如果有更容易實現的方法,請指出。 謝謝。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.