Strut2 Ajax JSON Demo
一、背景
由于项目的需要重拾Struts,做的时候发现好多东西都忘了,写一个小小的demo,就花了大半天,还好最后终于调通了。
场景描述:前段页面输入用户名,后端将用户名和其他信息通过Ajax以Json的格式回传回来
使用工具:IDE:Myeclipse2014,服务器:Apache-tomcat-7.0.57,Struts-2.3.20及其lib,jQuery:jquery-1.11.2.min.js
需要引入的Struts包:两者需要的包有共同的地方,注意不要重复引入
Struts所需的包:
commons-fileupload-x.y.z.jar
commons-io-x.y.z.jar
commons-lang.x.y.jar
commons-lang3.y.jar
commons-logging-x.y.z.jar
commons-logging-api-x.y.jar
freemarker-x.y.z.jar
javassist-.xy.z.GA
ognl.jar
struts2-core.jar
xwork-core.jar
JSON需要的包:
commons-collections.jar
commons-lang.jar
commons-beanutils.jar
commons-logging.jar
ezmorph.jar
json-lib.jar
struts-json-plugin.jar
二、页面代码:
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%> <% String path = request.getContextPath(); String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <base href="<%=basePath%>"> <title>Welcome Login</title> <meta http-equiv="pragma" content="no-cache"> <meta http-equiv="cache-control" content="no-cache"> <meta http-equiv="expires" content="0"> <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> <meta http-equiv="description" content="This is my page"> <!-- <link rel="stylesheet" type="text/css" href="styles.css"> --> <script type="text/javascript" src="./javascript/jquery-1.11.2.min.js"></script>
<!--此处引用jQuery-->
<!-- 此段为Ajax与后端交互部分--> <script type="text/javascript"> $(document).ready(function(){ $("#usrname").change(function(){ $("logtip").empty(); $.ajax({ url : "login", // 后台处理程序,对应Action type : "post", // 数据发送方式 dataType : "json", // 接受数据格式 data:{ usrname : $("#usrname").val() }, // 要传递的数据 // 回传函数 timeout:20000, // 设置请求超时时间(毫秒)。 error: function () { //请求失败时调用函数。 $("#logtip").html("请求失败!"); }, success:function(dataObj){ //请求成功后回调函数。 //alert(dataObj); str = jQuery.parseJSON(dataObj); $("#echoname").html(str.usrname); $("#echowd").html(str.passwd); } }); }); }); </script> </head> <body> <div> 欢迎进入Struts2.3的世界 </div> <div> <div> <span>账号:</span> <span><input type="text" name="usrname" id="usrname"/></span> <span id="logtip"></span> </div> <div> <span>账号:</span> <span id="echoname"></span> <span>密码: </span> <span id="echowd"></span> </div> </div> </body> </html>
三、Struts.xml
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN" "http://struts.apache.org/dtds/struts-2.3.dtd"> <struts> <constant name="struts.enable.DynamicMethodInvocation" value="false" /> <constant name="struts.devMode" value="true" /> <package name="Check" namespace="/" extends="json-default"> <action name="login" class="demo.ajax.login.LoginAction" method="execute"> <result type="json"> <param name="root">result</param> </result> </action> </package> <!-- Add packages here --> </struts>
1、result中type设置成json之后,容器会把action的属性自动封装到一个json对象中(json拦截器来做),然后调用ajax的callback方法. 返回json数据。
我的做法是将map转换成了json格式的字符串,使用 root 参数返回的格式为 {"passwd":"success", "usrname":"love"},可以使用 jQuery.parseJSON 解析
2、根对象在JSON中数据添加一个”root”标识。如果要使用它,Action必须遵循以下几点:
1)返回的页面类型中”content-type”必须是”application/json”;
2)JSON内容必须是符合格式要求的;
3)Action中field必须有public的set方法(是不是没有set方法就不会将field添加到JSON数据中,有待验证);
4)它支持的类型有: 基本类型(int,long...String), Date, List, Map, Primitive Arrays, 其它class, 对象数组;
5)在JSON中任何的Object会被封装在list或map中,数据会被封装程Long,如果是含有的数据则会被封装程Double,数组会被封装程List。
3、除了root参数,另外还有includeProperties 参数,excludeProperties 参数,具体情况请查看参考文章中的 《struts2学习——struts2与json》
四、java代码
package demo.ajax.login; import java.util.HashMap; import java.util.Map; import net.sf.json.JSONObject; public class LoginAction { private String usrname; private String result; public String execute(){ String passwd="success"; Map map = new HashMap(); map.put("usrname", usrname); map.put("passwd", passwd); System.out.println(usrname);
/*此处将map转换为json格式的String类型*/ JSONObject jsonObj = JSONObject.fromObject(map); result = jsonObj.toString(); return "success"; } public String getUsrname() { return usrname; } public void setUsrname(String usrname) { this.usrname = usrname; } public String getResult() { return result; } public void setResult(String result) { this.result = result; } }
四、遇到的问题与总结
五、参考文章
struts2学习——struts2与json http://huing.blog.51cto.com/1669631/1286327
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。