Java 如何返回struts2中的调用操作

Java 如何返回struts2中的调用操作,java,redirect,struts2,Java,Redirect,Struts2,我使用的是struts 2,我现在有a、b、c、d四个动作。在所有四个页面中都有一个链接“移动视图”,如果单击该链接,它将转到mobileCheck action以设置会话。 所以在执行mobileCheck操作之后,我想返回调用操作,如 1. click link in action a ==>mobileCheck action ==> return to a.action 2. click link in action b ==>mobileCheck action =

我使用的是struts 2,我现在有a、b、c、d四个动作。在所有四个页面中都有一个链接
“移动视图”
,如果单击该链接,它将转到
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操作以在
公共字符串mobileView()
方法中执行业务(而不是执行)

修改操作A、B、C、D以扩展它(
公共类操作A扩展了MobileCheck
),其业务在
执行()

最后,使
mobileView()
方法返回
execute()
:它将返回您正在运行的操作的
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


b、 jsp


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>

a、 jsp
b、 jsp

Win的KISS范例

我这样解决了这个问题,我在会话中保存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>
2) 在xml中:

<action name="viewFullSite" class="tlc.ui.action.MobileOrFullViewSwitch" method="switchFullSiteView">
        <result name="success_nextURL" type="redirect">${nextURL}</result>
    </action>
}


它是有效的,但是如果有更容易实现的方法,请指出。谢谢。

如果您想将所有方法放在同一个类中,那么您也可以使用
struts.xml
声明中的
方法
参数,这样您就可以保存代码。为了可读性和代码维护,我更喜欢很多小类而不是大类。。。但这取决于所执行操作的类型和大小,如果ActionA和ActionB业务类似于“订单上升”和“订单下降”,那么它们可以保持相同的操作。。。如果他们执行非常不同的逻辑操作,我更喜欢使用不同的ActionsHi@AndreaLigios,问题是a、b、c、d操作中的链接是一个常见的jsp,这个链接是导航器的一项--“查看完整站点”,所以在每个页面中单击这个链接,我想更改一个会话值(这就是我想在“mobileCheck action”中做的事情),并且不在此基础上显示mobile css类,因此这里可能无法在每个jspIf中使用不同的操作名称“导航栏”位于表单、链接(或提交按钮)中是相同的,只有表单的
action
属性会改变;顺便说一句,您可以从操作中以相同的方式动态填充它:导航器仍然是相同的,但是从操作中读取,并且根据放置它的JSP而有所不同。您可以自由编辑您的描述,以更清晰的方式添加新的详细信息,以获得进一步帮助。如果mobileCheck操作不呈现视图,而只是重定向回*.action,则逻辑最好位于拦截器中。完成后,您可以将拦截器堆栈应用于所有操作,问题得到了很好的解决。使用此方法,您将实现一个类(“MobileCheckInterceptor”)在struts.xml中编辑几行,您的几十个操作就可以保持完全不变。
<ul>
    <li><a href="<s:url action="viewFullSite.action" namespace="" />" id="viewFullSite">View Full Site</a></li>
</ul>
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);
    }
<action name="viewFullSite" class="tlc.ui.action.MobileOrFullViewSwitch" method="switchFullSiteView">
        <result name="success_nextURL" type="redirect">${nextURL}</result>
    </action>
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;
}