与动作和拦截器不同的String [英] Different String from action and interceptor

查看:163
本文介绍了与动作和拦截器不同的String的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

 <%@ taglib uri =/ struts-tagsprefix =s%> 
< / s:form>
< br>
< b>拦截器测试< / b>
< s:form action =simple>
< s:textfield name =messagelabel =message/>
< s:submit value =submit/>
< / s:form>

操作文件

 包操作; 

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


}

Myinterceptor:

 包拦截器; 

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自动生成方法存根

}

@Override
public void init(){
// TODO自动生成方法存根

}

@Override
public String intercept(ActionInvocation ae)throws Exception {
//预处理逻辑
ServletRequest req = ServletActionContext.getRequest();
ValueStack v = ae.getStack();
枚举< String> e = req.getParameterNames();
while(e.hasMoreElements())
{
String pname = e.nextElement();
String pvalue = req.getParameter(pname);

v.setValue(pname,pvalue);
}
//获取下一个调用的组件
String str = ae.invoke();
returnMyjsp;

}

}

result.jsp

 <%@ taglib uri =/ struts-tagsprefix =s%> 
< b>结果是:< s:property value =result/>< / b>
< br />
< jsp:include page =index.jsp>< / jsp:include>

MyJsp.jsp

 < b> notworking< / b> 

struts.xml

 <?xml version =1.0encoding =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 =dispatcherclass =org.apache.struts2.dispatcher.ServletDispatcherResultdefault =true/>

< / result-types>
< interceptors>
< interceptor name =paramsclass =com.opensymphony.xwork2.interceptor.ParametersInterceptor/>
< interceptor name =psclass =interceptors.myinterceptor>< / interceptor>
< / interceptors>
< default-interceptor-ref name =params>< / default-interceptor-ref>
< action name =adderclass =action.AdderAction>

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

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

解决方案

您仍在调用操作。 JSP在拦截调用完成时呈现。这是为什么 PreResultListener 界面存在的原因。



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

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


<请记住,invoke将在调用结果后返回(例如,在渲染JSP之后),使其适合于开放会话模式。如果你想在结果被调用之前做一些事情,你应该实现一个PreResultListener。



<%@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>

Action file:

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;
    }


}

Myinterceptor:

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>

My question is that I am returning a different string from the interceptor than that of the action file, still the view of action is being generated using action string to map result, and not of the interceptor why?

解决方案

You're still invoking the action. The JSP is rendered by the time the intercept call finished. This is why the PreResultListener interface exists.

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

In particular, note the text in the big box with the exclamation point in it:

Keep in mind that invoke will return after the result has been called (eg. after you JSP has been rendered), making it perfect for things like open-session-in-view patterns. If you want to do something before the result gets called, you should implement a PreResultListener.

这篇关于与动作和拦截器不同的String的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆