您的位置:首页 > 编程语言

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

2008-02-17 20:52 477 查看
其实单纯使用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页面效果图如下:



点击上图的各个按钮,然后观察一下tomcat的console输入看一下吧,是否已经处理了各种请求。

小结:
本例简单,只是获取一个参数。
本例方式使用Servlet来解析地址中含有/game/的字样的URL请求,自然很容易得到game 后面附加的参数。
缺点是,不能使用request方式来接收参数。
如果使用原生态的servlet来处理rest方式的请求,那么可以使用request.getParameter()。
那么该怎么办呢?明天,我们继续吧。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐