File: org/apache/struts2/impl/StrutsActionProxy.java
Line number: 69
Stacktraces
java.lang.NullPointerException org.apache.struts2.impl.StrutsActionProxy.getErrorMessage(StrutsActionProxy.java:69)
com.opensymphony.xwork2.DefaultActionProxy.prepare(DefaultActionProxy.java:185)
org.apache.struts2.impl.StrutsActionProxy.prepare(StrutsActionProxy.java:63)
org.apache.struts2.impl.StrutsActionProxyFactory.createActionProxy(StrutsActionProxyFactory.java:37)
com.opensymphony.xwork2.DefaultActionProxyFactory.createActionProxy(DefaultActionProxyFactory.java:58)
org.apache.struts2.dispatcher.Dispatcher.serviceAction(Dispatcher.java:554)
org.apache.struts2.dispatcher.FilterDispatcher.doFilter(FilterDispatcher.java:434)
如果我的理解没有错误,当我通过登录按钮发出请求时,它会转到struts.xml
,并且它会寻找操作类。看来,它无法找到我的动作类,这是我所理解的,我也参考了这个
page。
看起来很相似,但我无法弄清楚我的代码中到底有什么问题。我的
struts.xml
、
login.jsp
和
Login
类源代码如下:
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>
<constant name="struts.devMode" value="true" />
<package name="default" extends="struts-default">
<action name="login" class="com.myapp.strust2x.web.action.LoginAction" method="execute">
<result name="success">/welcome.jsp</result>
</action>
</package>
</struts>
登录.jsp
<%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%>
<%@ taglib prefix="s" uri="/struts-tags"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
</head>
<body>
<s:form action="Login" method="post">
<s:textfield key="userName" label="User Name"/><br />
<s:password key="passowrd" label="Password"/><br />
<s:submit value="Login" label="Login" />
</s:form>
</body>
</html>
登录操作
package com.myapp.strust2x.web.action;
import com.myapp.Constant;
public class LoginAction {
private String userName;
private String passowrd;
public LoginAction() {
System.out.println("now Object Created LoginAction");
}
public String execute() throws Exception {
System.out.println("HI i am from hello");
return Constant.SUCCESS;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getPassowrd() {
return passowrd;
}
public void setPassowrd(String passowrd) {
this.passowrd = passowrd;
}
}
FilterDispatcher
中使用已弃用的
web.xml
。将其替换为
org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter
。更多信息
这里。
NullPointerException
中的
StrutsActionProxy
。错误消息应该是
There is no Action mapped for namespace [xxx] and action name [yyy] associated with context path [zzz]
这里的命名空间不为空。命名空间是根据操作映射确定的。如果 URL 中有最后一个斜杠,那么操作映射器将使用您的操作名称作为名称空间,这是错误的,您最好在包配置中显式定义名称空间,并在 Struts JSP 标记中使用名称空间属性。在 URL 中使用操作扩展可以帮助您解决最后一个斜杠问题。
Login”,而在 struts 表单中,它的“login”是导致问题的原因。
这意味着操作的名称区分大小写 名称 Login
和
login
是不同的,我之前没有注意到
L vs l
在 Login.jsp 中:
<body>
<s:form action="Login" method="post">
在 Strust.xml 中
<action name="login" class="com.myapp.strust2x.web.action.LoginAction" method=...
一旦我更改为相同的,它现在对我有用。