-1

问题陈述

我想在 struts 操作重定向到 JSP 页面时发送一些额外的参数。如果它是一个或两个较小的参数,那么我可以以查询参数的形式传递它们,即Request.jsp?param1=hello.

我试过的

我检查了这个网站并做了相应的事情。这是我的struts.xml文件:

<struts>
<constant name="struts.custom.i18n.resources" value="ApplicationResources" />
<constant name="struts.devMode" value="true" />
<constant name="struts.multipart.maxSize" value="100000000" />

<!-- <constant name="struts.action.excludePattern" value="/service" /> -->

<package name="default" extends="struts-default,json-default"
    namespace="/">
<action name="request"
        class="com.ModifyRequest">
        <result name="success" type="redirect">Request.jsp?orderId=123
        </result>
        <result name="failure" type="redirect">Request.jsp?orderId=123
            <param name="failureMessage">${failureMessage}</param>
            <param name="status">${status}</param>
        </result>
</action>
</package>
</struts>

这是我的动作课:

public class ModifyRequest extends ActionSupport implements Parameterizable{

private Map<String, String> params;

private String failureMessage;
private String status;


public String getStatus() {
    return status;
}

public void setStatus(String status) {
    this.status = status;
}

public String getFailureMessage() {
    return failureMessage;
}

public void setFailureMessage(String failureMessage) {
    this.failureMessage = failureMessage;
}

@Override
public void addParam(String arg0, String arg1) {
    // TODO Auto-generated method stub
    //params.put(arg0, arg1);

}

@Override
public Map<String, String> getParams() {
    // TODO Auto-generated method stub
    return params;
}

@Override
public void setParams(Map<String, String> params) {
    // TODO Auto-generated method stub
    Map<String,String> paramMap = new HashMap<String, String>();
    paramMap.put("failureMessage", "failureMessage"); // temporary value
    paramMap.put("status", "status"); // temporary value
    this.params = paramMap;

}


@Override
public String execute() throws Exception {

    if(false){
        this.status = "success..";
        this.failureMessage = "success message";
        return SUCCESS;
    } else{

        this.status = "failure";
        this.failureMessage = "failure message..";
        return "failure";
    }

}


}

我的 JSP 文件的相关部分:

<script type="text/javascript">

alert('<%=request.getParameter("failureMessage")%>');
alert('<%=request.getParameter("status")%>');

 /*
 // i have written an hidden element setting this value, so i get the desired output.
alert('<%=request.getParameter("userId")%>');
*/


<form action="request" method="post">
  <input type="hidden" name="userId" id="userId" value= "joshi">
</form>

我没有在 Action 类中提到 userId 的 getter 和 setter,因为它不是必需的,所以请忽略这部分。

它在浏览器中引发以下异常:

Struts Problem Report

 Struts has detected an unhandled exception:

 Messages:  
 File:  org/apache/struts2/dispatcher/ServletRedirectResult.java
 Line number:   257
 Stacktraces

 java.lang.NullPointerException

 org.apache.struts2.dispatcher.ServletRedirectResult.isPathUrl
 (ServletRedirectResult.java:257)
org.apache.struts2.dispatcher.ServletRedirectResult.doExecute(ServletRedirectResult.java:177)

如果我<param> elemnetsresult元素中删除,那么它不会抛出任何异常,但我的问题没有解决。

你能帮我么。

4

2 回答 2

1

@Joshi,我还是不明白你在这里做什么。

它应该更简单:在 Struts2 中,参数(无论来自 Querystring 还是 Form)是通过 Getter 和 Setter 处理的。你没有发布你的 JSP,所以我不知道你是否在那里做一些奇怪的事情,但关于其余的:

  1. 使用默认Dispatcher Result类型,而不是Redirect Result类型;
  2. 使用ActionMessages 和ActionErrors 将您的反馈从 Action 传送到 JSP 页面,因此它们是由框架提供的;
  3. 如果没有令人信服的理由不这样做,请使用默认结果:"success"and ,由类(您扩展)"error"作为常量公开;ActionSupport
  4. 由于Intelligent Default,您可以省略结果的结果名称"success"

Struts.xml

<action name="request" class="com.ModifyRequest">
        <result>Request.jsp</result>
        <result name="error">Request.jsp</result>
</action>

行动

public class ModifyRequest extends ActionSupport{

    private String exampleParameterFromJSP;        

    public String getExampleParameterFromJSP() {
        return exampleParameterFromJSP;
    }
    public void setExampleParameterFromJSP(String exampleParameterFromJSP) {
        this.exampleParameterFromJSP = exampleParameterFromJSP;
    }


    @Override
    public String execute() throws Exception {    
        if("1337".equals(exampleParameterFromJSP)){
            addActionMessage("SUCCESS !! So long and thanks for all the fish!");
            return SUCCESS;
        } else{                
            addActionError("ERROR !! You must write '1337' to make it works!");
            return ERROR;
        }

    }

}

假设的 JSP:

<s:actionerror />
<s:actionmessage />
<s:form action="request">
    <s:textfield name="exampleParameterFromJSP" />
    <s:submit value="I'm Feeling Lucky" />
</s:form>

编辑

发布 JSP 后,主要问题现在很明显:

  • 不要使用Scriptlets ( <%, <%=... 它们是Old 和 Bad(tm),并且在不同的范围内运行);
  • 尽可能使用 Struts 标签。


<form action="request" method="post">
  <input type="hidden" name="userId" id="userId" value= "joshi">
</form>

应该是(首选解决方案):

<s:form action="request" method="post">
  <s:hidden name="userId" />
</s:form>

或者至少这个:

<form action="request" method="post">
  <input type="hidden" name="userId" value="<s:property value='userId'/>" />
</form>
于 2013-09-25T12:16:06.717 回答
0

这是对@Andrea给出的答案的补充,效果很好。只是想提供一些额外的参考以更好地理解。

这是我的 JSP(如问题所示):

<script type="text/javascript">

alert('<%=request.getParameter("failureMessage")%>');
alert('<%=request.getParameter("status")%>');

<form action="request" method="post">
   <input type="hidden" name="userId" id="userId" value= "joshi">
</form>

usingrequest.getParameter()返回作为查询参数发送的http请求参数,其中asrequest.getAttribute()返回在服务器端设置的值,即servlet。

request.getParameter()只返回字符串对象,而 asrequest.getAttribute()返回一个对象,它可以是任何类型。

该问题的另一种解决方案是request.getAttribute()在 JSP 中使用来获取参数或属性值。无需Parameterizable在 Action 类中实现接口,只需提供属性及其gettersand setters

<script type="text/javascript">

alert('<%=request.getAttribute("failureMessage")%>');
alert('<%=request.getAttribute("status")%>');

<form action="request" method="post">
   <input type="hidden" name="userId" id="userId" value= "joshi">
</form>

那是问题的附加解决方案。

于 2013-09-26T05:39:17.677 回答