第2,8章 servlet 開發(fā)技術(12課時)

第2章 servlet開發(fā)技術

Servlet是什么

servlet是基于java語言的web服務器端編程技術。按照一定規(guī)則定義的java類。他有約定好的一些方法。get post init destroy

servlet作用

無論是get/post方法都至少有兩個參數(shù),一個叫HttpServletRequest(請求對象),一個叫HttpServletResponse(響應對象)

他對外暴露一個地址,可以用于頁面訪問的。

servlet如何創(chuàng)建和定義

有兩種創(chuàng)建方式servlet2.5以前半自動創(chuàng)建 (.java+web.xml)

servlet2.5注解方式創(chuàng)建? (

.java+注解)

第一種方式:servlet2.5以前是手動創(chuàng)建

1)寫一個servlet類(java)繼承HttpServlet

publicclassTestServletextendsHttpServlet{@OverrideprotectedvoiddoGet(HttpServletRequestreq,HttpServletResponseresp)throwsServletException,IOException{// TODO Auto-generated method stubsuper.doGet(req,resp);}@OverrideprotectedvoiddoPost(HttpServletRequestreq,HttpServletResponseresp)throwsServletException,IOException{// TODO Auto-generated method stubsuper.doPost(req,resp);}}

2)web.xml里配置對外暴露的地址。

web.xml在WebContent\WEB-INF\web.xml

<servlet><servlet-name>TestServlet</servlet-name><servlet-class>com.neuedu.javaweb.chap02.TestServlet</servlet-class></servlet><servlet-mapping><servlet-name>TestServlet</servlet-name><url-pattern>/test.do</url-pattern></servlet-mapping>

servlet3.0自動創(chuàng)建

包名-new -servlet-輸入servlet文件名稱-下一步-urlmapping里可以更改映射地址-finish

@WebServlet("/regServlet")publicclassRegServletextendsHttpServlet{privatestaticfinallongserialVersionUID=1L;/**

* @see HttpServlet#HttpServlet()

*/publicRegServlet(){super();// TODO Auto-generated constructor stub}/**

? ? * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)

? ? */protectedvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOException{// TODO Auto-generated method stubSystem.out.println("doGet被調(diào)用");response.getWriter().append("Served at: ").append(request.getContextPath());}/**

? ? * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)

? ? */protectedvoiddoPost(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOException{// TODO Auto-generated method stubdoGet(request,response);}}

servlet生命周期關鍵方法

init()初始化方法

service()服務方法

doGet()

doPost()

......根據(jù)method不同,service將請求分發(fā)到不同方法

destory()銷毀方法

注意:init()和destory()方法整個生命周期中只執(zhí)行一次。service等方法可以執(zhí)行多次

初始化帶參數(shù)以及init里獲取參數(shù)

@WebServlet(value="/regServlet",initParams={@WebInitParam(name="driver",value="com.mysql.jdbc.Driver"),@WebInitParam(name="userName",value="root"),@WebInitParam(name="passWord",value="root")})publicclassRegServletextendsHttpServlet{privatestaticfinallongserialVersionUID=1L;/**

* @see HttpServlet#HttpServlet()

*/publicRegServlet(){super();// TODO Auto-generated constructor stub}@Overridepublicvoidinit(ServletConfigconfig)throwsServletException{// TODO Auto-generated method stubSystem.out.println(config.getInitParameter("userName"));super.init(config);}/**

? ? * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)

*/protectedvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOException{// TODO Auto-generated method stubSystem.out.println("doGet被調(diào)用");//response.getWriter().append("Served at: ").append(request.getContextPath());PrintWriterout=response.getWriter();out.println("success");}/**

* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)

*/protectedvoiddoPost(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOException{// TODO Auto-generated method stubdoGet(request,response);}

}

注冊程序

新建包 com.neuedu.service com.neuedu.service.impl? com.neuedu.dao

com.neuedu.dao.impl

目錄結構如圖

image.png

<!DOCTYPE html><html><head><metacharset="UTF-8"><title>注冊頁面</title></head><body>注冊頁面<br><formaction="regServlet"method="post">賬號:<inputtype="text"name="username"/><br>密碼:<inputtype="password"name="password"/><br>愛好:<inputtype="checkbox"name="hobby"value="1">打籃球<inputtype="checkbox"name="hobby"value="2">踢足球<inputtype="checkbox"name="hobby"value="3">燙頭<inputtype="submit"value="注冊"/></form></body></html>

servlet

packagecom.neuedu.javaweb.chap02;importjava.io.IOException;importjava.io.PrintWriter;importjavax.servlet.ServletConfig;importjavax.servlet.ServletException;importjavax.servlet.annotation.WebInitParam;importjavax.servlet.annotation.WebServlet;importjavax.servlet.http.HttpServlet;importjavax.servlet.http.HttpServletRequest;importjavax.servlet.http.HttpServletResponse;/**

* Servlet implementation class RegServlet

*/@WebServlet(value="/regServlet",initParams={@WebInitParam(name="driver",value="com.mysql.jdbc.Driver"),@WebInitParam(name="userName",value="root"),@WebInitParam(name="passWord",value="root")})publicclassRegTestServletextendsHttpServlet{privatestaticfinallongserialVersionUID=1L;/**

* @see HttpServlet#HttpServlet()

*/publicRegTestServlet(){super();// TODO Auto-generated constructor stub}@Overridepublicvoidinit(ServletConfigconfig)throwsServletException{// TODO Auto-generated method stubSystem.out.println(config.getInitParameter("userName"));super.init(config);}/**

? ? * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)

? ? */protectedvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOException{doPost(request,response);}/**

? ? * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)

? ? */protectedvoiddoPost(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOException{System.out.println("doPost方法被調(diào)用");//獲取前臺輸入的信息Stringname=request.getParameter("username");Stringpassword=request.getParameter("password");//checkbox數(shù)據(jù)String[]hobbys=request.getParameterValues("hobby");//打包userUseruser=newUser();user.setUserName(name);......//調(diào)用service進行處理IUserServiceuserService=newUserServiceImpl();inti=userService.addUser(user);//返回處理結果response.setContentType("text/html;charset=utf-8");PrintWriterout=response.getWriter();if(i>0){out.println("success");}else{out.println("failure");}}}

解決中文亂碼問題

request.setCharacterEncoding("utf-8");response.setCharacterEncoding("utf-8");response.setContentType("text/html;charset=UTF-8");

request里能獲取什么

應用程序上下文 request.getContextPath()

客戶端ip? ? ? request.getRemoteAddr()

客戶端端口? ? request.getRemotePort()

本地地址? ? ? request.getLocalAddr()

相對路徑? ? ? request.getRequestURI()

請求方式? ? ? request.getMethod()

頭信息(了解,是枚舉類型)

request.getHeaderNames()

//上下文路徑System.out.println("應用程序上下文"+request.getContextPath());System.out.println("客戶端ip"+request.getRemoteAddr());System.out.println("端口"+request.getRemotePort());System.out.println("本地addr"+request.getLocalAddr());System.out.println("相對路徑"+request.getRequestURI());System.out.println("請求方式"+request.getMethod());//以下了解System.out.println(request.getHeaderNames());Enumeration<String>headers=request.getHeaderNames();while(headers.hasMoreElements()){Stringkey=headers.nextElement();Stringvalue=request.getHeader(key);System.out.println("key--->"+key);System.out.println("value--->"+value);}

打印結果:

應用程序上下文/myproject客戶端ip0:0:0:0:0:0:0:1端口51784本地addr0:0:0:0:0:0:0:1相對路徑/myproject/loginServlet請求方式POSTorg.apache.tomcat.util.http.NamesEnumerator@3c32a826key---->hostvalue-->localhost:8081key---->connectionvalue-->keep-alivekey---->content-lengthvalue-->31key---->cache-controlvalue-->max-age=0key---->originvalue-->http://localhost:8081key---->upgrade-insecure-requestsvalue-->1key---->content-typevalue-->application/x-www-form-urlencodedkey---->user-agentvalue-->Mozilla/5.0(Windows NT6.1;WOW64)AppleWebKit/537.36(KHTML,like Gecko)Chrome/70.0.3538.16Safari/537.36key---->acceptvalue-->text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8key---->referervalue-->http://localhost:8081/myproject/login.htmlkey---->accept-encodingvalue-->gzip,deflate,brkey---->accept-languagevalue-->zh-CN,zh;q=0.9key---->cookievalue-->Webstorm-a327319a=cc9d0535-8c62-45c6-91d2-ba803bc9a72d

轉發(fā)和重定向

轉發(fā):只發(fā)一次請求? 地址欄的地址不變 只能轉發(fā)到內(nèi)部地址? 效率高? request轉發(fā)? ? request可以帶參數(shù)

重定向:兩次請求? ? 地址欄地址會變化 可以請求外部地址? ? 效率低? responset重定向? 只能在url地址里帶參數(shù)(如果重定向到的頁是用html的IFRAME開發(fā)的,只能用redirect)

應用技巧:

如果請求外部地址或者跳轉時不需要攜帶原始請求用重定向。否則用轉發(fā)

重定向時加上上下文路徑

response.sendRedirect(request.getContextPath()+"/user/index.html");

轉發(fā)寫法

request.getRequestDispatcher("/login.html").forward(request, response);

代碼詳見第2章代碼樣例(注冊登錄)

2人點贊

java web

作者:wqjcarnation

鏈接:http://www.itdecent.cn/p/6742b3dfee7e

來源:簡書

著作權歸作者所有。商業(yè)轉載請聯(lián)系作者獲得授權,非商業(yè)轉載請注明出處。

?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

友情鏈接更多精彩內(nèi)容