使用jQuery Ajax无法调用Struts 2的LoginAction类问题求助
兄弟,我之前也碰到过一模一样的问题!咱们来拆解一下为啥传对象参数+配置param标签后LoginAction就调不通了,下面是几个最可能的原因和对应的解决办法:
1. 参数命名不匹配(最常见原因)
Struts2对参数绑定的命名规则很严格,如果你的Ajax传参没有对应Action里对象的层级命名,就会导致参数绑定失败,进而Action无法正常触发。
举个例子:
- 如果你的LoginAction里有一个
User类型的属性loginUser,包含username和password字段:
public class LoginAction extends ActionSupport { private User loginUser; // 注意属性名是loginUser // 必须要有getter和setter! public User getLoginUser() { return loginUser; } public void setLoginUser(User loginUser) { this.loginUser = loginUser; } public String execute() { // 业务逻辑 return SUCCESS; } } // User类 public class User { private String username; private String password; // 对应的getter和setter }
那你的Ajax请求里,参数必须写成loginUser.username、loginUser.password,而不是直接username:
$.ajax({ url: "login.action", type: "POST", data: { "loginUser.username": "test", "loginUser.password": "123456" }, success: function(result) { console.log(result); } });
2. struts.xml里的param标签配置错误
你在struts.xml的action里添加的param标签,必须和LoginAction里的属性名完全对应,否则会导致Struts2无法正确注入参数,进而Action调用失败。
错误示例(param的name和Action属性名不匹配):
<action name="login" class="com.example.LoginAction"> <!-- 假设Action里的属性是loginUser,这里写成user就错了 --> <param name="user">someValue</param> <result type="json"></result> </action>
正确示例:
<action name="login" class="com.example.LoginAction"> <!-- name必须对应Action里的属性名 --> <param name="loginUser.username">defaultName</param> <!-- 如果是给对象属性设默认值 --> <result type="json"></result> </action>
另外要注意:如果你的param是用来传递静态参数(比如默认值),不要和Ajax传递的动态参数冲突;如果是用来配置其他属性(比如拦截器参数),要确保name是Struts2认可的配置项。
3. Ajax请求的Content-Type和参数格式错误
如果你的Ajax是传递JSON格式的对象,而不是表单格式,那必须正确设置Content-Type,并且把对象序列化为JSON字符串,否则Struts2无法解析参数。
正确的JSON格式请求写法:
$.ajax({ url: "login.action", type: "POST", contentType: "application/json;charset=utf-8", // 必须设置这个 data: JSON.stringify({ loginUser: { username: "test", password: "123456" } }), success: function(result) { console.log(result); } });
同时,你的struts.xml里的package必须继承json-default,而不是默认的struts-default:
<package name="default" namespace="/" extends="json-default"> <action name="login" class="com.example.LoginAction"> <param name="loginUser.username">default</param> <result type="json"></result> </action> </package>
4. 缺少必要的Getter/Setter方法
Struts2完全依赖Getter/Setter方法来完成参数注入,不管是Action里的对象属性,还是对象本身的字段,都必须有对应的Getter/Setter,否则参数绑定会失败,Action也无法被正确调用。
比如:
- LoginAction里的
loginUser必须有getLoginUser()和setLoginUser() - User类里的
username和password必须有getUsername()、setUsername()、getPassword()、setPassword()
5. Struts2 JSON插件未正确引入
如果你的项目是Maven管理,需要确保pom.xml里引入了struts2-json-plugin的依赖:
<dependency> <groupId>org.apache.struts</groupId> <artifactId>struts2-json-plugin</artifactId> <version>你的Struts2版本号</version> </dependency>
如果是普通Web项目,需要把对应的jar包(struts2-json-plugin-x.x.x.jar)放到WEB-INF/lib目录下。
排查步骤总结
- 先检查Action和对象的Getter/Setter是否齐全
- 核对Ajax参数命名是否和Action里的对象层级一致
- 检查struts.xml里的param标签name是否和Action属性名匹配
- 确认JSON插件是否引入,package是否继承json-default
- 查看浏览器控制台的Network请求,看参数是否正确发送,服务器返回的状态码是什么(比如404/500,能帮你快速定位问题)
内容的提问来源于stack exchange,提问作者Praveen Gowthaman

