首先,我会想到以下两个问题:
1、Web端是如何通过Ajax发送异步请求的?又如何接收Server端响应的JSON数据?
2、Server端收到请求后,如何返回JSON数据?
一、使用Ajax发送异步请求,并接收Server端传回的响应数据:
先看JSP页面代码:
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%> <%@ taglib prefix="s" uri="/struts-tags" %> <html> <head> <title>Struts+Ajax+JSON</title> <script type="text/javascript" src="ajax.js"></script> </head> <body> <h3>Struts2 + Ajax + JSON 整合</h3> <form action="json" method="get"> username:<input type="text" id="username" name="user.username" /><br/> password:<input type="text" id="password" name="user.password" /><br/> <input type="button" οnclick="getEmail()" value="查看Email"/><br /> </form> <p>您的Email地址为:<span id="email"></span></p> </body> </html>
前端实现Ajax的JS代码:
//创建XMLHttpRequest对象 function createXMLHttpRequest() { var xmlhttp; if(window.XMLHttpRequest) { xmlhttp = new XMLHttpRequest(); } else { if(window.ActionXObject) { xmlhttp = new ActionXObject("Microsoft.XMLHTTP"); } else { xmlhttp = new ActionXObject("Msxml2.XMLHTTP"); } } return xmlhttp; } //发送GET请求 function sendGetRequest(url,callback){ var xmlhttp = createXMLHttpRequest(); xmlhttp.open("GET", url, true); xmlhttp.onreadystatechange = function() { if (xmlhttp.readyState == 4) { if (xmlhttp.status == 200) { //获取服务器的响应数据 var data = xmlhttp.responseText; callback(data); } } }; xmlhttp.send(null); } //获取Email地址 function getEmail() { var username = document.getElementById("username").value; var password = document.getElementById("password").value; var url = "json?user.username=" + username + "&user.password=" + password; sendGetRequest(url, function(data){ var obj = eval("(" + data + ")"); document.getElementById("email").innerHTML = obj.user.email; }); }
二、使用Struts2处理异步请求并返回JSON数据:
Struts2中的Action代码:
package com.json.action;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.http.HttpServletResponse;
import net.sf.json.JSONObject;
import org.apache.struts2.ServletActionContext;
import com.json.dto.User;
import com.opensymphony.xwork2.ActionSupport;
public class UserAction extends ActionSupport {
private User user;
//此方法的返回类型为void
public void execute() throws IOException {
//打印请求中的user参数
System.out.println(user.getUsername() + ":" + user.getPassword());
//---发送JSON数据---
HttpServletResponse response = ServletActionContext.getResponse();
response.setContentType("text/html");
PrintWriter out = response.getWriter();
user.setEmail("user1234@qq.com");
//创建JSON对象
JSONObject json = new JSONObject();
//把User对象放入Json对象中
json.accumulate("user", user);
//把Json对象转成字符串并写入响应流
out.print(json.toString());
//可以打印JSON文本看一看
System.out.print(json.toString());
out.flush();
out.close();
}
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
}
Action中的User类的代码:
package com.json.dto;
public class User {
private String username;
private String password;
private String email;
public User() {}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
}
struts.xml文件的配置:
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" "http://struts.apache.org/dtds/struts-2.1.dtd"> <struts> <package name="user" extends="struts-default"> <action name="json" class="com.json.action.UserAction" method="execute"> </action> </package> </struts>
J2EE开发中使用JSON时需要导入以下5个jar包:
---------------------------------------
commons-lang-2.4.jar
commons-logging-1.1.1.jar
json-lib-2.4-jdk15.jar
ezmorph-1.0.6.jar
commons-collections-3.2.1.jar
---------------------------------------
已全部打包在附件内: