在Struts 2中使用拦截器时出现NullPointerException

时间:2014-04-12 00:03:07

标签: java struts2 interceptor interceptorstack struts2-interceptors

这是我的WelcomeAction班级

package com.codinghazard.actions;

public class WelcomeAction {

    private String operandA;
    private String operandB;
    private Character operator; 
    private int sum;


    public String execute() {
        if ((operandA!="") && (operandB!=""))
        {
            int a=Integer.parseInt(operandA);
            int b=Integer.parseInt(operandB);
            switch (operator) 
            {
            case '1':
                sum=a+b;
                break;
            case '2':
                sum=a-b;
                break; 
            case '3':
                sum=a*b;
                break;
            case '4':
                try
                {
                    sum=a/b;
                }
                catch(ArithmeticException ae)
                {
                    return "ERROR";
                }
                break;                  

            }
            return "SUCCESS";
        }
        return "ERROR";
    }


    public String getOperandA() {
        return operandA;
    }


    public void setOperandA(String operandA) {
        this.operandA = operandA;
    }


    public String getOperandB() {
        return operandB;
    }


    public void setOperandB(String operandB) {
        this.operandB = operandB;
    }


    public Character getOperator() {
        return operator;
    }


    public void setOperator(Character operator) {
        this.operator = operator;
    }


    public int getSum() {
        return sum;
    }


    public void setSum(int sum) {
        this.sum = sum;
    }
}

这是我的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>
 <!-- http://localhost:8080/test/user/login -->
    <package name="user" namespace="/user" extends="struts-default">
        <action name="calculator">
        <interceptor-ref name="timer" />
            <result>pages/Calculator.jsp</result>
        </action>
        <action name="Welcome" class="com.codinghazard.actions.WelcomeAction">
        <%--
        <interceptor-ref name="timer" />
        --%>
            <result name="SUCCESS">pages/Result.jsp</result>
            <result name="ERROR">pages/error.jsp</result>

        </action>

    </package>

</struts>

我尝试使用拦截器,但是当我取消注释它时,NullPointerException被抛出。我是Struts2的新手并试图获得理解。我是关于拦截器和学习this教程的主题。

2 个答案:

答案 0 :(得分:1)

Struts2框架利用interceptors支持其功能所需的代码。为此,核心软件包为struts-default.xml中的default configuration提供了扩展和覆盖默认设置的灵活性。此配置在启动时加载,并应用于您使用的每个操作,除非该操作具有自己的自定义设置。如果要将这些设置用于包配置中的每个操作,则应考虑创建拦截器堆栈。见How do we configure an Interceptor to be used with every Action

  

请查看Struts 2文档以获取上述完整详细信息   提到的拦截器。

这是本教程链接中非常有用的建议。然而,本教程本身适用于中级或高级读者。初学者应该从Getting Started开始。

你得到了NullPointerException,因为你没有在动作配置中引用params拦截器。你应该知道,如果你引用一个具体动作配置的拦截器,它将使用这个拦截器,而不是默认情况下使用的defaultStack,如果动作配置没有引用拦截器。

答案 1 :(得分:0)

 <action name="Welcome" class="com.codinghazard.actions.WelcomeAction">

    <interceptor-ref name="timer" />
    <interceptor-ref name="defaultStack"/>
        <result name="SUCCESS">pages/Result.jsp</result>
        <result name="ERROR">pages/error.jsp</result>

    </action>

尝试上面。

每当你使用任何在struts2的默认拦截器列表中不可用的额外拦截器时,你必须明确地添加默认堆栈以将默认inteceptos的功能用作params或workflow。