废话不多说,直接示例:
首先当然要搭建好struts2的开发环境,为了使用json数据格式,要导入struts2的一个json插件包,
我用的是struts2.1.8 其解压后的在解压文件的lib目录下可找到这个json插件包struts2-json-plugin-2.1.8.1.jar
我的目录结构
src--
|---com.sun.jsondemo(package)
| |----JsonPluginAction.java
|---struts.xml
WebRoot--
|---js(folder)
| |----jquery-1.4.js
|---WEB-INF
|----lib(项目所需jar包)
|----page
|---book.jsp
JsonPluginAction.java:
package com.sun.jsondemo;
import java.util.ArrayList;
import java.util.List;
import org.apache.struts2.json.annotations.JSON;
import com.opensymphony.xwork2.ActionSupport;
public class JsonPluginAction extends ActionSupport {
/**
*
*/ private static final long serialVersionUID = 1L;
private int bookid;
private String title;
private double price;
private List<String> comments; //secret1 和 secret2 没有提供setter和getter方法,不会返回为json格式
private transient String secret1; //这个关键字表示 这个field不会持久化
private String secret2; @JSON(name="ISBN") //可以通过注解方式改变json对象中属性的名称
public int getBookid() { return bookid; }
public void setBookid(int bookid) { this.bookid = bookid; }
public String getTitle() { return title; }
public void setTitle(String title) { this.title = title; }
public double getPrice() { return price; }
public void setPrice(double price) { this.price = price; }
public List<String> getComments() { return comments; }
public void setComments(List<String> comments) { this.comments = comments; }
@Override
//我们在这里简单的给定一些值,实际当然从页面动态获取
public String execute() throws Exception {
bookid = 111111;
title = "struts-json-jquery integration";
price = 99;
comments = new ArrayList<String>(3);
comments.add("It's no bad");
comments.add("WOW");
comments.add("No comment!");
secret1 = "You can't see me";
secret2 = "I am invisible";
return SUCCESS;
}
}
struts2.xml:
<struts> <constant name="struts.enable.DynamicMethodInvocation" value="false" /> <constant name="struts.devMode" value="true" /> <constant name="struts.ui.theme" value="simple"></constant>
<!-- json-default 定义在struts2的json插件包中,它包括了struts-default --> <package name="demo" namespace="/jsondemo" extends="json-default"> <action name="JsonPlugin" class="com.sun.jsondemo.JsonPluginAction"> <!-- 这里type为json,表示action中的属性将以json对象的格式输出-->
<result type="json"/> </action> <action name="GetJsonData"> <result type="dispatcher">/WEB-INF/page/book.jsp</result> </action> </package> </struts>
如果我们到此为止,通过浏览器访问http://localhost:8080/struts2demo/jsondemo/JsonPlugin.action
浏览器则会提示下载文件 把文件打开后里面就是json的数据格式
{"ISBN":111111,"comments":["It's no bad!","WOW!","No comment!"],"price":99,"title":"struts-json-jquery integration"}
这样肯定是不能干活的,但是到这里也算是成功的一半了。下面来个book.jsp通过jquery中的$.getJSON()函数:
<html>
<head>
<title>My JSP 'global.jsp' starting page</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<script type="text/javascript" src="${pageContext.request.contextPath}/js/jquery-1.4.js"></script>
<script type="text/javascript">
$(document).ready(function() {
$("#showbook").click( function() {
var basepath = $("#basepath").val();
var detail = $("#detail");
$.getJSON(basepath + "/jsondemo/JsonPlugin.action",
{t:new Date()},
function(data) {
var isbn = data.ISBN;
var title = data.title;
alert(title);
var price = data.price;
detail.append("ISBN: " + isbn + "<br/>" +
"Title: " + title + "<br/>" +
"Price: " + price + "<br/>");
detail.append("Comments:" + "<br/>" + "<hr>" + "<br/>");
var comments = data.comments;
for(var i = 0; i < comments.length; i++) {
detail.append("<p>" + "#" + (i+1) + " " + comments[i] + "</p><br>");
}
});
});
});
</script>
</head>
<body>
<input id="basepath" type="hidden" value="${pageContext.request.contextPath}">
<input id="showbook" type="button" value="Retrieve Book">
<div id="detail"></div>
</body>
</html>
完成了,到这里我们通过http://localhost:8080/struts2demo/jsondemo/GetJsonData.action就可以访问到
book.jsp页面,点击button就能在页面上看到反回的数据,这里其实主要涉及到json数据的解析。我对jquery也刚刚
开始研究,所以这里写的js代码肯定不够优美....
呵呵,如果有不正确的地方 请大家指出!