Struts2+JSON 实现AJAX 返回对象和列表
- 格式:doc
- 大小:197.50 KB
- 文档页数:11
1、引入包(本文中的包全部引自struts-2.1.8.1\lib):struts2-json-plugin-2.1.8.1.jarjson-lib-2.1.jarcommons-collections-3.2.jarcommons-beanutils-1.7.0.jarcommons-lang-2.3.jarcommons-logging-1.0.4.jarezmorph-1.0.3.jar这7个包是返回json形式的数据必须的。
因为json大量引用了Apache commons的包,所以要加入4个,commons包,除了commons的包外,还需要引入一个ezmorph的包。
最后加入struts2必须的6个包:struts2-core-2.1.8.1.jarxwork-core-2.1.6.jarognl-2.7.3.jarfreemarker-2.3.15.jarcommons-fileupload-1.2.1.jarcommons-io-1.3.2.jar2、后台:1) Userinfo实体类代码public class UserInfo implements Serializable {private int userId;private String userName;private String password;get set方法略}2) Action类public class TestAction extends ActionSupport {private String message; //使用json返回单个值 private UserInfo userInfo; //使用json返回对象 private List userInfosList; //使用josn返回List对象get set方法略/*返回单个值*/public String returnMsg(){this.message = "成功返回单个值";return SUCCESS;}/*返回UserInfo对象*/public String returnUser(){userInfo = new UserInfo();userInfo.setUserId(10000);userInfo.setUserName("刘栋");userInfo.setPassword("123456");return SUCCESS;}/*返回List对象*/public String returnList(){userInfosList = new ArrayList<UserInfo>();UserInfo u1 = new UserInfo();u1.setUserId(10000);u1.setUserName("张三");u1.setPassword("111111");UserInfo u2 = new UserInfo();u2.setUserId(10001);u2.setUserName("李四");u2.setPassword("222222");userInfosList.add(u1);userInfosList.add(u2);return SUCCESS;}}3) struts.xml(必须继承json-default、json-default继承自struts-default)<package name="default" namespace="/json" extends="json-default"><action name="returnMsg" class="com.testAction " method="returnMsg"> <result name="success" type="json"><param name="root">validate</param></result></action><action name="returnUser "class="com.testAction " method="returnUser "><result name="success" type="json"><param name="includeProperties">userInfo\.userId,userInfo\.userName,userInfo\.password</param></result></action><action name="returnList" class="com.testAction "method="returnList"><result name="success" type="json"><param name="includeProperties">userInfosList\[\d+\]\.userName,userInfosList\[\d+\]\.password </param></result></action></package>4、只要继承extends="json-default",result type设置成json之后,容器会把action的属性自动封装到一个json对象中(json拦截器来做)5、includeProperties 参数:输出结果中需要包含的属性值,这里正则表达式和属性名匹配,可以用“,”分割填充多个正则表达式。
在上一篇博文中已经学习了如何整合mybatis和spring,实现持久层的CRUD操作、业务层的事务管理和spring的IoC。
现在我们这个demo的基础上,继续整合struts2,并利用json插件和jquery实现ajax,完成后系统将实现登录与注册的简单功能。
浏览器端如何简单、高效地与服务器端进行数据交互是web开发者最为关心的内容。
在客户端构造intput表单数据或者拼凑URL参数名称/参数值,然后在服务器端笨拙地用request.getParameter(“参数名称”)获取参数显然已经过时了,在struts2中,只要在action 里定义了input表单名称/URL参数名称对应的String类型属性,并设置getter和setter 方法,struts2在调用action的时候就可以根据参数值自动帮你设置好action中对应的属性值供你使用,这极大地方便了开发者。
但是json更为强大——它可以根据浏览器端上传的符合格式的数据设置action中对象的值,也就是说,struts2自动封装的数据只有一层,而json是无限层。
json给页面参数的传递带来极大的方便,结合jquery来使用,可以轻易地做到页面局部刷新、页面无跳转进行友好的系统异常提示等,其中后者是我觉得最有必要做到的一点,在action中定义一个message变量,把action方法执行的结果或者系统异常信息放到里面以json的方式返回给客户端,客户端根据这个变量的结果来进行下一步的操作或者提示系统异常信息,非常地好用。
json由javascript中的对象和数组构成,基本形式是{key:value},key为属性名称,value 为属性值,value可以为数字、字符串、数组、对象,value可以为数组和对象是json可以封装无限层数据的关键所在。
至于如何建构和解析json不是本篇博文的详细表述范围,请参考其他资料。
现在就让我们利用struts2作为MVC框架,整合json插件,在浏览器端使用jquery解析和系列化json数据,由此制作一个具有登陆/注册功能的小demo。
ajax格式及用法Ajax(AsynchronousJavaScriptandXML)是一种使用客户端脚本(通常是JavaScript)与服务器交互的强大技术。
通过Ajax,我们可以实现异步的、基于事件的、基于浏览器的数据请求,从而极大地提高了网页的交互性和响应性。
本篇文章将详细介绍Ajax的格式及用法。
一、Ajax请求格式Ajax请求的基本格式如下:`XMLHttpRequest对象.open(method,url,async,user,password);`其中,method表示请求方法,如GET或POST;url表示请求的URL;async表示是否异步请求,通常为true;user和password用于HTTP认证。
在请求中,我们通常会发送一些数据,这些数据可以以查询字符串的形式附加在URL之后,也可以作为POST请求的数据主体发送。
这些数据可以通过JavaScript对象来创建,或者从XML、JSON或其他数据源获取。
二、Ajax请求示例以下是一个简单的AjaxGET请求示例:`varxhr=newXMLHttpRequest();xhr.open("GET","data.json",true);xhr.onreadystatechange=function(){if(xhr.readyState==4&&xhr.status==200){//请求成功,将返回的数据处理成JSON格式并输出到consolevardata=JSON.parse(xhr.responseText);console.log(data);}};xhr.send();`在这个示例中,我们创建了一个新的XMLHttpRequest对象,并打开了到"data.json"的GET请求。
当请求状态改变时,我们检查请求是否成功,并使用JSON.parse将返回的文本转换为JSON格式。
jQuery操作Ajax和Json嗯,自己学SSH和做项目也已有两个月了。
自己今天来整理一下自己在项目中利用jQuery操作过的Ajax和Json。
当时我对于jQuery操作Ajax几乎不怎么了解,但是项目中有需求,所以自己也是必须要去使用,因此现在来详细讲解一下自己在项目中的操作。
功能中,有一个下拉框,里面存储的是服务商的信息,首选项是“--请选择--”,当我选择第一个下拉框中服务商信息之后,后面紧接着将会得到这个选定的服务商下的所有产品。
做一个联动操作。
虽然我不会用jQuery操作Ajax,但是我第一反应就是想到利用这块技术,于是自己就开始查找对应的资料了。
首先,我在Action中,将服务商的信息从数据库查找出来,保存到List集合中,将集合转发到JSP界面上,利用的是struts2标签:<div><s:select name="provider.iscenicid"list="#request.providerList"listKey="i scenicid"listValue="szcenicname"headerKey=""headerValue="--请选择"onchange="onChangeOptionScenic(this)"id="scenicType"/></s:select><span id="productInfo"></span></div>(ps:其实这个里面,本不应该设置headerKey和headerValue,应该在Action中在List集合中去增加一行再进行操作。
)中间的span标签就是将要利用jQuery操作Ajax把产品信息增加到span标签里面!其次,进行jQuery操作Ajax了:<script>function onChangeOptionScenic(_this) {// 获取下拉框中的listKey值var iscenic =$(_this).val();// 设置一个变量,来进行下面的操作var htmltv ="";// 设置URL地址var url ="/tips/travelmessage.action";// Ajax操作开始$.ajax ({// 设定URLurl : url,// 设置提交方式,这里为posttype : "post",// 设置数据类型为JsondataType : "json",// 设置传过去的值的属性名data : {"iscenicid" : iscenic},// 成功返回之后的操作方法success : function(result) {// 获取Action中传回来的result的值var json =eval("("+result+")");// 循环将服务商下的产品以复选框形式拼接出来for(var i=0; i<json.length; i++) {// 将产品信息以复选框形式拼接起来htmltv +="<input type='checkbox' name='productNa me'value='"+json[i].productId+"'/>"+json[i].prod uctName;}// 添加到上面的span标签中$("#productInfo").val(htmltv);}});}</script>最后,将result进行一个映射文件的配置,配置信息如下(根据公司的一些设定而操作):<action name="travelmessage"class="com.web.system.tips.TravelMessageAction" method="trav elMessage"><result type="json"><param name="root">result</param></result></action>在TravelMessageAction中,需要将内容返回到result中,部分代码如下:List productList = travelMessageService.getProductInfo(product);JSONArray json =new JSONArray().fromObject(productList);result = json.toString();return SUCCESS;至此,一个完整的操作已完成,这就是自己的一点点整理,希望以后有更多的有技术的知识与大家分享!。
Struts2配置json数据返回(作者:张宗杰时间:2012-05-07)从事软件编程工作近3个月来,在项目中经常的使用到json数据格式。
由于公司的框架已经高度封装好了,我们只需用java调用相关的类,即可向浏览器返回json数据格式,但本人对这个十分好奇,今天抽空研究了下在struts2下如何自己配置json数据返回方法。
首先,在myeclipse中新建一个java web工程,接着引入Struts2必须的jar包,这时要使用json,还需多引入一个名字为“struts2-json-plugin-2.3.1.2.jar”的jar包(版本号和你下载的struts2有关,本人使用的是struts-2.3.1.2),结构如图1所示:图1jar包引入同时把jquery.js也放到工程中,后面采用javascript读取出服务器返回的json数据。
然后配置web.xml文件,具体步骤不说了,如果不会struts2的,自己先去学习一下,然后再看本文章。
然后在struts.xml中新增如图2所示代码,用于strust2识别json:图2json配置我们可以自己手工的用java代码输出json数据格式,同时也可以使用很多开源的类来来实现(可以访问去下载java的json相关类)。
在这里,我使用org.json。
下载下来后,解压出源码,对照着在myeclipse中建立出包结构,把这些源代码放到里面,如图3所示:图3引入org.json接着在com.ajie包下建立JsonTest.java类,继承ActionSupport类。
然后建立一个方法,实现向客户端返回http的数据,如图4所示:图4接着实现strust2的execute方法,代码如图5所示:图5上述代码,封装了2个json值,分别是test和msg。
然后在index.jsp中编写html代码和js代码,html代码如图6所示:图6Js代码如图7所示:图7然后将web工程部署到tomcat中,运行,打开浏览器,运行后看到如图8所示界面:图8接着,打开firebug,点击按钮后观察http的传输流程,结果如图9所示:图9浏览器也将弹出一个对话框,显示json中test对应的值,如图10所示:图10本文只是讲述了如何在struts2中使用json,只要稍微修改就可以在项目中运用。
Struct2_使⽤Ajax调⽤Action⽅法并返回值⼀、Login.jsp1、<head>引⼊jquery:<script type="text/javascript"src="/ajax/jQuery/jquery-1.7.1.js"></script>2、界⾯控件:⽤户名:<input type="text"id="userName"><input type="button"id="btnAjax"value="Ajax调⽤"/>3、提交ajax请求<script type="text/javascript">$(function() {$("#btnAjax").click(function() {var userName = $("#userName").val().trim();if (userName == '') {alert("⽤户名不能为空");return false;}//login1为Action类命名空间名称;AjaxExecute为Action⽅法名称$.ajax({type : "post",url : '/login1/ajaxExecute',data : {//设置数据源userName : userName,password : "我是密码"},dataType : "json",//设置需要返回的数据类型success : function(d) {alert(d.sayHi);},error : function(d) {alert(d.responseText);}});});});</script>⼆、后台类:LoginActionNoNamespcepackage action;import java.text.SimpleDateFormat;import java.util.Date;import java.util.HashMap;import java.util.Map;import org.apache.struts2.convention.annotation.Action;import space;import org.apache.struts2.convention.annotation.ParentPackage;import org.apache.struts2.convention.annotation.Result;import org.apache.struts2.interceptor.validation.SkipValidation;import freemarker.template.SimpleDate;@ParentPackage("json-default")@Namespace("/login1")public class LoginActionNoNamespce extends SuperActionSupport {private static final long serialVersionUID = 1L;private Map<String, String> dataMap;//会把本类所有getter⽅法序列化成字符串返回给jsp页⾯public Map<String, String> getDataMap() {return dataMap;}public void setDataMap(Map<String, String> dataMap) {this.dataMap = dataMap;}@SkipValidation@Action(value = "ajaxExecute", results = { @Result(type = "json", params = { "root", "dataMap" }) })public String ajaxExecute() throws Exception {this.dataMap = new HashMap<String, String>();// 参数名称必须和jsp的空间名称⼀⼀对应String userName = request.getParameter("userName");String password = request.getParameter("password");dataMap.put("isSuccess", "true");SimpleDateFormat now = new SimpleDateFormat("yyyy年MM⽉dd⽇ HH时mm分ss秒");dataMap.put("sayHi", "Hi:" + userName + " 当前时间为:" + now.format(new Date()) + password);return SUCCESS;}}三、注意事项1. 类注解:@ParentPackage("json-default"),⽐如为json-default,不能为struts-defaultjson-default是继承于structs-default的,见.m2\repository\org\apache\struts\struts2-json-plugin\2.3.16.3\struts2-json-plugin-2.3.16.3.jar\struts-plugin.xml2. Action注解:@Action(value = "ajaxExecute", results = { @Result(type = "json", params = { "root", "dataMap" }) }),这⾥的type必须为json、root是固定值,去掉params节点会返回undefined3. 这⾥的dataMap定义为:private Map<String, String> dataMap;必须要添加getter、setter参数,否则返回null4. JSP页⾯(这⾥可以⽤命名空间,如url : '/login1/ajaxExecute', @ParentPackage("json-default")这样设置就不会报错)5. maven管理,需要引⽤的库<dependencies><dependency><groupId>org.apache.struts</groupId><artifactId>struts2-core</artifactId><version>2.3.16</version><exclusions><exclusion><groupId>org.javassist</groupId><artifactId>javassist</artifactId></exclusion></exclusions></dependency><dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId><version>3.1.0</version></dependency><dependency><groupId>org.apache.struts</groupId><artifactId>struts2-convention-plugin</artifactId><version>2.3.16.3</version></dependency><dependency><groupId>org.apache.struts</groupId><artifactId>struts2-json-plugin</artifactId><version>2.3.16.3</version></dependency><dependency><groupId>net.sf.json-lib</groupId><artifactId>json-lib</artifactId><version>2.4</version></dependency></dependencies>。
ajax 调用方法Ajax调用方法详解Ajax(Asynchronous JavaScript and XML)是一种用于创建快速动态网页的技术,它通过在后台与服务器进行少量数据交换,实现了网页无需刷新即可更新部分内容的功能。
在前端开发中,Ajax的应用非常广泛,本文将详细介绍几种常见的Ajax调用方法。
一、XMLHttpRequest对象XMLHttpRequest是Ajax的核心对象,它用于与服务器进行数据交互。
通过创建XMLHttpRequest对象并调用其相关方法,可以实现异步加载数据、发送数据到服务器等操作。
创建XMLHttpRequest对象的方法如下:```javascriptvar xhr;if (window.XMLHttpRequest) {xhr = new XMLHttpRequest(); // 非IE浏览器} else if (window.ActiveXObject) {xhr = new ActiveXObject('Microsoft.XMLHTTP'); // IE浏览器}```使用XMLHttpRequest对象发送GET请求的方法如下:```javascriptxhr.open('GET', 'data.php?param1=value1¶m2=value2', true);xhr.onreadystatechange = function() {if (xhr.readyState === 4 && xhr.status === 200) {var response = xhr.responseText;// 处理服务器返回的数据}};xhr.send();```使用XMLHttpRequest对象发送POST请求的方法如下:```javascriptxhr.open('POST', 'data.php', true);xhr.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');xhr.onreadystatechange = function() {if (xhr.readyState === 4 && xhr.status === 200) {var response = xhr.responseText;// 处理服务器返回的数据};xhr.send('param1=value1¶m2=value2');```二、jQuery的Ajax方法jQuery是一款功能强大的JavaScript库,它封装了许多常用的操作,包括Ajax。
ajax原理和实现步骤
Ajax的原理是利用前端的XMLHttpRequest对象与后端的服务
器进行异步通信,实现页面局部的更新。
实现步骤如下:
1. 创建XMLHttpRequest对象:使用`new XMLHttpRequest()`
创建一个新的XMLHttpRequest对象。
2. 设置回调函数:使用`onreadystatechange`属性设置一个回调
函数,在服务器响应发生改变时触发。
3. 打开请求:使用`open()`方法打开与服务器的连接,传入请
求的方法和URL。
4. 发送请求:使用`send()`方法将请求发送给服务器。
5. 监听状态变化:在回调函数中,使用`readyState`属性来判断服务器的响应状态,当`readyState`等于4时表示请求完成。
6. 处理服务器响应:通过`status`属性获取服务器的响应状态码,常见的有200表示成功,404表示未找到。
然后使用
`responseText`或者`responseXML`来获取服务器的响应数据。
7. 更新页面内容:通过获取到的响应数据,可以使用DOM操
作或者innerHTML来更新页面的内容。
以上就是Ajax实现的基本步骤,通过异步通信可以实现无需
刷新整个页面的数据更新。
AJAX的callback用法概述A J AX(A sy nc hr on ou s Ja va Sc ri pt an dXM L)是一种用于创建无需刷新整个页面的异步请求的技术。
通过A JAX,可以实现与服务器进行数据交换而不需要刷新页面,提高用户体验和页面性能。
其中,ca l lb ac k函数在AJ AX请求完成后执行,用于处理服务器返回的数据。
什么是call back函数在J av aS cr ip t中,c a ll ba ck函数是一种作为参数传递给其他函数并在特定事件或条件发生时执行的函数。
在A JA X中,c al lb ac k函数通常用于处理响应数据,例如更新前端界面或处理返回的数据。
使用AJA X进行请求f u nc ti on ge tD at a(){v a rx hr=n ew XM LH ttp R eq ue st();x h r.op en("GE T","u r l",t ru e);x h r.on re ad ys ta tec h an ge=f un ct io n(){i f(x hr.r ea dy St ate===4&&x hr.s ta tus===200){v a rd at a=JS ON.p ars e(x hr.r es po ns eTe x t);c a ll ba ck(d at a);}};x h r.se nd();}f u nc ti on ca ll ba ck(d at a){//处理响应数据的逻辑}上述代码展示了使用A JA X进行G E T请求的基本模板。
当请求状态(`xh r.re ad yS ta te`)为4且响应状态(`x hr.s ta tu s`)为200时,即请求成功,通过`J SO N.p ar se()`方法将返回的JS ON数据解析为J a va Sc ri pt对象,并将其作为参数传递给c al lb ac k函数进行处理。
ajax原理和实现步骤Ajax原理和实现步骤。
Ajax(Asynchronous JavaScript and XML)是一种用于创建快速动态网页的技术。
它允许网页在不重新加载整个页面的情况下更新部分内容,从而提高了用户体验。
本文将介绍Ajax的原理和实现步骤。
一、原理。
Ajax的原理是利用JavaScript和XMLHttpRequest对象与服务器进行异步通信。
当用户与网页交互时,JavaScript会向服务器发送请求,服务器接收请求后处理数据并返回结果,JavaScript再将结果更新到网页上,整个过程都在后台进行,用户不会感到页面的刷新。
二、实现步骤。
1. 创建XMLHttpRequest对象。
要使用Ajax,首先需要创建一个XMLHttpRequest对象。
这可以通过以下代码实现:```javascript。
var xhr = new XMLHttpRequest();```。
2. 发送请求。
一旦创建了XMLHttpRequest对象,就可以使用open()和send()方法向服务器发送请求。
open()方法指定请求的类型、URL和是否异步处理,send()方法将请求发送到服务器。
```javascript。
xhr.open('GET', 'example.php', true);xhr.send();```。
3. 接收响应。
当服务器返回响应时,XMLHttpRequest对象会触发一个事件。
可以通过onreadystatechange属性指定响应的处理函数。
```javascript。
xhr.onreadystatechange = function() {。
if (xhr.readyState === 4 && xhr.status === 200) {。
// 处理服务器返回的数据。
var response = xhr.responseText;// 更新网页内容。
ajax的数据类型摘要:1.AJAX 简介2.AJAX 数据类型的含义3.AJAX 的数据类型分类4.实际应用中的数据类型示例5.结语正文:一、AJAX 简介AJAX(Asynchronous JavaScript and XML)即异步JavaScript 和XML,是一种用于在不重新加载整个页面的情况下,与服务器交换数据并更新部分网页内容的技术。
通过使用JavaScript 和XMLHttpRequest 对象,可以实现异步请求服务器数据,使得网页在加载时不需要等待数据完全加载,从而提高用户体验。
二、AJAX 数据类型的含义在AJAX 中,数据类型指的是服务器返回的数据的类型。
这些数据可以是HTML、XML、JSON、纯文本等不同格式的信息。
根据服务器返回的数据类型,AJAX 可以进行相应的处理,例如更新页面内容、处理错误信息等。
三、AJAX 的数据类型分类1.XML(可扩展标记语言):XML 是一种用于描述数据结构的标记语言。
在AJAX 中,服务器返回的XML 数据需要通过XML 解析器进行解析,然后根据解析结果更新页面内容。
2.JSON(JavaScript 对象表示法):JSON 是一种轻量级的数据交换格式,易于阅读和编写。
在AJAX 中,服务器返回的JSON 数据可以直接用JavaScript 进行解析和处理。
3.HTML:服务器返回的HTML 数据可以直接插入到页面的DOM(文档对象模型)中,用于更新页面内容。
4.纯文本:服务器返回的纯文本数据可以用于显示在页面上,或者作为其他处理的输入数据。
四、实际应用中的数据类型示例假设一个网页需要从服务器获取一篇文章的详细内容,服务器返回的数据可能是如下格式的JSON:```json{"title": "文章标题","author": "作者","content": "文章正文"}```在AJAX 请求成功后,JavaScript 可以根据返回的JSON 数据更新页面内容,例如显示文章标题、作者信息等。
easyui 结合Struts2 总结1 在把struts2框架搭好以后,由于easyui和后台交互主要是靠ajax来进行的并且返回的数据格式是json形式的。
所以我们必须在项目中引入struts2-json-plugin 来方便的把数据转换为json格式。
需要的jar包如下图:下面是我写的一个小例子,来更好的说明之间数据是如何传递的。
(为了节省篇幅,数据库表就省略了)jsp页面主要代码如下:当我们把页面写好以后就要写action类了。
主要代码如下:get、set方法这里就省略了。
接下来就是在struts.xml 中进行配置了。
代码如下这里要特别注意了,继承的是json-default, result 中德type是json。
这里的配置是关键,起初由于配置问题,花了我很多时间。
然后就是写EmpService类和getAll方法了。
代码如下这里我是把对象先放到map集合中,让和放到list集合中,这样就自动转为json 格式(感觉有些麻烦,谁有好的方法,请发送到zl673170035@,谢谢哈)然后在浏览器上运行。
在js 中加入了工具条。
剩下的修改、删除、增加,我是仿照easyui官网的demo中的一个例子做的。
我遇到的主要问题就是,ajax 如何把参数传给action和ajax如何接收action传回的参数。
首先说说第一个问题,ajax 如何把参数传给action.。
只要action 中有相对应的get和set 方法。
我们发起ajax请求时struts就自动的把参数加到action中了。
这里把参数名都变为emp.XX 然后在action 中加入成员变量emp和get、set 方法。
这样action就能接收值了。
接下来需要从action中给ajax中传递参数了。
我们在struts.xml中如下配置在action中设置result 的get、set 方法。
这样ajax就能接收到action传回的参数了。
ajax.request 用法-回复AJAX (Asynchronous JavaScript and XML) 是一种用于创建快速动态网页的技术。
它利用JavaScript和XML来向服务器发送和接收数据,通过不刷新整个网页就能更新特定部分的内容。
在本文中,我们将深入探讨AJAX.request的用法,介绍它的步骤和示例,以帮助读者更好地理解和应用这一技术。
第一步:理解AJAX.request的概念和作用AJAX.request是一个常用的AJAX库(library)中的函数,它用于向服务器发送异步HTTP请求。
它的作用是与Web服务器进行通信,从服务器获取数据并将其显示在网页上,同时也能将用户在网页上的操作发送给服务器进行处理。
使用AJAX.request,我们可以创建交互性强、用户体验优秀的网页应用程序。
第二步:导入AJAX库在使用AJAX.request之前,我们需要导入相应的AJAX库。
常用的AJAX 库有jQuery、Prototype、Dojo等。
我们可以在项目中引入这些库的CDN 链接或者将这些库下载到本地并直接引入。
确保在引入AJAX库之前,也要确保已经引入了jQuery或其他支持库。
第三步:使用AJAX.request发送HTTP请求在导入AJAX库之后,我们可以使用AJAX.request函数发送HTTP请求。
语法如下:javascriptajax.request({method: "GET", 请求的方法(GET / POST / PUT / DELETE等)url: "api/data", 请求的URLdata: {}, 请求时发送的数据(可以是一个JSON对象)success: function(response) {请求成功时的回调函数},error: function(error) {请求失败时的回调函数}})上述代码将发送一个简单的GET请求到指定的URL,并定义了请求成功和请求失败时的回调函数。
The JSO N p lug in p ro vid es a "js on" re sult type that se ria lizes a ctio ns into JSO N. The se ria liza tion p ro cess is re curs ive, me aning that the w ho le ob je ct g r a ph, s ta rting on the a ctio n class (b ase class not include d) w ill b e s e ria lize d (r o ot ob je ct ca n be cus to mize d us ing the "ro ot" a ttribute). If the inte rcep to r is used, the a ction w ill b e pop ulate d fro m the JSO N co ntent in the re ques t, thes e a re the rules o f the inte rce pto r:1The "conte nt-type" must be "a pp lica tio n/jso n"2The JSO N co nte nt mus t b e we ll fo rme d, s ee js on.o rg fo r g ra mma r.3Actio n mus t ha ve a p ub lic "s ette r" me tho d fo r fie ld s tha t mus t b e p o pula ted.4Sup po rte d type s fo r p op ula tio n a re: P rimitive s (int,long...String), Da te, Lis t, Map, P rimitive Arra ys, O the r cla ss (mo re o n this la te r), a nd Array o f O the r clas s.5Any o b je ct in JSO N, tha t is to b e p op ula ted ins ide a lis t, o r a ma p, w ill b e o f type Map (ma p p ing fro m p rope rtie s to va lues), a ny who le numbe r w ill b e o f type Long, a ny de cima l numbe r w ill be o f type Doub le, and a nya rra y o f type Lis t.JSON插件提供一种叫做“json”返回类型,来将action序列化成JSON 格式。
在Ajax返回值中,函数(function)通常指的是在服务器端执行的特定功能或方法。
这些函数可以被用于处理服务器返回的数据,或者在数据到达客户端之前进行一些处理。
例如,假设你有一个返回JSON数据的服务器端函数,你可以使用Ajax来调用这个函数并获取返回的数据。
在客户端,你可以使用JavaScript中的函数来处理这些数据。
下面是一个简单的示例,展示了如何使用Ajax调用服务器端函数并处理返回的数据:```javascript$.ajax({url: 'your_server_url',type: 'GET',dataType: 'json',success: function(data) {// 在这里处理返回的数据console.log(data);},error: function(error) {// 处理错误情况console.log(error);}});```在这个示例中,`$.ajax`函数用于发起Ajax请求。
`url`参数指定了请求的URL地址,`type`参数指定了请求的类型(GET、POST等),`dataType`参数指定了预期的返回数据类型(JSON)。
`success`回调函数在请求成功时被调用,它接收返回的数据作为参数。
你可以在这个函数中处理返回的数据,例如打印到控制台或执行其他操作。
`error`回调函数在请求失败时被调用,它接收一个包含错误信息的参数。
你可以在这个函数中处理错误情况,例如显示错误消息或执行其他操作。
需要注意的是,服务器端函数的具体实现取决于服务器端的编程语言和框架。
上述示例只是一个通用的示例,你需要根据实际情况调整代码以适应你的服务器端实现。
struts2标签详解A:<s:a xhref=""></s:a>-----超链接,类似于html里的<a></a><s:action name=""></s:action>-----执行一个view里面的一个action<s:actionerror/>-----如果action的errors有值那么显示出来<s:actionmessage/>-----如果action的message有值那么显示出来<s:append></s:append>-----添加一个值到list,类似于list.add();<s:autocompleter></s:autocompleter>-----自动完成<s:combobox>标签的内容,这个是ajaxB:<s:bean name=""></s:bean>-----类似于struts1.x中的,JavaBean的值C:<s:checkbox></s:checkbox>-----复选框<s:checkboxlist list=""></s:checkboxlist>-----多选框<s:combobox list=""></s:combobox>-----下拉框<s:component></s:component>-----图像符号D:<s:date/>-----获取日期格式<s:datetimepicker></s:datetimepicker>-----日期输入框<s:debug></s:debug>-----显示错误信息<s:div></s:div>-----表示一个块,类似于html的<div></div><s:doubleselect list="" doubleName="" doubleList=""></s:doubleselect>-----双下拉框E:<s:if test="#name=‟hujianqiang‟">asdfasdf</s:if><s:elseif test=""></s:elseif><s:else></s:else>-----这3个标签一起使用,表示条件判断F:<s:fielderror></s:fielderror>-----显示文件错误信息<s:file></s:file>-----文件上传<s:form action=""></s:form>-----获取相应form的值G:<s:generator separator="" val=""></s:generator>----和<s:iterator>标签一起使用H:<s:head/>-----在<head></head>里使用,表示头文件结束<s:hidden></s:hidden>-----隐藏值I:<s:i18n name=""></s:i18n>-----加载资源包到值堆栈<s:include value=""></s:include>-----包含一个输出,servlet或jsp页面<s:inputtransferselect list=""></s:inputtransferselect>-----获取form的一个输入<s:iterator></s:iterator>-----用于遍历集合L:<s:label></s:label>-----只读的标签M:<s:merge></s:merge>-----合并遍历集合出来的值O:<s:optgroup></s:optgroup>-----获取标签组<s:optiontransferselect doubleList="" list="" doubleName=""></s:optiontransferselect>-----左右选择框P:<s:param></s:param>-----为其他标签提供参数<s:password></s:password>-----密码输入框<s:property/>-----得到'value'的属性<s:push value=""></s:push>-----value的值push到栈中,从而使property标签的能够获取value的属性R:<s:radio list=""></s:radio>-----单选按钮<s:reset></s:reset>-----重置按钮S:<s:select list=""></s:select>-----单选框<s:set name=""></s:set>-----赋予变量一个特定范围内的值<s:sort comparator=""></s:sort>-----通过属性给list分类<s:submit></s:submit>-----提交按钮<s:subset></s:subset>-----为遍历集合输出子集T:<s:tabbedPanel id=""></s:tabbedPanel>-----表格框<s:table></s:table>-----表格<s:text name=""></s:text>-----I18n文本信息<s:textarea></s:textarea>-----文本域输入框<s:textfield></s:textfield>-----文本输入框<s:token></s:token>-----拦截器<s:tree></s:tree>-----树<s:treenode label=""></s:treenode>-----树的结构U:<s:updownselect list=""></s:updownselect>-----多选择框<s:url></s:url>-----创建urlStruts2常用的Ajax标签Struts2为了简化Ajax过程,提供了一些常用的Ajax标签,对于一些更复杂的Ajax通信过程,我们可以使用JSON插件来实现。
Struts2返回JSON数据的具体应用范例早在我刚学Struts2之初的时候,就想写一篇文章来阐述Struts2如何返回JSON数据的原理和具体应用了,但苦于一直忙于工作难以抽身,渐渐的也淡忘了此事。
直到前两天有同事在工作中遇到这个问题,来找我询问,我又细细地给他讲了一遍之后,才觉得无论如何要抽一个小时的时间来写这篇文章,从头到尾将Struts2与JSON的关系说清楚。
其实网络中,关于这个问题的答案已是海量,我当初也是从这海量的答案中吸收精华,才将“Struts2返回JSON数据”这个问题搞清楚的。
但是这些海量的答案,有一个共同的缺陷,就是作者们只关注问题核心,即“如何在具体的Struts2应用中返回JSON数据到客户端”如何实现,而对于"为何要这样实现"以及实现的本质却解释的不甚了了,在笔者看来这只是“授人以鱼”而非笔者所推崇的“授人以鱼的同时,授人以渔”。
在这篇文章中,笔者将总结前辈们的经验,并结合自己的理解,来从理论到实践由浅入深的说明“Struts2返回JSON数据”这一问题。
JSON(JavaScript Object Notation)首先来看一下JSON官方对于“JSON”的解释:JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。
易于人阅读和编写。
同时也易于机器解析和生成。
它基于JavaScript Programming Language, Standard ECMA-262 3rd Edition - December 1999的一个子集。
JSON采用完全独立于语言的文本格式,但是也使用了类似于C语言家族的习惯(包括C, C++, C#, Java, JavaScript, Perl, Python等)。
这些特性使JSON成为理想的数据交换语言。
JSON建构于两种结构:“名称/值”对的集合(A collection of name/value pairs)。
struts2反序列化原理Struts2 反序列化原理Struts2 是一个流行的 Java Web 应用程序框架,它使用 Java 反射和对象序列化来实现面向对象的开发模式。
在 Struts2 中,用户提交的数据将通过 HTTP 请求发送到服务器,并在服务器端进行处理。
其中一个重要的安全问题就是反序列化漏洞,攻击者可以利用这个漏洞执行恶意代码,从而导致严重的安全问题。
反序列化是将对象从字节流转换为内存对象的过程。
在 Struts2 中,用户提交的数据可以通过 HTTP 请求的参数传递给服务器端的Action 类。
这些参数将被解析并将其值设置到 Action 类的属性中,然后在服务器端进行处理。
由于 Struts2 使用了 Java 的反射机制,可以动态地创建对象并设置其属性值。
这就意味着,一个恶意用户可以通过构造特定的序列化对象来触发反序列化漏洞。
在 Struts2 中,反序列化漏洞主要是由于服务器端未正确验证和过滤用户提交的数据导致的。
攻击者可以构造一个特定的序列化对象,并将其作为参数传递给服务器端的 Action 类。
当服务器端尝试将该参数的值反序列化为对象时,恶意代码将被执行。
为了防止反序列化漏洞,开发者需要注意以下几点:1. 验证和过滤用户提交的数据:开发者应该对用户提交的数据进行验证和过滤,确保只有合法的数据才能被反序列化。
可以使用正则表达式、白名单等方式来验证和过滤数据。
2. 使用安全的序列化方式:在 Struts2 中,默认使用的是 Java 的序列化方式,这是一种不安全的方式。
开发者可以考虑使用其他安全的序列化方式,如 JSON、XML 等。
这些方式可以提供更好的安全性和灵活性。
3. 更新框架和依赖库:Struts2 框架和其依赖库经常会发布安全更新,开发者应及时更新框架和依赖库,以修复已知的安全漏洞。
4. 使用安全的配置:开发者应该确保 Struts2 的配置文件中没有暴露敏感信息,如数据库连接字符串、密码等。
1.系统分析与设计1.1系统功能描述本系统是个非常简单的注册、登录系统。
本系统的实现是基于Struts2、Spring、Hibernate三个框架,系统功能单一,业务逻辑简单。
当用户注册信用户时,就是向系统中增加一个新用户,对应的数据库增加一条记录。
当用户输入注册信息时,系统提供了基本的输入验证判断用户输入是否合法,只有当用户输入满足基本输入要求时,才会被提交到实际的登录系统,进行实际的登录处理。
系统还使用了随机产生的图形验证码来防止刷新,防止用户通过单击浏览器的书安心按钮来重复注册多个用户。
系统还提供了一种Ajax方式来验证用户输入的注册名是否有效,系统要求所有的用户名不能重复。
故当用户输完用户名后,系统立即在页面上方提示用户该用户名是否可用,如果系统中没有该用户名,则系统提示该用户名可用;否则提示用户该用户名重复,用户必须重新选择用户名注册。
当用户注册一个新用户名之后,就可以使用系统的登录功能来登录系统了,用户输入登录用的用户名、密码后,系统一样提供了基本的输入校验。
除此之外,系统还采用了随机产生图形验证码来防止恶意用户的暴力破解,系统随机生成一个图形验证码,而用户登录必须输入图形验证码中显示的字符串,只有用户输入的字符串和系统随机生成的验证码字符相同时,系统才允许用户登录。
1.2系统功能流程处理用户注册的流程图东北大学软件学院实践考核类课程(四)实验报告1.3数据库设计ColumnNarneDatatppe HOTH ULLAUTOI NC :FlagsDefaultValue Commentuser_id|S>INT(11)✓ ✓_|UNSIGNED _|ZEROFELLEBBQ username 心.VARCH.4.R(50]_|BINARYQ user_pass VARCHAR(50] ✓_|BIN4RYQ emailVARCHAR(100]1BIN4RY相关的映射文件:<hibernate-mapping package ="org.reg_login.model"><class name ="User"table ="usertable"〉<id name ="id"column ="user_id"><generator class ="identity"/> </id ><property name ="user"column ="user_name"not-null ="true"length ="50"unique ="true"/><property name ="pass"column ="userpass"n ot-null ="true"C=3length ="50"/><property name ="email"length ="100"/></class></hibernate-mapping >一旦提供了上面的映射文件,Hibernate 就可以理解User 和user_table 之间的对应关系。
Struts2+JSON 实现AJAX 返回对象和列表Struts2jsonAjaxStrutsJSPBeanJSON 是一个插件,它允许我们在JavaScript中异步调用Action,它提供了一个json的返回结果类型(ResultType),只要为Action指定类型为json返回结果类型,那么这个响应结果不需要返回给任何视图层,JSON会将Action里的状态信息序列化为JSON指定格式的数据,并将该数据返回给JAVASCRIPT,这样可以完成AJAX的应用交互.要应用 JSON 插件,首先需要到/p/jsonplugin/downloads/list下载最新JSON插件,我这里下载的是jsonplugin-0.33.jar ,将该文件拷到WEB工程的LIB目录,当然还需要下载Struts2 类库,可以到/download.cgi#struts2014这里去下载,下载完后解压缩,将JAR拷到WEB工程的LIB目录,不能少于以下几个JAR文件(struts2-api-2.0.5.jar、struts2-core-2.0.5.jar、ognl-2.6.9.jar、xwork-2.0.0.jar、commons-logging-1.1.jar、freemarker-2.3.8.jar,具体文件名视版本而定),接下来我们可以写个应用来试验,本例程分为二步来写,第一步实现返回一个结果对象,第二步实现返回一个结果列表,首先来看下返回结果对象的实现.我们需要先建立一个JavaBean 为值对象,用来将用户的基本数据封装进去,该实体在结果对象和结果列表中都会使用到Users.java 代码如下:Java代码1.package com.jsontostruts2.vo;2.3./**4.* <p>5.* 创建人:ChenTao6.* <p>7.* 创建日期:2009-5-18 下午05:24:488.* <p>9.*/10.public class Users {11.12.private Integer userId;13.14.private String userName;15.16.private String sex;17.18.public Users() {19.20.}21.// get... set.... 略......22.}实现 UserAction.java 源码如下:Java代码1.package com.jsontostruts2.action;2.3.import com.googlecode.jsonplugin.annotations.JSON;4.import ers;5.import com.opensymphony.xwork2.ActionSupport;6.7./**8.* <p>9.* 创建人:ChenTao10.* <p>11.* 创建日期:2009-5-18 下午05:22:5012.* <p>13.*/14.@SuppressWarnings("serial")15.public class UserAction extends ActionSupport {16.17.private Users users;18.19.@JSON(name="USER")20.public Users getUsers() {21.return users;22.}23.24.public void setUsers(Users users) {ers = users;26.}27.28.@Override29.public String execute() throws Exception {ers = new Users();ers.setUserId(1);ers.setUserName("ctojxzsycztao");ers.setSex("男人");34.return SUCCESS;35.}36.37.}接下来我们需要配置 struts.xml 文件,为了在现下面不再重复写该文件,这里我将结果对象和列表的请求控制一并贴上来,文件内容:Xml代码1.<?xml version="1.0" encoding="UTF-8"?>2.<!DOCTYPE struts PUBLIC3."-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"4."/dtds/struts-2.0.dtd">5.6.<struts>7.<!-- 注意这里扩展不再是 struts-default,而是 json-default -->8.<package name="jsonManager" extends="json-default">9.<!-- 返回结果类型为 json -->10.<action name="userJson"class="erAction">11.<result type="json"/>12.</action>13.<!-- 该action在返回列表时添加进来的 -->14.<action name="jsonlist"class="erListAction">15.<result type="json"/>16.</action>17.18.</package>19.</struts>能后创建web.xml 和 userjson.jsp:Xml代码1.web.xml :2.<?xml version="1.0" encoding="UTF-8"?>3.<web-app version="2.5" xmlns="/xml/ns/javaee"4.xmlns:xsi="/2001/XMLSchema-instance"5.xsi:schemaLocation="/xml/ns/javaee6./xml/ns/javaee/web-app_2_5.xsd">7.8.<filter>9.<filter-name>Struts2</filter-name>10.<filter-class>.apache.struts2.dispatcher.FilterDispatcher12.</filter-class>13.</filter>14.<filter-mapping>15.<filter-name>Struts2</filter-name>16.<url-pattern>*.action</url-pattern>17.</filter-mapping>18.<filter-mapping>19.<filter-name>Struts2</filter-name>20.<url-pattern>*.jsp</url-pattern>21.</filter-mapping>22.23.<welcome-file-list>24.<welcome-file>index.jsp</welcome-file>25.</welcome-file-list>26.</web-app>userjson.jsp :Html代码1.<%@ page language="java" contentType="text/html;charset=UTF-8"%>2.<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">3.<html>4.<head>5.<title>json 返回对象处理</title>6.<script language="javascript">7.var xmlHttp = false;8.try{9.xmlHttp = new ActiveXObject("msxml2.XMLHTTP");10.}catch(e1){11.try{12.xmlHttp = new ActiveXObject("microsoft.XMLHTTP");13.}catch(e2){14.try{15.xmlHttp = new XMLHttpRequest();16.}catch(e3){17.xmlHttp = false;18.}19.}20.}21.if(!xmlHttp){22.alert("create xmlHttpRequest fail");23.}24.function jsonResult(){25.xmlHttp.onreadystatechange = function(){26.if(xmlHttp.readyState == 4) {27.// 将 JSON 对象转换为JSON字符串,需要注意调用eval函数时必须使用"("和")"将JSON字符串括起来,否28.29.则会出错30.var userObj = eval('(' + xmlHttp.responseText + ')');31.var userStr = "<table border=0>";erStr += '<tr><td><b>userId</b></td><td>' + erId+ '</td></tr>';erStr += ('<tr><td><b>userName</b></td><td>' +erName + '</td></tr>');erStr += ('<tr><td><b>sex</b></td><td>' + ER.sex +'</td></tr>');erStr += "</table>";36.document.getElementById('jsonDiv').innerHTML = userStr;37.}38.}39.xmlHttp.open("POST","userJson.action",true);40.xmlHttp.send(null);41.}42.</script>43.</head>44.<body>45.<div id="jsonDiv"></div>46.<input type="button" value="show" onclick="jsonResult();">47.</body>48.</html>现在你可以将应用发布到你的容器当中输入http://localhost:8080/struts2ToJson/userjson.jsp点show,这个时候你可以看到你想要的结果,接来实现下返回列表的做法,当然与返回对象会有所不同,我们需要将一个List对象转换为一个JSON规范的字符串,能后发送给客户端的JS,首先建立一个将List 转换为指定字符串的工具类,该工具是在一个无意间从网上看到就拿来用了,经过少许修改,为了减少代码行数我将只贴出适用于本示例的代码:JsonUtil.java :Java代码1.package com.jsontostruts2.util;2.3.import java.beans.IntrospectionException;4.import java.beans.Introspector;5.import java.beans.PropertyDescriptor;6.import java.util.List;7.8./**9.* <p>10.* @author ChenTao11.* <p>12.* @Date 2009-5-18 下午05:47:2713.* <p>14.*/15.public class JsonUtil {16.17./**18.* @param object19.* 任意对象20.* @return ng.String21.*/22.public static String objectToJson(Object object) {23.StringBuilder json = new StringBuilder();24.if (object == null) {25.json.append("\"\"");26.} else if (object instanceof String || object instanceof Integer){27.json.append("\"").append((String)object).append("\"");28.} else {29.json.append(beanToJson(object));30.}31.return json.toString();32.}33.34./**35.* 功能描述:传入任意一个 javabean 对象生成一个指定规格的字符串36.*37.* @param bean38.* bean对象39.* @return String40.*/41.public static String beanToJson(Object bean) {42.StringBuilder json = new StringBuilder();43.json.append("{");44.PropertyDescriptor[] props = null;45.try {46.props = Introspector.getBeanInfo(bean.getClass(), Object.class)47..getPropertyDescriptors();48.} catch (IntrospectionException e) {49.}50.if (props != null) {51.for (int i = 0; i < props.length; i++) {52.try {53.String name = objectToJson(props[i].getName());54.String value =objectToJson(props[i].getReadMethod().invoke(bean));55.json.append(name);56.json.append(":");57.json.append(value);58.json.append(",");59.} catch (Exception e) {60.}61.}62.json.setCharAt(json.length() - 1, '}');63.} else {64.json.append("}");65.}66.return json.toString();67.}68.69./**70.* 功能描述:通过传入一个列表对象,调用指定方法将列表中的数据生成一个JSON规格指定字符串71.*72.* @param list73.* 列表对象74.* @return ng.String75.*/76.public static String listToJson(List<?> list) {77.StringBuilder json = new StringBuilder();78.json.append("[");79.if (list != null && list.size() > 0) {80.for (Object obj : list) {81.json.append(objectToJson(obj));82.json.append(",");83.}84.json.setCharAt(json.length() - 1, ']');85.} else {86.json.append("]");87.}88.return json.toString();89.}90.}UserListAction.java:Java代码1.package com.jsontostruts2.action;2.3.import java.util.ArrayList;4.import java.util.List;5.6.import com.googlecode.jsonplugin.annotations.JSON;7.import com.jsontostruts2.util.JsonUtil;8.import ers;9.import com.opensymphony.xwork2.ActionSupport;10.11./**12.* <p>13.* 创建人:ChenTao14.* <p>15.* 创建日期:2009-5-18 下午05:45:4216.* <p>17.*/18.@SuppressWarnings("serial")19.public class UserListAction extends ActionSupport {20.21./* 用于存放JSON生成后的字符串结果 */22.private String jsonResult;23.24.@JSON(name="JSONRESULT")25.public String getJsonResult() {26.return jsonResult;27.}28.29.public void setJsonResult(String jsonResult) {30.this.jsonResult = jsonResult;31.}32.33.@Override34.public String execute() throws Exception {35.List<Users> userList = new ArrayList<Users>();ers users = new Users();ers.setUserId(1);ers.setUserName("ctojxzsycztao");ers.setSex("男人");erList.add(users);ers = null;ers = new Users();ers.setUserId(2);ers.setUserName("rain");ers.setSex("女人");erList.add(users);ers = null;ers = new Users();ers.setUserId(3);ers.setUserName("mimi");ers.setSex("女人");erList.add(users);53.jsonResult = JsonUtil.listToJson(userList);54.System.out.println(jsonResult);55.return SUCCESS;56.}57.}接下来将要写一个jsonList.JSP页面来将结果承现给用户Html代码1.<%@ page language="java" contentType="text/html;charset=UTF-8"%>2.<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">3.<html>4.<head>5.<title>json 返回列表处理</title>6.<script language="javascript">7.var xmlHttp = false;8.try{9.xmlHttp = new ActiveXObject("msxml2.XMLHTTP");10.}catch(e1){11.try{12.xmlHttp = new ActiveXObject("microsoft.XMLHTTP");13.}catch(e2){14.try{15.xmlHttp = new XMLHttpRequest();16.}catch(e3){17.xmlHttp = false;18.}19.}20.}21.if(!xmlHttp){22.alert("create xmlHttpRequest fail");23.}24.function jsonListResult(){25.xmlHttp.onreadystatechange = function(){26.if(xmlHttp.readyState == 4) {27.var userList = eval('(' + xmlHttp.responseText + ')');28.var user = eval(userList.JSONRESULT);29.var result = "<table border=0>";30.result +="<tr><td>userId</td><td>userName</td><td>sex</td></tr>";31.for(var i=0;i<user.length;i++) {32.result += "<tr>";33.result += "<td>"+user[i].userId +"</td>";34.result += "<td>"+user[i].userName+"</td>";35.result += "<td>"+user[i].sex+"</td>";36.result += "</tr>";37.}38.result += "</table>";39.document.getElementById('jsonDiv').innerHTML = result;40.}41.}42.xmlHttp.open("POST","jsonlist.action",true);43.xmlHttp.send(null);44.}45.</script>46.</head>47.<body>48.<div id="jsonDiv"></div>49.<input type="button" value="show list"onclick="jsonListResult();">50.</body>51.</html>现在将工程重复部署到WEB容器,启动:在浏览器中输入http://localhost:8080/struts2ToJson/jsonList.jsp点 show list按钮,看看结果是否正确,如果不正确请参考本例程,看看有没漏掉部分没有配置进去,在以上代码中我们都有看到 @JSON 的注解,该注解可以改变JSON返回结果的属性名,好了文章就写到这里,需要下载示例的朋友可在附件中下载,里面包含有该文章的源代码和相应的 JAR。