裸奔编程之使用Servlet实现REST风格 单纯使用Servlet进行完成REST解析

其实单纯使用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;

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 >
        
< 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 " >
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 贴图如下:

     var  http_request  =   false ;    
    
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页面效果图如下:
JSP页面内容
点击上图的各个按钮,然后观察一下tomcat的console输入看一下吧,是否已经处理了各种请求。

小结:
本例简单,只是获取一个参数。
本例方式使用Servlet来解析地址中含有/game/的字样的URL请求,自然很容易得到game 后面附加的参数。
缺点是,不能使用request方式来接收参数。
如果使用原生态的servlet来处理rest方式的请求,那么可以使用request.getParameter()。
那么该怎么办呢?明天,我们继续吧。




  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值