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

本文介绍如何通过Servlet实现RESTful风格的URL解析,并演示get、put、post、delete四种请求方式的处理流程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

其实单纯使用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()。
那么该怎么办呢?明天,我们继续吧。




评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值