J2EE学习笔记(四)之Servlet原理
一、Servlet簡介
JSP的本質就是Servlet,JSP頁面部署到Web容器中后,Web容器會把JSP編譯成對應的Servlet。
Servlet是服務器端小程序,用于處理及相應客戶端的請求。
Servlet有四個方法doGet()、doPost()、doPut()、doDelete()分別用于處理客戶端get、post、put、delete四種請求。
通常情況下,由于客戶端只有post和get兩種請求,所以只需重寫doGet()和doPost()兩種方法,或者可以只重寫service()一個方法即可響應所有請求。
看下HttpServlet類的源碼就知道
protected void service(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException {String method = req.getMethod();……} else if (method.equals(METHOD_HEAD)) {long lastModified = getLastModified(req);maybeSetLastModified(resp, lastModified);doHead(req, resp);} else if (method.equals(METHOD_POST)) {doPost(req, resp);} else if (method.equals(METHOD_PUT)) {doPut(req, resp);} else if (method.equals(METHOD_DELETE)) {doDelete(req, resp);} else if (method.equals(METHOD_OPTIONS)) {doOptions(req, resp);} else if (method.equals(METHOD_TRACE)) {doTrace(req, resp);} ……}二、案例
來舉一個登錄的小栗子吧,因為比較懶,就沒有連接數據庫驗證用戶名密碼是否存在且正確~~~
1.新建一個maven項目
在pom.xml文件里加入必要的依賴包
<dependency><groupId>javax.servlet</groupId><artifactId>servlet-api</artifactId><version>2.4</version><scope>provided</scope></dependency><dependency><groupId>javax.servlet.jsp</groupId><artifactId>jsp-api</artifactId><version>2.1</version><scope>provided</scope></dependency>2.新建一個登陸界面login.jsp
<%@ page language="java" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /><title>登錄界面</title> </head> <body><form id="login" method="post" action="login">用戶名:<input type="text" name="username" value="Annie"/><br />密碼:<input type="password" name="pwd" value="123"/><br /><input type="submit" value="登錄"></input></form> </body> </html>3.新建一個歡迎的跳轉頁面welcome.jsp
<%@ page language="java" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /><title>歡迎界面</title> </head> <body>親愛的<%=session.getAttribute("name") %>:你好!歡迎登錄! </body> </html>4.新建一個Servlet類
package com.yolanda.fun.servlet;import java.io.IOException;import javax.servlet.RequestDispatcher; import javax.servlet.Servlet; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession;public class LoginServlet extends HttpServlet implements Servlet{/*** */private static final long serialVersionUID = 1L;public void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {String username = request.getParameter("username");String pwd = request.getParameter("pwd");HttpSession session = request.getSession();session.setAttribute("name", username);// Servlet本身并不輸出響應到客戶端,因此必須將請求轉發RequestDispatcher rd = request.getRequestDispatcher("/welcome.jsp");// 轉發請求rd.forward(request, response);} }當然這個類還有一種寫法
package com.yolanda.fun.servlet;import java.io.IOException;import javax.servlet.RequestDispatcher; import javax.servlet.Servlet; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession;public class LoginServlet extends HttpServlet implements Servlet{/*** */private static final long serialVersionUID = 1L;public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {String username = request.getParameter("username");String pwd = request.getParameter("pwd");HttpSession session = request.getSession();session.setAttribute("name", username);// Servlet本身并不輸出響應到客戶端,因此必須將請求轉發RequestDispatcher rd = request.getRequestDispatcher("/welcome.jsp");// 轉發請求rd.forward(request, response);}public void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {doPost(req, resp);} }兩種都可以噠。
這個地方用了一個請求轉發類,看下源碼里的定義,轉發request請求
5.將Servlet配置在Web應用中,以響應用戶請求
在web.xml文件里面配置一下這個servlet就好啦
<!DOCTYPE web-app PUBLIC"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN""http://java.sun.com/dtd/web-app_2_3.dtd" ><web-app><display-name>ServletDemo</display-name><servlet><servlet-name>loginServlet</servlet-name><servlet-class>com.yolanda.fun.servlet.LoginServlet</servlet-class> <servlet-mapping><servlet-name>loginServlet</servlet-name><url-pattern>/login</url-pattern></servlet-mapping></web-app>還有一種方式不用在web.xml里配置,直接用注釋的方式來配置,那怎么寫呢?
用@WebServlet這個注釋,但是提示我沒有這個注釋,這是因為我用的
servlet-api的版本里沒有這個類
到\apache-tomcat-8.0.24\lib里找到這個包servlet-api.jar
反編譯看一下,有這個類
那把上面的那個pom文件里的jar包
<dependency><groupId>javax.servlet</groupId><artifactId>servlet-api</artifactId><version>2.4</version><scope>provided</scope></dependency>刪掉
外部引用包,替換成tomcat8里面的那個jar包
在剛才的Servlet類里加一行注釋
@WebServlet(name="loginServlet", urlPatterns="/login")
web.xml里面的Servlet配置刪掉。
效果嘛,就是這樣,入口地址
http://localhost:8080/servletDemo/login.jsp
跳轉以后的頁面,網址變成了http://localhost:8080/servletDemo/login
其實上面直接在welcome.jsp里面用
<%=request.getParameter(“username”)%>
不用Servlet類,也可以達到上面的效果,用到Servlet類主要是想作為控制層, 來做一些復雜一點的操作,比如連接一下數據庫,驗證一下用戶名密碼,因為我懶嘛,就沒有寫了。如果要連接的話,也很簡單
在web.xml文件里配置一下
<init-param><param-name>driver</param-name><param-value>oracle.jdbc.driver.OracleDriver</param-value></init-param><init-param><param-name>url</param-name><param-value>jdbc:oracle:thin:@(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST = …)(PORT = 1521)))(CONNECT_DATA=(SERVICE_NAME=…)(SERVER=DEDICATED)))</param-value></init-param><init-param><param-name>user</param-name><param-value>root</param-value></init-param><init-param><param-name>pwd</param-name><param-value>123</param-value></init-param>或者在Servlet類的前面用注釋配置也可以
@WebServlet(name="loginServlet", urlPatterns={"/login"}, initParams={@WebInitParam(name="driver", value="oracle.jdbc.driver.OracleDriver"),@WebInitParam(name="url", value="jdbc:oracle:thin:@(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST = …)(PORT = 1521)))(CONNECT_DATA=(SERVICE_NAME=…)(SERVER=DEDICATED)))"),@WebInitParam(name="user", value="root"),@WebInitParam(name="pwd", value="123")})接下來就是獲取上述的配置啦,寫在Servlet類里面就好了,通過ServletConfig對象來完成
String driver = config.getInitParameter("driver");String url = config.getInitParameter("url");String user = config.getInitParameter("user");String pwd = config.getInitParameter("pwd");后面的步驟就是注冊驅動、獲取連接等數據庫連接的基本操作啦,懶得寫啦~~
三、Servlet的生命周期
Servlet在Web容器中運行的時候,其實例的創建和銷毀是由Web容器來控制的。
創建Servlet實例有兩個時機,
(1)客戶端第一次請求某個Servlet時,系統創建該Servlet的實例;
(2)Web應用啟動時,立即創建Servlet實例,即load-on-startup Servlet。
每個Servlet運行都遵循以下生命周期
(1)創建Servlet實例;
(2)Web容器調用Servlet的init方法,對Servlet進行初始化;
(3)Servlet初始化后,將一直存在于容器中,用于響應客戶端請求;
(4)Web容器先調用Servlet的destroy方法,通常在Web應用關閉時,銷毀Servlet。
四、load-on-startup
Servlet配置這個屬性后,將會在Web應用啟動時,立即創建Servlet實例,其數值越小,優先級越高。
配置方法也是兩種
1.在web.xml里配置,例如
<servlet><servlet-name>appServlet</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><load-on-startup>2</load-on-startup></servlet>2.就是直接在Servlet類前面的注釋
@WebServlet(loadOnStartup=2)就醬~
總結
以上是生活随笔為你收集整理的J2EE学习笔记(四)之Servlet原理的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 一文带你完全掌握机器人DH参数建模(详细
- 下一篇: Servlet的原理是什么?