Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/336.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么我的自定义拦截器不工作?_Java_Nullpointerexception_Struts2_Interceptor_Valuestack - Fatal编程技术网

Java 为什么我的自定义拦截器不工作?

Java 为什么我的自定义拦截器不工作?,java,nullpointerexception,struts2,interceptor,valuestack,Java,Nullpointerexception,Struts2,Interceptor,Valuestack,我在Struts 2中创建了一个自定义拦截器MyInterceptor.java,它从index.jsp页面获取参数值username和password,并将这些参数中的字符串转换为大写 下面是我的拦截器代码,我在第14行得到java.lang.NullPointerException MyInterceptor.java: 包com.interceptor; 导入com.opensymphony.xwork2.interceptor.interceptor; 导入com.opensymphon

我在Struts 2中创建了一个自定义拦截器
MyInterceptor.java
,它从
index.jsp
页面获取参数值
username
password
,并将这些参数中的
字符串
转换为大写

下面是我的拦截器代码,我在第14行得到
java.lang.NullPointerException

MyInterceptor.java:

包com.interceptor;
导入com.opensymphony.xwork2.interceptor.interceptor;
导入com.opensymphony.xwork2.util.ValueStack;
导入com.opensymphony.xwork2.ActionInvocation;
公共类MyInterceptor实现拦截器{
public void init(){}
@凌驾
公共字符串截获(ActionInvocation ai)引发异常{
ValueStack stack=ai.getStack();
字符串s1=stack.findString(“名称”);
字符串s2=stack.findString(“密码”);
字符串s3=s1.toUpperCase();
字符串s4=s2.toUpperCase();
stack.set(“name”,s3);
堆栈设置(“密码”,s4);
返回ai.invoke();
}
@凌驾
公共空间销毁(){
}
}
这是我的
index.jsp
页面:

它采用
用户名
密码


登录页面
在这里登录
这里是action类
MyAction.java

package com.ravi.action;
导入com.opensymphony.xwork2.ActionSupport;
公共类MyAction扩展了ActionSupport{
公共字符串名称;
公共字符串密码;
公共void集合名(字符串名){
this.name=name;
}
public void setPassword(字符串密码){
this.password=密码;
}
公共字符串getName(){
返回名称;
}
公共字符串getPassword(){
返回密码;
}
公共字符串execute()引发异常{
if(name.equals(“RAVI”)&password.equals(“RAVI”)){
返回“成功”;
}
否则{
返回“错误”;
}
}
}
这是我的
struts.xml


welcome.jsp
Error.jsp
堆栈跟踪如下所示:

java.lang.NullPointerException
拦截(MyInterceptor.java:14)
com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:245)
org.apache.struts2.impl.StrutsActionProxy.execute(StrutsActionProxy.java:54)
org.apache.struts2.dispatcher.dispatcher.serviceAction(dispatcher.java:567)
org.apache.struts2.dispatcher.ng.ExecuteOperations.executeAction(ExecuteOperations.java:81)
org.apache.struts2.dispatcher.ng.filter.strutspreadexecutefilter.doFilter(strutspreadexecutefilter.java:99)
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:220)
org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:122)
org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:505)
org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:170)
org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103)
org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:956)
org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116)
org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:423)
org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1079)
org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:625)
org.apache.tomcat.util.net.aprependpoint$SocketProcessor.doRun(aprependpoint.java:2522)
org.apache.tomcat.util.net.aprependpoint$SocketProcessor.run(aprependpoint.java:2511)
java.util.concurrent.ThreadPoolExecutor.runWorker(未知源)
java.util.concurrent.ThreadPoolExecutor$Worker.run(未知源)
org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:1)
java.lang.Thread.run(未知源)

我想问题在于访问
MyInterceptor.java
中的请求参数。
ValueStack
的方法
findString()
没有返回参数
name
password

的值。如果您需要拦截器中的参数,应该从


我认为问题应该是因为拦截器的顺序。您的拦截器是最后一个拦截器,因此当请求操作时

  • Struts为您的操作创建一个
    新实例
  • 参数拦截器(位于
    默认堆栈中)填充操作属性
    
  • 在此之后,拦截器将更新值堆栈,当然,没有人会使用它

  • 谢谢罗曼先生,我一直在等你的评论。我现在正在做这些改变!先生,它没用!!我在struts.xml中添加了一个小改动
    Map<String, Object> params = ActionContext.getContext().getParameters();
    
    String[] s1 = (String[]) params.get("name");
    String[] s2 = (String[]) params.get("password");
    if (s1 != null && s2 != null) { 
      s1[0] = s1[0].toUpperCase();
      s2[0] = s2[0].toUpperCase();
    }