Java 为什么我的自定义拦截器不工作?
我在Struts 2中创建了一个自定义拦截器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
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.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();
}