其实单纯使用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 ,见下面代码:
package
com.game.servlet;
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
import
java.io.IOException;
import
javax.servlet.ServletException;
import
javax.servlet.http.HttpServletRequest;
import
javax.servlet.http.HttpServletResponse;
import
java.util.logging.
*
;
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
public
class
OneGameHandle
extends
javax.servlet.http.HttpServlet
implements
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
javax.servlet.Servlet
...
{
private Logger logger = Logger.getLogger(this.getClass().getName());
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
public OneGameHandle() ...{
super();
}
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
protected void doGet(HttpServletRequest request,
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
HttpServletResponse response) throws ServletException, IOException ...{
logger.log(Level.INFO, "doGet method is runing...");
logger.log(Level.INFO, "received id = " + getID(request));
}
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
protected void doPost(HttpServletRequest request,
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
HttpServletResponse response) throws ServletException, IOException ...{
logger.log(Level.INFO, "doPost method is runing...");
logger.log(Level.INFO, "received id = " + getID(request));
}
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
protected void doPut(HttpServletRequest request,
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
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));
}
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
protected void doDelete(HttpServletRequest request,
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
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));
}
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
public void init() throws ServletException ...{
super.init();
}
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
//只是作为演示使用,不处理异常
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
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
>
<
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文件,在该页面上,我们显示有关不同方式请求的按钮:
<%
@ page language
=
"
java
"
contentType
=
"
text/html; charset=GBK
"
%>
<!
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
"
>
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
function doPutData()
...
{
var url = "game/1234";
put_request(url,theAdd);
}
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
function theAdd()
...
{
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
if (http_request.readyState == 4) ...{
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
if (http_request.status == 200) ...{
alert( http_request.responseText );
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
} else ...{
alert("connect the server wrong!");
}
}
}
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
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 贴图如下:
var
http_request
=
false
;
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
function
init_request()
...
{
http_request = false;
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
if(window.XMLHttpRequest) ...{ //Mozilla
http_request = new XMLHttpRequest();
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
if (http_request.overrideMimeType) ...{//MiME
http_request.overrideMimeType("text/xml");
}
}
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
else if (window.ActiveXObject) ...{ // IE
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
try ...{
http_request = new ActiveXObject("Msxml2.XMLHTTP");
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
} catch (e) ...{
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
try ...{
http_request = new ActiveXObject("Microsoft.XMLHTTP");
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
} catch (e) ...{}
}
}
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
if (!http_request) ...{ //
window.alert("XMLHttpRequest.");
return false;
}
}
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
function
get_request( url )
...
{
init_request();
http_request.onreadystatechange = processRequest;
http_request.open("GET", url, true);
http_request.send(null);
}
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
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
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
function
get_request2( url, myProcess )
...
{
init_request();
http_request.onreadystatechange = myProcess;
http_request.open("GET", url, true);
http_request.send(null);
}
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
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);
}
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
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
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
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
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
function
processRequest()
...
{
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
if (http_request.readyState == 4) ...{
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
if (http_request.status == 200) ...{
pageChange( http_request.responseText );
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
} else ...{
alert("connect the server wrong!");
}
}
}
//
xml
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
function
processXmlRequest()
...
{
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
if (http_request.readyState == 4) ...{
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
if (http_request.status == 200) ...{
pageChange( http_request.responseXml );
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
} else ...{
alert("connect the server wrong!");
}
}
}
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
function
put_request( url, myProcess )
...
{
init_request();
http_request.onreadystatechange = myProcess;
http_request.open("PUT", url, true);
http_request.send(null);
}
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
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页面效果图如下:
![JSP页面内容](https://p-blog.csdn.net/images/p_blog_csdn_net/nieyong/ceshi.png)
点击上图的各个按钮,然后观察一下tomcat的console输入看一下吧,是否已经处理了各种请求。
小结:
本例简单,只是获取一个参数。
本例方式使用Servlet来解析地址中含有/game/的字样的URL请求,自然很容易得到game 后面附加的参数。
缺点是,不能使用request方式来接收参数。
如果使用原生态的servlet来处理rest方式的请求,那么可以使用request.getParameter()。
那么该怎么办呢?明天,我们继续吧。