要Struts2支持JSON,需要加进一个叫jsonplugin的插件,配置文件里让Struts2的package继承一个叫“json-default”的package。配置完毕之后,服务端与客户端之间的数据传递就可以使用同一的json格式,显得比较人性化。
?
<%@ page language="java" contentType="text/html; charset=UTF-8"
??? pageEncoding="UTF-8"%>
<%@ 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>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>登录页</title>
<script type="text/javascript" src="js/jquery.js"></script>
<script type="text/javascript">
??? $(function(){
??????? $("#submit").click(function(){
??????????? var loginName1 = $("input[name='loginName']").val();??? //获取账号
??????????? var password1 = $("input[name='password']").val();??????? //获取密码
?
??????????? var jsonUser = {loginName:loginName1, password:password1};??? //JSON对象
??????????? //jsonUser.toString()这种方法错误,javaScript中的toString是用于布尔型变的,
????????????var strUser = JSON.stringify(jsonUser);??? //将JSON对象转变成JSON格式的字符串,
???????????
??????????? $.post("user/login.action", {json: strUser}, callback, "json");
??????? });
?
??????? function callback(json){
??????????? alert(json.msg);??? //显示反馈信息
??????????? if(json.success == 1){??? //如果返回"登录成功"
??????????????? window.location.href = "admin/index.action";??? //跳转到后台主页
??????????? }
??????? }
???????
??? });
</script>
</head>
<body>
?
<form action="user/login.action" method="post">
??? 账号<input type="text" name="loginName"/><br/>
??? 密码<input type="password" name="password"><br/>
??? <input type="button" id="submit" value="登录"/>
</form>
?
</body>
</html>
var jsonUser = {loginName:loginName1, password:password1};??? (1)
var strUser = JSON.stringify(jsonUser);???????????????????????????????????????? (2)
第(1)句是组装JSON对象,关于JSON对象的格式,建议大家到http://www.json.org/网站上学习一下,要验证你写的JSON对象是否正确,可在http://json.bloople.net/网站上验证。上面写的JSON对象其实是非常简单的一种,jsonUser对象里有两个属性,分别是loginName和password,而表示这两个属性,用key-value的形式,loginName1和password1分别是接收表单中的账号、密码的值。
第(2)句,相当重要,通过JavaScript内置对象JSON的stringify方法,将JSON对象转换成字符串。因为,我们传送给服务器端的要是JSON格式的字符串。
$.post("login!valid.action", {json: strUser}, callback, "json");
这一句,Jquery用POST方法向服务器端发送数据,login!valid.action是我们要发送到的目的URI,也即直达loginAction的valid方法。而{…}是我们要发送的数据(data),{json:strUser},其实也是一个JSON对象,Key:value的形式。在Action那里接收时,要接收“json”这个变量,这个变量的值就是我们发送的strUser字符串。
回调函数(callback)是指服务器端成功发回时,在JS端执行的函数。最后一个参数“json”是返回数据类型的一种,另外,还有”text”、“xml”等。
?
import java.io.IOException;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts2.ServletActionContext;
import org.json.JSONObject;
import cn.simple.pojo.User;
import com.opensymphony.xwork2.ActionSupport;
?
//@Results({ 注解的配制方式
//??? @Result(name="success", location="admin/index.action", type="redirect"),
//??? @Result(name="input", location="loginform.jsp", type="dispatcher")
//})
public class LoginAction extends ActionSupport {
?
??? private String json;??? //JSON字符串,JS与Action传递数据的载体
??? public String getJson() {
??????? return json;
??? }
??? public void setJson(String json) {
??????? this.json = json;
??? }
?
??? /**?
???? * 登录验证
???????* 这里是void类型,不会发生调整,直接像servlet那样输出html代码,最终由客户端解析
????? * 调用原生Servlet的response来向浏览器端发送数据
???? * @throws Exception
???? */
??? public void valid() throws Exception {
??????? JSONObject jsonObj = new JSONObject(json);??? //将JSON格式的字符串构造成JSON对象
??????? String loginName = jsonObj.getString("loginName"); //获取JSON对象中的loginName属性的值
??????? String password = jsonObj.getString("password");??? //获取JSON对象中的password属性的值
???????
??????? if(loginName=="admin"){
??????????? //此时的JSON对象,有两个属性success和msg,其中suc表示是否登录成功的状态
??????????? json = "{success:0, msg:'用户名不存在'}";??? //构造JSON格式的字符串
??????? } else if( ! password.equals("123")){
??????????? json = "{success:0, msg:'密码不正确!'}";
??????? } else {
??????????? json = "{success:1, msg:'登录成功!'}";
??????? }
??????? sendMsg(json);??? //发送JSON格式的字符串回JS端
??? }
???
??? /** *//**
???? * 向客户端的JS发送字符串
???? * @param content 发送的内容
???? * @throws IOException
???? */
??? public void sendMsg(String content) throws IOException{
??????? HttpServletResponse response = ServletActionContext.getResponse();
??????? response.setCharacterEncoding("UTF-8");
??????? response.getWriter().write(content);
??? }
???
}
?