在这篇文章中,我想说明如何的JSON(JavaScript对象
符号)和Java Servlet可以同时使用在一个小的AJAX((Asynchronous JavaScript and XML)的应用。
为了作简要介绍那些谁不熟悉使用JSON密切。JSON是一种表示数据,这使得工作轻量级语法
它比更愉快,使AJAX应用程序的XML 快。此外,当使用JSON工作,没有任何一个XML需要
解析。
在下面的例子,我将创建一个回调的servlet 获取并分析了RSS提要。然后解析数据被传递到饲料
在一个客户端JSON的形式。这些数据然后格式化并提交 给用户。客户端使用AJAX调用来查询的servlet。
对于这种应用,我使用了三个第三方库:
图书馆提供的JSON和JSON的JSON.org – RPC的Java的,允许以建立并轻松地通过Java代码解析JSON数据延长。该库可以运行在一个如Tomcat,JBoss和其他J2EE应用服务器的Servlet容器。
项目罗马
罗马是一个开放源码的Java工具,用于分析,生成和发布RSS和Atom馈送。
JDOM的XML解析器
JDOM是一个基于Java的“文档对象模型的XML文件”。 JDOM的服务作为DOM的相同目的,但更容易使用
这些库中包含的源代码,附带这篇文章。此应用程序的例子还包括作为一个WAR档案,随时可以在Tomcat部署。
以下是我的servlet实现。该servlet饲料获取并分析数据。前面提到的JSON库让我轻松地创建和填充JSON对象。
[java]
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.json.JSONArray;
import org.json.JSONObject;
import com.sun.syndication.feed.synd.SyndEntry;
import com.sun.syndication.feed.synd.SyndFeed;
import com.sun.syndication.fetcher.FeedFetcher;
import com.sun.syndication.fetcher.FetcherException;
import com.sun.syndication.fetcher.impl.FeedFetcherCache;
import com.sun.syndication.fetcher.impl.HashMapFeedInfoCache;
import com.sun.syndication.fetcher.impl.HttpURLFeedFetcher;
import com.sun.syndication.io.FeedException;
/**
* @author Alexander Zagniotov (http://javabeans.asia)
*/
public class JsonServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
private static final String BLOG_URL = "http://javabeans.asia/rss.xml";
private static final String CONTENT_TYPE = "application/json";
private FeedFetcherCache feedInfoCache = null;
private FeedFetcher feedFetcher = null;
public void init(ServletConfig config) throws ServletException {
super.init(config);
feedInfoCache = HashMapFeedInfoCache.getInstance();
feedFetcher = new HttpURLFeedFetcher(feedInfoCache);
}
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
SyndFeed feed = this.feedFethcer(BLOG_URL);
if (feed != null) {
String json = this.feedToJSON(feed);
response.setContentType(CONTENT_TYPE);
response.setHeader("Cache-Control", "no-cache");
response.getWriter().write(json);
}
}
private SyndFeed feedFethcer(String url) {
SyndFeed feed = null;
try {
feed = feedFetcher.retrieveFeed(new URL(BLOG_URL));
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (FeedException e) {
e.printStackTrace();
} catch (FetcherException e) {
e.printStackTrace();
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return feed;
}
private String feedToJSON(SyndFeed feed) {
JSONObject jsonObj = new JSONObject();
JSONArray jsonEntryTitles = new JSONArray();
jsonObj.put("blogtitle", feed.getTitle());
jsonObj.put("blogdescription", feed.getDescription());
jsonObj.put("bloglanguage", feed.getLanguage());
jsonObj.put("bloglink", feed.getLink());
jsonObj.put("author", feed.getCopyright());
List<?> feedEntries = feed.getEntries();
for (Object c : feedEntries) {
SyndEntry syndicateEntry = (SyndEntry) c;
jsonEntryTitles.put(syndicateEntry.getTitle());
}
jsonObj.put("blogentrytitles", jsonEntryTitles);
return jsonObj.toString();
}
}
[/java]
正如你可以看到它是很容易的构建在服务器端JSON对象和数组并传递给客户端。对于本示例的目的,我从RSS饲料得到我的数据,但数据也可从数据库等来
以下是我的客户端实现。客户端的servlet查询使用AJAX调用。当一个AJAX调用返回从一个JSON的Servlet的响应对象的形式,对象数据的格式以及有关的RSS供稿信息呈现给客户端:
[java]
<html>
<head>
<title>Java Beans dot Asia</title>
<script language="JavaScript" type="text/javascript">
var httpRequest = null;
function getDescriptionAsJSON() {
var description = document.getElementById(‘description’);
description.innerHTML = "Loading, please wait …";
var url = "http://localhost:8080/json/json";
if(window.XMLHttpRequest){
httpRequest = new XMLHttpRequest();
} else if(window.ActiveXObject){
httpRequest = new ActiveXObject("Microsoft.XMLHTTP");
}
httpRequest.open("GET", url, true);
httpRequest.onreadystatechange = handler;
httpRequest.send(null);
}
function handler() {
if (httpRequest.readyState == 4) {
if (httpRequest.status == 200) {
processJSON(httpRequest.responseText);
}
}
}
function processJSON(jsonObjectString) {
var description = document.getElementById(‘description’);
//Since JSON is a subset of JavaScript, I am using
//JavaScript’s own compiler to parse JSON in one line!
var jsonObject = eval(‘(‘ + jsonObjectString + ‘)’)
var text = "";
text += "Author: " + jsonObject.author + "< br />";
text += "Blog Name: " + jsonObject.blogtitle + "< br />";
text += "Blog URL: " + jsonObject.bloglink + "< br />";
text += "Blog Description: " + jsonObject.blogdescription + "< br />";
text += "Blog Language: " + jsonObject.bloglanguage + "< br />";
description.innerHTML = text;
var entries = "Last " + jsonObject.blogentrytitles.length + " blog entries are:nn";
for (var index = 0; index < jsonObject.blogentrytitles.length; index ++) {
entries += (index + 1) + ": " + jsonObject.blogentrytitles[index] + "n";
}
alert(entries);
}
</script>
</head>
<body>
<img src="images/javabeansmugshot_120x120.jpg" border="1" />< br />< br />
<div id="description"></div>< br />< br />
<a href="javascript:void(0)" onclick="return getDescriptionAsJSON();">Click to get description!</a>
</body>
</html>
[/java]
正如你可以看到,JSON数据可以很容易地解析对与Java的脚本eval()函数帮助客户端。为了提醒 – JSON是一个Java脚本的一个子集,因此的eval()将产生一个有效的对象。
请记住,有一个额外需要照顾时,使用eval。问题是,试用版本将编译并执行Java脚本代码,回来从响应。这可能导致安全风险,如果响应数据是来自不可信来源的到来。
就是这样。我希望这个例子是明确的和有用的:)
source code json and servlets
请注意,这个例子是我和测试其工作的罚款。源代码是因为前面提到的Eclipse项目中。你可以简单地创建一个从现有的Ant build.xml文件新的Java项目。
评论表示赞赏:)
干杯