【问题标题】:Unable to execute Struts 2 program with ModelDriven interceptor无法使用 ModelDriven 拦截器执行 Struts 2 程序
【发布时间】:2021-06-22 00:49:07
【问题描述】:

我是 Struts 2 框架的新手。我做了一个程序来理解modelDriven拦截器。但我无法执行它。以下是文件列表,最后有一个输出(错误)。

index.jsp:

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
<%@ taglib uri="/struts-tags" prefix="s"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
    <%-- <jsp:useBean id="ent" class="pack.Entity" scope="session" /> --%>
    <s:form method="get" action="go">
        <s:textfield name="t1" label="Name"></s:textfield>
        <s:password name="p1" label="Password"></s:password>
        <s:submit value="accept"></s:submit>
    </s:form>
</body>
</html>

Entity.java:

package actions_pack;

public class Entity {
private String t1;
private String p1;
public String getP1() {
    return p1;
}

public void setP1(String p1) {
    this.p1 = p1;
}

public Entity() {
    super();
    // TODO Auto-generated constructor stub
}

public String getT1() {
    return t1;
}

public void setT1(String t1) {
    this.t1 = t1;
}

}

GoAction.java:

package actions_pack;
import javax.servlet.ServletRequest;
import javax.servlet.http.HttpSession;

import org.apache.struts2.ServletActionContext;

import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;
import com.opensymphony.xwork2.interceptor.ModelDrivenInterceptor;
import com.opensymphony.xwork2.util.ValueStack;
public class GoAction implements ModelDriven<Entity> {
    private Entity en;

    public Entity getEn() {
        return en;
    }
    public void setEn(Entity en) {
        this.en = en;
    }
    public String execute(){
        System.out.println("inside action");
        if(en.getT1().equalsIgnoreCase("nitin")){
            return "success";
        }
        else{
            return "failure";
        }
    }
    @Override
    public Entity getModel() {
        System.out.println("inside model driven....");
        en=new Entity();
        return en;
    }
}

struts.xml:

<?xml version="1.0" encoding="UTF-8"?>
 <!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
    "http://struts.apache.org/dtds/struts-2.3.dtd">

<struts>
    <package name="dd">
            <result-types>
            <result-type name="dispatcher"
                class="org.apache.struts2.dispatcher.ServletDispatcherResult"
                default="true" />
        </result-types>
        <interceptors>
        <interceptor name="modelDriven" class="com.opensymphony.xwork2.interceptor.ModelDrivenInterceptor"/>
        <interceptor-stack name="myStack">
        <interceptor-ref name="modelDriven"></interceptor-ref>
        </interceptor-stack>
        </interceptors>
        <action name="go" class="actions_pack.GoAction">
        <interceptor-ref name="myStack"></interceptor-ref>
            <result name="success" type="dispatcher" >/one/welcome.jsp</result>
            <result name="failure" type="dispatcher">/one/error.jsp</result>
        </action>
    </package>
</struts>

welcome.jsp:

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
<%@ taglib uri="/struts-tags" prefix="s" %>    
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
Welcome, <s:property value="t1"/>
</body>
</html>

网页输出(500 错误):

HTTP Status 500 -

type Exception report

message

description The server encountered an internal error that prevented it from fulfilling this request.

exception

java.lang.NullPointerException
    actions_pack.GoAction.execute(GoAction.java:24)
    sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    java.lang.reflect.Method.invoke(Unknown Source)
    com.opensymphony.xwork2.DefaultActionInvocation.invokeAction(DefaultActionInvocation.java:450)
    com.opensymphony.xwork2.DefaultActionInvocation.invokeActionOnly(DefaultActionInvocation.java:289)
    com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:252)
    com.opensymphony.xwork2.interceptor.ModelDrivenInterceptor.intercept(ModelDrivenInterceptor.java:100)
    com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:246)
    org.apache.struts2.impl.StrutsActionProxy.execute(StrutsActionProxy.java:54)
    org.apache.struts2.dispatcher.Dispatcher.serviceAction(Dispatcher.java:563)
    org.apache.struts2.dispatcher.ng.ExecuteOperations.executeAction(ExecuteOperations.java:77)
    org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter.doFilter(StrutsPrepareAndExecuteFilter.java:99)
note The full stack trace of the root cause is available in the Apache Tomcat/7.0.34 logs.

Apache Tomcat/7.0.34

在struts.xml 文件中我不想使用/扩展struts-default 包。虽然,当我在struts.xml 中包含params 拦截器条目和modelDriven 拦截器时,问题就解决了。这背后的原因是什么。谁能指导我?

【问题讨论】:

  • 你有理由不使用/扩展struts-default.xml吗?
  • 没有。没有理由。但是,我想问一下,为什么问题解决了,添加params拦截器;即使我没有从struts-default.xml 文件扩展struts-default 包。
  • 为了清楚起见,只要告诉拦截器的调用顺序(如果有)。
  • 使用一个拦截器 ModelDriven,我得到 500 错误代码,如输出所示。但是,当我在ModelDriven 下方添加params 拦截器时,问题就消失了。为什么会这样?

标签: java xml jsp struts2 model-driven


【解决方案1】:

动作类中有一个属性需要在动作执行之前进行初始化。您可以通过多种方式做到这一点。

您选择的方式依赖于modelDriven interceptor,它在您的操作执行之前运行。它调用getModel() 将其推送到valueStack 的top 上。因此,您的实体属性正在初始化。如果您删除此拦截器,您将在执行操作时获得NullPointerException。

如果您的 Entity 是一个简单的 POJO,您可以自己实例化,那么只需内联而不是 getModel()。

private Entity en = new Entity();     

@Override
public Entity getModel() {
    System.out.println("inside model driven....");
    return en;
}

下一部分是关于params interceptor。如果您之前使用过 modelDriven interceptor params interceptor,它会使用 OGNL 填充作为模型的 top 对象。

将它与您的操作一起使用允许初始化您在 execute() 中引用的一些属性。

例如t1应该被初始化。

【讨论】:

  • 仍然收到 500 错误代码。我从GoAction.java 文件中删除了ModelDriven&lt;Entity&gt; 接口。在GoAction.java 中制作类变量private Entity en=new Entity();。还从struts.xml 文件中删除了ModelDriven 拦截器条目。还是一样的错误代码。
  • 是的,这还不够,您可以通过两种方式出现空指针异常。查看更新。
  • @JSK 如果这个答案帮助你解决了你的问题,请考虑接受并投票。
猜你喜欢
  • 2014-07-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-31
  • 2013-09-20
  • 2012-07-30
  • 2011-10-25
相关资源
最近更新 更多