下面我们来看一个实际案例:
首先我们建立一个servlet,代码如下:
搜索结果的图片类定义
public class SearchResultImage {
// "contextLink": "http://zh.wikipedia.org/wiki/%E8%8A%B1",
// "height": 188,
// "width": 250,
// "byteSize": 24465,
// "thumbnailLink": "https://encrypted-tbn1.gstatic.com/images?q=tbn:ANd9GcQU2J6pZj2kHhl39Z5bjndI1RJXgb7Jbx1xLV7kc2crbt9VbFoJiUDJlQ",
// "thumbnailHeight": 83,
// "thumbnailWidth": 111
public String contextLink;
public int height;
public int width;
public int byteSize;
public String thumbnailLink;
public int thumbnailHeight;
public int thumbnailWidth;
}
搜索结果的item定义
package com.freesoft.model.gcs;
public class SearchResultItem {
public String kind;
public String title;
public String htmlTitle;
public String link;
public String displayLink;
public String snippet;
public String htmlSnippet;
public String mime;
public SearchResultImage image;
// "kind": "customsearch#result",
// "title": "花- 维基百科,自由的百科全书",
// "htmlTitle": "\u003cb\u003e花\u003c/b\u003e- 维基百科,自由的百科全书",
// "link": "http://upload.wikimedia.org/wikipedia/commons/thumb/8/84/Plum_flowers.jpg/250px-Plum_flowers.jpg",
// "displayLink": "zh.wikipedia.org",
// "snippet": "花- 维基百科,自由的百科全书",
// "htmlSnippet": "\u003cb\u003e花\u003c/b\u003e- 维基百科,自由的百科全书",
// "mime": "image/jpeg",
// "image": {
// }
}
搜索结果定义
import com.google.gson.JsonObject;
public class SearchResult {
// 多余的字段可以不要
private String kind;
private JsonObject url;
private JsonObject queries;
private JsonObject context;
private JsonObject searchInformation;
// 这是我们需要的字段
private SearchResultItem items[];
public String getKind() {
return kind;
}
public JsonObject getUrl() {
return url;
}
public JsonObject getQueries() {
return queries;
}
public JsonObject getContext() {
return context;
}
public JsonObject getSearchInformation() {
return searchInformation;
}
public SearchResultItem[] getItems() {
return items;
}
public void setKind(String kind) {
this.kind = kind;
}
public void setUrl(JsonObject url) {
this.url = url;
}
public void setQueries(JsonObject queries) {
this.queries = queries;
}
public void setContext(JsonObject context) {
this.context = context;
}
public void setSearchInformation(JsonObject searchInformation) {
this.searchInformation = searchInformation;
}
public void setItems(SearchResultItem[] items) {
this.items = items;
}
}
输出的类型定义
public class Image {
// 标题
private String title;
// 图片地址
private String link;
// 分享网站
private String displayLink;
public Image(String title, String link, String displayLink) {
super();
this.title = title;
this.link = link;
this.displayLink = displayLink;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getLink() {
return link;
}
public void setLink(String link) {
this.link = link;
}
public String getDisplayLink() {
return displayLink;
}
public void setDisplayLink(String displayLink) {
this.displayLink = displayLink;
}
}
Servlet定义
import com.google.gson.Gson;
public class GCSServlet extends HttpServlet {
private static final long serialVersionUID = -1275024561023110262L;
private static final int RESULT_OK = 200;
private static final int BUF_SIZE = 1024 * 8; // 8k
private static final String API_KEY = "AIzaSyBKmmLBxKXaZpIdDcdyIZDJA6_yrN-ejHI"; // API
// key
private static final String UNIQUE_ID = "012004925040627705852:rsqwwhrqtr0"; // Unique
// ID
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
handle(request, response);
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
handle(request, response);
}
/**
*
* 这里提供了如何使用请求的例子 https://developers.google.com/custom-search/v1/using_rest
* 注意以下几个参数: 标准参数: alt,可选参数json, atom,用于指定返回值格式,默认值是json
* callback,JavaScript回调函数 prettyPrint,返回内容是否采用便于人类阅读的格式,默认值是true API自定义参数:
* cx,CSE的唯一标识符 num,搜索结果个数,可选值1~10,默认为10 q,搜索表达式
* safe,可选值high(开启搜索结果最高安全级别过滤)、medium(开启中等级别安全过滤)、off(关闭安全过滤)
* searchType,可选值image,如果未设置,返回值将被限定为网页
*
* @param request
* @param response
* @throws IOException
*/
private void handle(HttpServletRequest request, HttpServletResponse response)
throws IOException {
int start = Integer.parseInt(request.getParameter("start"));
int num = Integer.parseInt(request.getParameter("num"));
String queryExpression = request.getParameter("queryexpression");
String strRequest = "https://www.googleapis.com/customsearch/v1?key=%API_KEY%&cx=%UNIQUE_ID%&q=%queryExpression%&searchType=image&start=%start%&num=%num%";
strRequest = strRequest.replace("%API_KEY%", API_KEY)
.replace("%UNIQUE_ID%", UNIQUE_ID)
.replace("%queryExpression%", queryExpression)
.replace("%start%", String.valueOf(start))
.replace("%num%", Integer.toString(num));
HttpURLConnection conn = null;
String queryResult = null;
try {
URL url = new URL(strRequest);
conn = (HttpURLConnection) url.openConnection();
// 使用GET方法
conn.setRequestMethod("GET");
int resultCode = conn.getResponseCode();
if (resultCode == RESULT_OK) {
InputStream is = conn.getInputStream();
queryResult = readAsString(is);
is.close();
} else {
System.out.println("Fault on getting http result, code: " + resultCode);
}
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
conn.disconnect();
}
if ((queryResult != null) && (queryResult.length() != 0)) {
String respStr = parseResult(queryResult);
System.out.println(respStr);
// 设置返回内容
response.setContentType("application/json; charset=utf-8");
// 设置不缓存内容
response.setHeader("pragma", "no-cache");
response.setHeader("cache-control", "no-cache");
PrintWriter writer = response.getWriter();
writer.write(respStr);
writer.flush();
writer.close();
}
}
/**
* 将搜索结果字符串转化为需要的对象列表
*
* @param queryResult
* @return
*/
private String parseResult(String queryResult) {
Gson gson = new Gson();
SearchResult e = gson.fromJson(queryResult, SearchResult.class);
System.out.println(queryResult);
SearchResultItem items[] = e.getItems();
Image images[] = new Image[items.length];
for (int i = 0; i < items.length; i++) {
images[i] = new Image(items[i].title, items[i].link, items[i].displayLink);
}
return gson.toJson(images);
}
/**
* 将输出内容转换为字符串形式
*
* @param ins
* @return
* @throws IOException
*/
public static String readAsString(InputStream ins) throws IOException {
ByteArrayOutputStream outs = new ByteArrayOutputStream();
byte[] buffer = new byte[BUF_SIZE];
int len = -1;
try {
while ((len = ins.read(buffer)) != -1) {
outs.write(buffer, 0, len);
}
} finally {
outs.flush();
outs.close();
}
return outs.toString();
}
}
用来测试的html页面
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>jQuery ajax test</title>
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="this is my page">
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<!--<link rel="stylesheet" type="text/css" href="./styles.css">-->
<script type="text/javascript" src="../jquery/jquery-1.8.2.js"></script>
<script type="text/javascript">
$(function(){
$("#search").click(function(){
$.post("/GCSServlet.action",
{"start": $("#start").val(), "num": $("#num").val(), "queryexpression": $("#queryexpression").val()},
function(data, status){
var html = "<table style='width: 960px; border: 1px solid black;'>";
for(var i = 0; i < data.length; i++){
if (i % 3 == 0)
html += "<tr>";
var image = data[i];
var title = image.title;
var link = image.link;
var displayLink = image.displayLink;
html += "<td style='width: 320px'>" + title + "<img src='" + link + "' width='320px' height='240px'>" + displayLink + "</td>";
if (i % 3 == 2)
html += "</tr>";
}
html += "</table>";
$("table:eq(0)").remove();
$("#resultArea").append(html);
});
});
});
</script>
</head>
<body>
<label for="queryexpression">搜索内容</label>
<input type="text" id="queryexpression">
<label for="start">从第几个结果开始</label>
<input type="text" id="start">
<label for="num">搜索多少结果</label>
<input type="text" id="num">
<input type="button" id="search" value="搜索">
<div id="resultArea"></div>
</body>
</html>