struts2中jQuery的异步交互有两种方式:
1)是利用构造字符串的方式来实现;
使用该方法主要是在服务器端根据前端的请求,返回一个字符串信息,然后前端的jQuery通过解析该字符串信息得到对应的请求内容。该方法优点是使用比较灵活,缺点是使用比较复杂。
2)是利用struts自带的jQuery插件来实现。
使用插件方法时,其过程比较简单,和配置普通action信息一样。需要构造XXXset和XXXget方法以及execute方法。然后在struts.xml文件中配置action。该方法优点是使用简单,缺点是:需要在action中定义出前端页面中可能要获取的所有属性信息,使用起来不够灵活。
下面通过代码看一下:
Person属性映射表
1 package com.action.xml; 2 3 public class Person { 4 5 private int id; 6 private String name; 7 private int age; 8 private String address; 9 public int getId() { 10 return id; 11 } 12 public void setId(int id) { 13 this.id = id; 14 } 15 public String getName() { 16 return name; 17 } 18 public void setName(String name) { 19 this.name = name; 20 } 21 public int getAge() { 22 return age; 23 } 24 public void setAge(int age) { 25 this.age = age; 26 } 27 public String getAddress() { 28 return address; 29 } 30 public void setAddress(String address) { 31 this.address = address; 32 } 33 34 }
客户端页面getJson.jsp代码:
1 <%@ page language="java" import="java.util.*" pageEncoding="GB18030"%> 2 <% 3 String path = request.getContextPath(); 4 String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; 5 %> 6 7 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> 8 <html> 9 <head> 10 <base href="<%=basePath%>"> 11 12 <title>My JSP ‘getJson.jsp‘ starting page</title> 13 <script type="text/javascript" src="scripts/jquery-1.4.4.js"></script> 14 <meta http-equiv="pragma" content="no-cache"> 15 <meta http-equiv="cache-control" content="no-cache"> 16 <meta http-equiv="expires" content="0"> 17 <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> 18 <meta http-equiv="description" content="This is my page"> 19 <!-- 20 <link rel="stylesheet" type="text/css" href="styles.css"> 21 --> 22 23 <script type="text/javascript"> 24 25 $(function(){ 26 $("#button1").click(function(){ 27 $.post("getJsonAction2.action",{name:$("#name").val()},function(returnedData,status){ 28 var html = "<table width=‘60%‘ border=‘1‘ align=‘center‘><tr><th>id</th><th>name</th><th>age</th><th>address</th></tr>"; 29 30 31 var people = returnedData; 32 var id = people.id; 33 var name = people.name; 34 var age = people.age; 35 var address = people.address; 36 37 var html = "<table width=‘60%‘ border=‘1‘ align=‘center‘><tr><th>id</th><th>name</th><th>age</th><th>address</th><tr align=‘center‘><td>"+id+"</td><td>"+name+"</td><td>"+age+"</td><td>"+address+"</td></tr></tr></table>"; 38 39 $("#theBody table:eq(0)").remove();//找到id为theBody的body中的第0个table(即第一个table表)将其的内容删除掉,防止出现累加 40 $("#theBody").append(html);//将构建的HTML加入到id为theBody的body中 41 42 }); 43 }); 44 }) 45 46 </script> 47 </head> 48 49 <body id="theBody"> 50 51 <select id="name"> 52 <option value="zhangsan">zhangsan</option> 53 <option value="lisi">lisi</option> 54 </select> 55 <input type="button" value="get json information form server" id="button1"> 56 </body> 57 </html>
以上代码是两种方式都会使用的公共代码
(1)首先是通过构造字符串实现异步交互代码:
注意:需要在WebRoot目录中导入jQuery库
1 package com.action.json; 2 3 import java.io.PrintWriter; 4 5 import javax.servlet.http.HttpServletResponse; 6 7 import org.apache.struts2.ServletActionContext; 8 import org.dom4j.io.OutputFormat; 9 import org.dom4j.io.XMLWriter; 10 11 import com.action.xml.Person; 12 import com.google.gson.Gson; 13 import com.opensymphony.xwork2.ActionSupport; 14 15 @SuppressWarnings("serial") 16 public class GetJsonAction extends ActionSupport { 17 18 19 private String name; 20 21 public String getName() { 22 return name; 23 } 24 25 public void setName(String name) { 26 this.name = name; 27 } 28 29 @Override 30 public String execute() throws Exception { 31 32 Person people = new Person(); 33 34 people.setId(1); 35 people.setName(name); 36 people.setAge(20); 37 people.setAddress("beijing"); 38 39 Gson gson = new Gson(); 40 //通过Gson对象将Person对象内容以字符串格式返回 41 String result = gson.toJson(people); 42 43 System.out.println(result); 44 45 HttpServletResponse response = ServletActionContext.getResponse(); 46 //设置http头,不使用浏览器缓冲 47 response.setHeader("cache-control", "no-cache"); 48 //设置内容类型:xml异步交互是:“text/xml”;json异步交互此处是application/json 49 response.setContentType("application/json;charset=GB18030"); 50 51 PrintWriter out = response.getWriter(); 52 53 out.print(result); 54 55 /* 56 OutputFormat format = OutputFormat.createCompactFormat(); 57 format.setEncoding("GB18030"); 58 59 XMLWriter writer = new XMLWriter(out, format); 60 61 writer.write(result);*/ 62 63 out.flush(); 64 out.close(); 65 66 return null; 67 } 68 }
Struts.xml配置文件的配置信息
1 <?xml version="1.0" encoding="UTF-8"?> 2 <!DOCTYPE struts PUBLIC 3 "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" 4 "http://struts.apache.org/dtds/struts-2.3.dtd"> 5 <struts> 6 <!-- 设置Struts运行模式为开发者模式,如果value为false则关闭开发者模式 --> 7 <constant name="struts2.devMode" value="true"></constant> 8 9 <package name="struts2_ajax" namespace="/" extends="struts-default"> 10 11 12 <action name="getJsonAction" class="com.action.json.GetJsonAction"> 13 14 </action> 15 16 </package> 17 </struts>
(2) 通过struts中的json插件实现交互代码:
说明:使用插件的方式需要导入struts给提供的struts2-json-plugin-2.3.24.jar插件
GetJsonAction2.java代码
1 package com.action.json; 2 3 import org.apache.struts2.json.annotations.JSON; 4 5 import com.opensymphony.xwork2.ActionSupport; 6 7 @SuppressWarnings("serial") 8 public class GetJsonAction2 extends ActionSupport { 9 10 private String name; 11 12 private int id; 13 14 private int age; 15 16 private String address; 17 18 public String getName() { 19 return name; 20 } 21 22 public void setName(String name) { 23 this.name = name; 24 } 25 26 public int getId() { 27 return id; 28 } 29 30 public void setId(int id) { 31 this.id = id; 32 } 33 34 //@JSON(name="myAge")//使用注解方式配置action 35 public int getAge() { 36 return age; 37 } 38 39 public void setAge(int age) { 40 this.age = age; 41 } 42 43 public String getAddress() { 44 return address; 45 } 46 47 public void setAddress(String address) { 48 this.address = address; 49 } 50 51 @Override 52 public String execute() throws Exception { 53 54 this.id = 1; 55 this.age = 30; 56 this.address = "brijing"; 57 58 return SUCCESS; 59 } 60 }
struts.xml配置文件的配置信息
1 <?xml version="1.0" encoding="UTF-8"?> 2 <!DOCTYPE struts PUBLIC 3 "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" 4 "http://struts.apache.org/dtds/struts-2.3.dtd"> 5 <struts> 6 <!-- 设置Struts运行模式为开发者模式,如果value为false则关闭开发者模式 --> 7 <constant name="struts2.devMode" value="true"></constant> 8 9 <package name="struts2_ajax" namespace="/" extends="json-default"><!-- 使用json插件是需要继承json-default --> 10 11 <!-- 利用struts的json插件 --> 12 <action name="getJsonAction2" class="com.action.json.GetJsonAction2"> 13 <result name="success" type="json"> 14 <!-- 如果有不需要获取的属性则需要使用以下语句过滤掉不需要的属性 --> 15 <!-- <param name="excludeProperties">address</param> --> 16 </result> 17 18 </action> 19 </package> 20 </struts>
以上两种方式运行结果一样: