日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

J2EE学习笔记(四)之Servlet原理

發布時間:2023/12/14 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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原理的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。