0
<%@taglib uri="/struts-tags" prefix="s"%>
</s:form>
<br>
<b>Interceptor test</b>
<s:form action="simple">
<s:textfield name="message" label="message"/>
<s:submit value="submit"/>
</s:form>

动作文件:

package action;

public class Simple {
    String message,Status="action is not invoked";
    public String execute() throws Exception
    {
        Status="action is invoked";
        return "Success";
    }
    public String getMessage() {
        return message;
    }
    public void setMessage(String message) {
        this.message = message;
    }
    public String getStatus() {
        return Status;
    }


}

我的拦截器:

package interceptors;

import java.util.Enumeration;

import javax.servlet.ServletRequest;

import org.apache.struts2.ServletActionContext;

import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.Interceptor;
import com.opensymphony.xwork2.util.ValueStack;

public class myinterceptor implements Interceptor {

    @Override
    public void destroy() {
        // TODO Auto-generated method stub

    }

    @Override
    public void init() {
        // TODO Auto-generated method stub

    }

    @Override
    public String intercept(ActionInvocation ae) throws Exception {
    //preprocessing logic
        ServletRequest req=ServletActionContext.getRequest();
        ValueStack v=ae.getStack();
        Enumeration<String> e=req.getParameterNames();
        while(e.hasMoreElements())
        {
            String pname=e.nextElement();
            String pvalue=req.getParameter(pname);

            v.setValue(pname, pvalue);
        }
        // get the next compponent invoked
        String str=ae.invoke();
        return "Myjsp";

    }

}

result.jsp

<%@taglib uri="/struts-tags" prefix="s"%>
<b>Result is:<s:property value="result"/></b>
<br/>
<jsp:include page="index.jsp"></jsp:include>

MyJsp.jsp

<b>notworking</b>

struts.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC 
    "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
    "http://struts.apache.org/dtds/struts-2.0.dtd">
    <struts>
    <package name="action">
    <result-types>
    <result-type name="dispatcher" class="org.apache.struts2.dispatcher.ServletDispatcherResult" default="true"/>

    </result-types>
    <interceptors>
    <interceptor name="params" class="com.opensymphony.xwork2.interceptor.ParametersInterceptor"/>
    <interceptor name="ps" class="interceptors.myinterceptor"></interceptor>
    </interceptors>
    <default-interceptor-ref name="params"></default-interceptor-ref>
    <action name="adder" class="action.AdderAction">

    <result name="success" >/result.jsp</result>
    </action>
    <action name="simple" class="action.Simple">
    <interceptor-ref name="ps"/>
    <result name="Success">/status.jsp</result> 
    <result name="Myjsp">/MyJsp.jsp </result>
    </action>
    </package>
    </struts>

我的问题是,我从拦截器返回的字符串与操作文件的字符串不同,仍然使用操作字符串生成操作视图来映射结果,而不是拦截器,为什么?

4

2 回答 2

2

您仍在调用该操作。JSP 在拦截调用完成时呈现。这就是PreResultListener接口存在的原因。

http://struts.apache.org/development/2.x/docs/writing-interceptors.html

特别要注意大框中带有感叹号的文本:

请记住,调用将在调用结果后返回(例如,在呈现 JSP 之后),使其非常适合诸如 open-session-in-view 模式之类的事情。如果你想在结果被调用之前做一些事情,你应该实现一个 PreResultListener。

于 2014-05-03T01:37:25.580 回答
0

拦截器返回的字符串是结果代码,框架使用它来构建和执行结果,并将该名称配置到操作配置中。你用过

<result name="Myjsp">/MyJsp.jsp </result>

因此,此结果可供拦截器使用,该拦截器正在处理动作调用并返回结果代码。如果您调用,拦截器堆栈会继续调用(并在顶部执行操作)actionInvocation.invoke(),这会从调用的堆栈返回结果代码。您也可以停止调用堆栈并立即返回结果代码。

于 2014-05-03T06:31:15.770 回答