其实单纯使用Servlet已经可以完成对REST风格URL的解析任务。
我们今天就尝试着写一个简单的DEMO程序,使用一个Servlet 完成 get,put,post,delete 四种请求。
在编写前,先叙述一下编程环境:
JDK 1.5 + TOMCAT 5.5 + Eclipse 3.2
我们今天模拟在客户端使用AJAX或直接FORM提交,对同一个URL地址 : http://你的域名/game/1234
使用get、put、post、delete四种不同的方式进行请求。
并演示如何在服务端如何解析传递过来的参数(id为1234),获取/game请求附加的的id参数。
首先建立一个Servlet,我们这里起名为 OneGameHandle ,见下面代码:
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.logging. * ;
public class OneGameHandle extends javax.servlet.http.HttpServlet implements
javax.servlet.Servlet ... {
private Logger logger = Logger.getLogger(this.getClass().getName());
public OneGameHandle() ...{
super();
}
protected void doGet(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException ...{
logger.log(Level.INFO, "doGet method is runing...");
logger.log(Level.INFO, "received id = " + getID(request));
}
protected void doPost(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException ...{
logger.log(Level.INFO, "doPost method is runing...");
logger.log(Level.INFO, "received id = " + getID(request));
}
protected void doPut(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException ...{
super.doPut(request, response);
logger.log(Level.INFO, "doPut method is runing...");
logger.log(Level.INFO, "received id = " + getID(request));
}
protected void doDelete(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException ...{
super.doDelete(request, response);
logger.log(Level.INFO, "doDelete method is runing...");
logger.log(Level.INFO, "received id = " + getID(request));
}
public void init() throws ServletException ...{
super.init();
}
//只是作为演示使用,不处理异常
private String getID(HttpServletRequest request) ...{
String url = request.getRequestURL().toString();
String id = null;
if (url.endsWith("/"))
url = url.substring(0, url.length() - 1);
id = url.substring(url.lastIndexOf('/') + 1);
return id;
}
}
在web.xml 中配置如下:
< servlet-name > OneGameHandle </ servlet-name >
< servlet-class > com.game.servlet.OneGameHandle </ servlet-class >
</ servlet >
< servlet-mapping >
< servlet-name > OneGameHandle </ servlet-name >
< url-pattern > /game/* </ url-pattern >
</ servlet-mapping >
你看到了没有,Servlet OneGameHandle 解析地址为 /game/* 。
下面,我们建立一个JSP文件,在该页面上,我们显示有关不同方式请求的按钮:
<! DOCTYPE html PUBLIC " -//W3C//DTD HTML 4.01 Transitional//EN " " http://www.w3.org/TR/html4/loose.dtd " >
< html >
< head >
< meta http - equiv = " Content-Type " content = " text/html; charset=GBK " >
< title > 只是演示 </ title >
< script src = " js/request.js " ></ script >
< script type = " text/javascript " >
function doPutData() ... {
var url = "game/1234";
put_request(url,theAdd);
}
function theAdd() ... {
if (http_request.readyState == 4) ...{
if (http_request.status == 200) ...{
alert( http_request.responseText );
} else ...{
alert("connect the server wrong!");
}
}
}
function doDeleteData() ... {
var url = "game/2332";
delete_request(url,theAdd);
}
</ script >
</ head >
< body >
POST 方式提交数据....
< form name = " form1 " method = " post " action = " game/23536436 " >
< input name = " title " value = " 填写名字 " />
< input type = " submit " value = " 提交 " >
</ form >
< br >
< br >
GET 方式提交数据 ... < br >
< a href = " game/2355 " > 直接GET方式请求 </ a >
< br >
< br >
< br >
DELETE 方式请求... < br >
< input type = " button " value = " 提交数据 " onclick = " doDeleteData() " >
< br >
< br >< br >
PUT 方式提交 ... < br >
< input type = " button " value = " 提交数据 " onclick = " doPutData() " >
</ body >
</ html >
对应于该页面牵涉到JS -request.js 贴图如下:
function init_request() ... {
http_request = false;
if(window.XMLHttpRequest) ...{ //Mozilla
http_request = new XMLHttpRequest();
if (http_request.overrideMimeType) ...{//MiME
http_request.overrideMimeType("text/xml");
}
}
else if (window.ActiveXObject) ...{ // IE
try ...{
http_request = new ActiveXObject("Msxml2.XMLHTTP");
} catch (e) ...{
try ...{
http_request = new ActiveXObject("Microsoft.XMLHTTP");
} catch (e) ...{}
}
}
if (!http_request) ...{ //
window.alert("XMLHttpRequest.");
return false;
}
}
function get_request( url ) ... {
init_request();
http_request.onreadystatechange = processRequest;
http_request.open("GET", url, true);
http_request.send(null);
}
function get_request( url, type ) ... {
init_request();
if( type == "text" )
http_request.onreadystatechange = processRequest;
else if( type == "xml" )
http_request.onreadystatechange = processXmlRequest;
http_request.open("GET", url, true);
http_request.send(null);
}
// the user can custom the function
function get_request2( url, myProcess ) ... {
init_request();
http_request.onreadystatechange = myProcess;
http_request.open("GET", url, true);
http_request.send(null);
}
function post_request( url, sinfo ) ... {
init_request();
http_request.onreadystatechange = processRequest;
http_request.open("POST", url, true);
http_request.setRequestHeader("Content-Length",sinfo.length);
http_request.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
http_request.send(sinfo);
}
function post_request( url, sinfo, type ) ... {
init_request();
if( type == "text" )
http_request.onreadystatechange = processRequest;
else if( type == "xml" )
http_request.onreadystatechange = processXmlRequest;
http_request.open("POST", url, true);
http_request.setRequestHeader("Content-Length",sinfo.length);
http_request.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
http_request.send(sinfo);
}
// this function gave the user too much free to write his method
function post_request2( url, sinfo, myProcess ) ... {
init_request();
http_request.onreadystatechange = myProcess;
http_request.open("POST", url, true);
http_request.setRequestHeader("Content-Length",sinfo.length);
http_request.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
http_request.send(sinfo);
}
// text
function processRequest() ... {
if (http_request.readyState == 4) ...{
if (http_request.status == 200) ...{
pageChange( http_request.responseText );
} else ...{
alert("connect the server wrong!");
}
}
}
// xml
function processXmlRequest() ... {
if (http_request.readyState == 4) ...{
if (http_request.status == 200) ...{
pageChange( http_request.responseXml );
} else ...{
alert("connect the server wrong!");
}
}
}
function put_request( url, myProcess ) ... {
init_request();
http_request.onreadystatechange = myProcess;
http_request.open("PUT", url, true);
http_request.send(null);
}
function delete_request( url, myProcess ) ... {
init_request();
http_request.onreadystatechange = myProcess;
http_request.open("DELETE", url, true);
http_request.send(null);
}
尝试点击JSP页面上的各个按钮,AJAX方式进行请求服务器,服务器端Servlet解析。
JSP页面效果图如下:
点击上图的各个按钮,然后观察一下tomcat的console输入看一下吧,是否已经处理了各种请求。
小结:
本例简单,只是获取一个参数。
本例方式使用Servlet来解析地址中含有/game/的字样的URL请求,自然很容易得到game 后面附加的参数。
缺点是,不能使用request方式来接收参数。
如果使用原生态的servlet来处理rest方式的请求,那么可以使用request.getParameter()。
那么该怎么办呢?明天,我们继续吧。