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 ????@Override30 ????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/json49 ????????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")//使用注解方式配置action35 ????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 ????@Override52 ????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>
以上两种方式运行结果一样:
struts2实现jQuery的异步交互
原文地址:http://www.cnblogs.com/lihuibin/p/8052067.html