使用最基本的javaEE技術(servlet)來實現rest風格
阿新 • • 發佈:2018-12-23
今天試了一下使用最基本的servlet來實現rest風格web專案,下面是我寫的一個demo,非常成功。
後端:
package com.zs.servlet; import java.io.IOException; import java.util.logging.Level; import java.util.logging.Logger; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class UsersHandle extends HttpServlet{ /** * */ private static final long serialVersionUID = 1L; Logger logger=Logger.getLogger("UsersHandle"); @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { super.doGet(req, resp); logger.log(Level.INFO, "doGet"); logger.log(Level.INFO, "ID:"+getID(req)); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { super.doPost(req, resp); logger.log(Level.INFO, "doPost"); logger.log(Level.INFO, "ID:"+getID(req)); } @Override protected void doPut(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { super.doPut(req, resp); logger.log(Level.INFO, "doPut"); logger.log(Level.INFO, "ID:"+getID(req)); } @Override protected void doDelete(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { super.doDelete(req, resp); logger.log(Level.INFO, "doDelete"); logger.log(Level.INFO, "ID:"+getID(req)); } 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; } }
前端:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <% String path = request.getContextPath(); String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <base href="<%=basePath%>"> <title>My JSP 'index.jsp' starting page</title> <meta http-equiv="pragma" content="no-cache"> <meta http-equiv="cache-control" content="no-cache"> <meta http-equiv="expires" content="0"> <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> <meta http-equiv="description" content="This is my page"> <script type="text/javascript"> 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); } function doPutData(){ var url = "user/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 = "user/2332"; delete_request(url,theAdd); } </script> </head> <body> POST 方式提交資料.... <form name="form1" method="post" action="user/23536436"> <input name="title" value="填寫ID" /> <input type="submit" value="提交"> </form> <br> <br> GET 方式提交資料 ...<br> <a href="user/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>
配置檔案web.xml:
頁面:<?xml version="1.0" encoding="UTF-8"?> <web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list> <servlet> <servlet-name>users</servlet-name> <servlet-class>com.zs.servlet.UsersHandle</servlet-class> </servlet> <servlet-mapping> <servlet-name>users</servlet-name> <url-pattern>/user/*</url-pattern> </servlet-mapping> </web-app>
結果:
總結:
第一次寫,給我的感覺,如果真的用rest風格來寫,會導致前端要寫很多程式碼,因為需要ajax訪問並做邏輯處理,而在之前我是在後端做處理的,不過看現在的前端框架都幾乎全部使用ajax來實現,所以也許是可行方案。