為了使前后端的請(qǐng)求方式相同,我們需要在后端獲取請(qǐng)求方式,然后進(jìn)行判斷前端發(fā)送的請(qǐng)求是否為規(guī)定的請(qǐng)求方式,如果不是規(guī)定的請(qǐng)求方式,就會(huì)報(bào)錯(cuò);
為了實(shí)現(xiàn)上述功能,此功能的代碼需要在每一個(gè)Servlet類(lèi)中都需要編寫(xiě),怎么能封裝一下,以后在每一個(gè)具體的Servlet類(lèi)中不寫(xiě)這樣的代碼了,但是還是能夠達(dá)到同樣的效果?
1、自定義的HttpServlet類(lèi),解決判斷前后端請(qǐng)求方式是否一致的問(wèn)題
public class HttpServlet extends GenericServlet { /** * 此方法為原始service()方法,方法內(nèi)將ServletRequest、ServletResponse強(qiáng)轉(zhuǎn)為帶有http的接口 * 然后調(diào)用重載的service(HttpServletRequest, HttpServletResponse)方法 * 所以此方法我們無(wú)需進(jìn)行重寫(xiě) */ @Override public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException { HttpServletRequest request = (HttpServletRequest) req; HttpServletResponse response = (HttpServletResponse) res; service(request,response); } /** * 此方法獲取請(qǐng)求方式后進(jìn)行判斷, * 如果是GET請(qǐng)求就執(zhí)行doGet() * 如果是POST請(qǐng)求就執(zhí)行doPost() * 此方法沒(méi)有理由重寫(xiě),只需要將業(yè)務(wù)代碼寫(xiě)在doGet()或doPost()方法中即可 */ public void service(HttpServletRequest request, HttpServletResponse response) throws IOException { String method = request.getMethod(); if(“POST”.equals(method)) { doPost(request, response); } else if(“GET”.equals(method)) { doGet(request, response); } } /** * 我們需要什么請(qǐng)求時(shí),子類(lèi)繼承此父類(lèi)就應(yīng)當(dāng)重寫(xiě)對(duì)應(yīng)的doGet()或者doPost()方法之一 * 在doGet()或者doPost()方法內(nèi)寫(xiě)業(yè)務(wù)代碼,即將原來(lái)的service()內(nèi)的業(yè)務(wù)代碼寫(xiě)到doXXX()中 */ public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException { response.setContentType(“text/html;charset=UTF-8”); response.getWriter().print(“應(yīng)當(dāng)發(fā)送GET請(qǐng)求”); throw new RuntimeException(“應(yīng)當(dāng)發(fā)送GET請(qǐng)求”); } public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException { response.setContentType(“text/html;charset=UTF-8”); response.getWriter().print(“應(yīng)當(dāng)發(fā)送POST請(qǐng)求”); throw new RuntimeException(“應(yīng)當(dāng)發(fā)送POST請(qǐng)求”); }}
當(dāng)有了HttpServlet類(lèi)之后,寫(xiě)一個(gè)login類(lèi)(Servlet)來(lái)繼承HttpServlet類(lèi)試試
public class login extends cn.test.HttpServlet { @Override public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException { response.setContentType(“text/html;charset=UTF-8”); response.getWriter().print(“登陸成功!”); }}
當(dāng)Tomcat服務(wù)器啟動(dòng)并且通過(guò)瀏覽器訪問(wèn)此Servlet對(duì)應(yīng)的頁(yè)面時(shí),Tomcat會(huì)執(zhí)行l(wèi)ogin類(lèi),假設(shè)login類(lèi)需要的是POST請(qǐng)求,所以我們將繼承自父類(lèi)的doPost()重寫(xiě)為我們需要的業(yè)務(wù)代碼,執(zhí)行順序?yàn)椋?/p>
- 假設(shè)前端發(fā)送的是POST請(qǐng)求
1、service(ServletRequest, ServletResponse) 將兩個(gè)參數(shù)強(qiáng)轉(zhuǎn)為帶有Http的接口,之后執(zhí)行
2、service(HttpServletRequest, HttpServletResponse)獲取請(qǐng)求方式POST并通過(guò)判斷執(zhí)行重寫(xiě)的doPost()方法doPost(HttpServletRequest, HttpServletResponse) 執(zhí)行業(yè)務(wù)代碼
- 假設(shè)前端發(fā)送的是GET請(qǐng)求
1、service(ServletRequest, ServletResponse) 將兩個(gè)參數(shù)強(qiáng)轉(zhuǎn)為帶有Http的接口,之后執(zhí)行
2、service(HttpServletRequest, HttpServletResponse)獲取請(qǐng)求方式GET并通過(guò)判斷執(zhí)行未被重寫(xiě)的doGet()方法
3、doGet() 報(bào)錯(cuò),將錯(cuò)誤信息輸出到控制臺(tái)和前端頁(yè)面
所以,我們的Servlet繼承HttpServlet后,后端需要的是什么請(qǐng)求,那么我們就重寫(xiě)對(duì)應(yīng)的doPost()/doGet()方法,方法內(nèi)是我們的業(yè)務(wù)代碼,并不需要重寫(xiě)service()方法
官方的HttpServlet
實(shí)際上SUN公司為我們提供了一個(gè)類(lèi)來(lái)解決判斷前后端請(qǐng)求方式是否一致的類(lèi)javax.servlet.http.HttpServlet
此類(lèi)和我們自定義的HttpServlet類(lèi)的使用方法和原理類(lèi)似,所以總結(jié)如下的使用方法和注意