无法访问 ajax post 控制器 struts2 中的请求参数 class
Not able to access ajax post request parameters in struts2 controller class
我正在我的应用程序中实现简单的登录逻辑。我创建了 login.html 和 login.js 文件。在 logins.js 中,我正在发出 ajax post 请求并将用户 ID 和密码传递给 struts 控制器 class,但是在我的控制器中这两个值都是空的。
以下是我的 classes:
index.html
<form id="login-form" name="login-form" method="post" action="#">
<table class="table_signin" >
<!--email address table begins-->
<tr>
<th><label for="email" >Email Address</label></th>
<td><input type="text" id="email" name="email" class="input_width98 text" style="text-transform: lowercase"/></td>
</tr>
<tr>
<th><label for="password" >Password</label></th>
<td><input type="password" id="password" name="password" class="input_width98 text" autocomplete="off"/></td>
</tr>
<tr>
<td><input type="submit" name="login" id="login" value="Submit"/></td>
</tr>
</table>
</form>
MyLogin.js 是:
$().ready(function() {
$("#login").click(function(){
var email = $("#email").val();
var password = $("#password").val();
if( email =='' || password =='')
{
$('input[type="text"],input[type="password"]')
$('input[type="text"],input[type="password"]')
alert("Please fill all fields...!!!!!!");
}
else{
var userInfo= {"userEmail":email , "userPassword":password};
alert("else part"+userInfo)
var login = $.ajax({
async: false,
cache: false,
url: "/nts-web/login/login.do",
data: userInfo,
dataType: 'json',
type: 'POST',
crossDomain: true,
success: function (msg) {
var res = msg;
alert("res"+res);
}
});
}
});
});
现在我的 struts.xml 包含以下配置:
<package namespace="/login" name="login" extends="json-default">
<action name="login" class="com.warnerbros.nts.controller.impl.AdminLoginControllerImpl" method="login">
<interceptor-ref name="json" />
<interceptor-ref name="defaultStack" />
<result type="json">
<param name="root">result</param>
</result>
</action>
</package>
最后我的 LoginController 是:
public class AdminLoginControllerImpl extends AbstractControllerImpl implements AdminLoginController {
private static final long serialVersionUID = 1L;
@Autowired
private LoginService loginService;
private User userInfo;
public String login() {
System.out.println(userInfo.getUserEmailId());//Here it is throwing null pointer.
String res= "";
return res;
}
}
我有一个像这样的 pojo User.java:
public class User {
private String userEmail;
private String userPassword;
public String getUserEmail() {
return userEmail;
}
public void setUserEmail(String userEmail) {
this.userEmail = userEmail;
}
public String getUserPassword() {
return userPassword;
}
public void setUserPassword(String userPassword) {
this.userPassword = userPassword;
}
如何获取controller中useremail和password的值?
有两点不对。
1) 如果需要发送JSON到Action,you need the JSON Interceptor in your Interceptor Stack
才能正确解码。您只定义了 JSON 拦截器,您还没有将它(与 defaultStack 一起)应用到操作中;做如下:
<action name="login" class="foo.bar.AdminLoginControllerImpl" method="login">
<interceptor-ref name="json" />
<interceptor-ref name="defaultStack" />
<result type="json">
<param name="root">result</param>
</result>
</action>
2) 为了工作,JSON 拦截器要求请求的 contentType
为 application/json
:
...
dataType: 'json',
contentType: 'application/json',
...
3)你挂载发送数据的javascript代码错误,花括号不能转义:
// wrong
var userInfo = '{"userEmail":"'+email+'" , "password":"'+password+'}';
// right
var userInfo = {"userEmail":email , "password":password};
4) 页面中的变量名称与操作中的变量名称不匹配。您如何期望 userEmail
匹配 user.userEmailId
?或者 password
到 user.userpassword
?
修复它,它应该可以工作。
通过发送正确的 json 对象解决了问题,例如
var obj = {"userInfo":{"userEmail":email , "userPassword":password}};
下面的struts.xml是配置。
<package namespace="/login" name="login" extends="json-default">
<interceptors>
<interceptor-stack name="defaultStack">
<interceptor-ref name="json">
<param name="enableSMD">true</param>
</interceptor-ref>
</interceptor-stack>
</interceptors>
<default-interceptor-ref name="defaultStack" />
<action name="login"
class="com.warnerbros.nts.controller.impl.AdminLoginControllerImpl"
method="login">
<interceptor-ref name="defaultStack" />
<result type="json">
<param name="root">result</param>
</result>
</action>
</package>
我正在我的应用程序中实现简单的登录逻辑。我创建了 login.html 和 login.js 文件。在 logins.js 中,我正在发出 ajax post 请求并将用户 ID 和密码传递给 struts 控制器 class,但是在我的控制器中这两个值都是空的。
以下是我的 classes:
index.html
<form id="login-form" name="login-form" method="post" action="#">
<table class="table_signin" >
<!--email address table begins-->
<tr>
<th><label for="email" >Email Address</label></th>
<td><input type="text" id="email" name="email" class="input_width98 text" style="text-transform: lowercase"/></td>
</tr>
<tr>
<th><label for="password" >Password</label></th>
<td><input type="password" id="password" name="password" class="input_width98 text" autocomplete="off"/></td>
</tr>
<tr>
<td><input type="submit" name="login" id="login" value="Submit"/></td>
</tr>
</table>
</form>
MyLogin.js 是:
$().ready(function() {
$("#login").click(function(){
var email = $("#email").val();
var password = $("#password").val();
if( email =='' || password =='')
{
$('input[type="text"],input[type="password"]')
$('input[type="text"],input[type="password"]')
alert("Please fill all fields...!!!!!!");
}
else{
var userInfo= {"userEmail":email , "userPassword":password};
alert("else part"+userInfo)
var login = $.ajax({
async: false,
cache: false,
url: "/nts-web/login/login.do",
data: userInfo,
dataType: 'json',
type: 'POST',
crossDomain: true,
success: function (msg) {
var res = msg;
alert("res"+res);
}
});
}
});
});
现在我的 struts.xml 包含以下配置:
<package namespace="/login" name="login" extends="json-default">
<action name="login" class="com.warnerbros.nts.controller.impl.AdminLoginControllerImpl" method="login">
<interceptor-ref name="json" />
<interceptor-ref name="defaultStack" />
<result type="json">
<param name="root">result</param>
</result>
</action>
</package>
最后我的 LoginController 是:
public class AdminLoginControllerImpl extends AbstractControllerImpl implements AdminLoginController {
private static final long serialVersionUID = 1L;
@Autowired
private LoginService loginService;
private User userInfo;
public String login() {
System.out.println(userInfo.getUserEmailId());//Here it is throwing null pointer.
String res= "";
return res;
}
}
我有一个像这样的 pojo User.java:
public class User {
private String userEmail;
private String userPassword;
public String getUserEmail() {
return userEmail;
}
public void setUserEmail(String userEmail) {
this.userEmail = userEmail;
}
public String getUserPassword() {
return userPassword;
}
public void setUserPassword(String userPassword) {
this.userPassword = userPassword;
}
如何获取controller中useremail和password的值?
有两点不对。
1) 如果需要发送JSON到Action,you need the JSON Interceptor in your Interceptor Stack
才能正确解码。您只定义了 JSON 拦截器,您还没有将它(与 defaultStack 一起)应用到操作中;做如下:
<action name="login" class="foo.bar.AdminLoginControllerImpl" method="login">
<interceptor-ref name="json" />
<interceptor-ref name="defaultStack" />
<result type="json">
<param name="root">result</param>
</result>
</action>
2) 为了工作,JSON 拦截器要求请求的 contentType
为 application/json
:
...
dataType: 'json',
contentType: 'application/json',
...
3)你挂载发送数据的javascript代码错误,花括号不能转义:
// wrong
var userInfo = '{"userEmail":"'+email+'" , "password":"'+password+'}';
// right
var userInfo = {"userEmail":email , "password":password};
4) 页面中的变量名称与操作中的变量名称不匹配。您如何期望 userEmail
匹配 user.userEmailId
?或者 password
到 user.userpassword
?
修复它,它应该可以工作。
通过发送正确的 json 对象解决了问题,例如
var obj = {"userInfo":{"userEmail":email , "userPassword":password}};
下面的struts.xml是配置。
<package namespace="/login" name="login" extends="json-default">
<interceptors>
<interceptor-stack name="defaultStack">
<interceptor-ref name="json">
<param name="enableSMD">true</param>
</interceptor-ref>
</interceptor-stack>
</interceptors>
<default-interceptor-ref name="defaultStack" />
<action name="login"
class="com.warnerbros.nts.controller.impl.AdminLoginControllerImpl"
method="login">
<interceptor-ref name="defaultStack" />
<result type="json">
<param name="root">result</param>
</result>
</action>
</package>