注冊用戶即可下載全站資源 關注Java幫幫微信公眾號
 

Web-第八天 Servlet學習【悟空教程】

76
發表時間:2018-11-07 16:17來源:Java幫幫-微信公眾號

Servlet

今日內容介紹

  • 案例:完成用戶登錄的功能

今日內容學習目標

  • 可以獨立編寫Servlet程序

  • 可以使用request接收請求參數

  • 了解ServletConfig的使用

第1章 案例:使用Servlet完成一個用戶登錄的案例.

1.1 案例需求:

在網站的首頁上,登錄的鏈接,點擊登錄的鏈接,可以跳轉到登錄的頁面.在登錄的頁面中輸入用戶名和密碼點擊登錄的案例.完成登錄的功能.

1.2 相關知識點:

1.2.1 Servlet的概述

1.2.1.1 什么是Servlet

Servlet 運行在服務端的Java小程序,是sun公司提供一套規范,用來處理客戶端請求、響應給瀏覽器的動態資源。

ServletJavaWeb三大組件之一(ServletFilterListener),且最重要。

1.2.1.2 Servlet的作用

用來處理從客戶端發送過來的請求,并對該請求作出響應。

Servlet的任務有:

1. 獲取請求數據

2. 處理請求

3. 完成響應

1.2.2 Servlet的入門

1.2.2.1 準備工作

Servlet規范要求:Servlet程序需要編寫實現類,并在web.xml進行配置。

  • 實現類:通常繼承javax.servlet.http.HttpServlet類,并復寫doGet和doPost方法。

  • doGet()方法用于處理get請求。

  • doPost()方法用于處理post請求。

配置信息:在web.xml進行配置。


1.2.2.2 編寫步驟

1. 創建類,繼承HttpServlet,復寫doGet和doPost方法

package cn.com.javahelp.demo01.a_servlet;

import java.io.IOException;

import javax.servlet.ServletException;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;


public class HelloServlet extends HttpServlet{

@Override

public void doGet(HttpServletRequest req, HttpServletResponse resp)

throws ServletException, IOException {

System.out.println("get請求將執行");

}


@Override

public void doPost(HttpServletRequest req, HttpServletResponse resp)

throws ServletException, IOException {

System.out.println("post請求將執行");

}

}


2. 編寫配置文件

<!-- demo01 servlet hello start

* <servlet> 注冊servlet

<servlet-name> servlet名稱,當前xml中唯一

<servlet-class> servlet實現類的全限定類名

* <servlet-mapping> 給注冊的servlet添加映射路徑

<servlet-name> 已經注冊的servlet名稱。注意:必須與注冊的名稱一致。

<url-pattern> 訪問路徑。要求:必須/開頭

-->

<servlet>

<servlet-name>helloServlet</servlet-name>

<servlet-class>cn.com.javahelp.demo01.a_servlet.HelloServlet</servlet-class>

</servlet>

<servlet-mapping>

<servlet-name>helloServlet</servlet-name>

<url-pattern>/hello</url-pattern>

</servlet-mapping>

<!-- demo01 servlet hello end -->

3. 瀏覽器訪問

在瀏覽器地址欄輸入:http://localhost:8080/day13/hello

  • 瀏覽器顯示空白頁面

  • 控制打印信息


1.2.2.3 Servlet的執行的流程詳解:


1.2.3 Request接收請求參數

1.2.3.1 Request接收請求參數的概述

請求參數

方法名

描述

String getParameter(String name)

獲得指定參數名對應的值。如果沒有返回null,如果只有多個獲得第一個。

例如:username=jack

1.2.3.2 Request接收請求參數入門

  • 編寫步驟

1. 編寫表單,提供表單字段:username、password、hobby,以post方式提交

<form action="../demo01ParamServlet" method="post">

用戶名:<input type="text" name="username" value="jack" /> <br/>

密碼:<input type="text" name="password" value="1234" /> <br/>

愛好:<input type="checkbox" name="hobby" value="抽煙" checked="checked"/> 抽煙

<input type="checkbox" name="hobby" value="喝酒" checked="checked" /> 喝酒

<input type="checkbox" name="hobby" value="燙頭" /> 燙頭  <br/>

<input type="submit" value="post提交" />

</form>

2. 編寫Servlet實現類,使用對應方法獲得請求參數,并處理POST中文亂碼。

public class Demo01ParamServlet extends HttpServlet {

private static final long serialVersionUID = 1L;

public void doGet(HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException {

//0請求參數中文亂碼

request.setCharacterEncoding("UTF-8");


//1 使用參數名獲得一個值

//1.1 獲得用戶名

String username = request.getParameter("username");

//1.2 獲得密碼

String password = request.getParameter("password");

System.out.println(username  + " : " + password);


//2 使用參數名獲得一組值

String[] hobbies = request.getParameterValues("hobby");

System.out.println(Arrays.toString(hobbies));


//3 獲得所有數據,遍歷Map

System.out.println("---------------");

Map<String,String[]> allData = request.getParameterMap();

for (Map.Entry<String, String[]> entry : allData.entrySet()) {

System.out.print(entry.getKey());

System.out.print( " --> ");

System.out.println(Arrays.toString(entry.getValue()));

}

}


public void doPost(HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException {

/* 開發中我們發現,doPostdoGet兩個方法編寫的內容相同

* 所以常使用一個調用另一個,此處我們使用doPost調用doGet

* 所有的內容之后都編寫doGet方法中

*/

doGet(request, response);

}

}

3. 編寫Servlet,配置文件

<servlet>

<servlet-name>Demo01ParamServlet</servlet-name>

<servlet-class>cn.com.javahelp.demo01.b_request.Demo01ParamServlet</servlet-class>

</servlet>

<servlet-mapping>

<servlet-name>Demo01ParamServlet</servlet-name>

<url-pattern>/demo01ParamServlet</url-pattern>

</servlet-mapping>

4. 測試,訪問“http://localhost:8080/day13/02.request/form.html”,并提交表單。控制臺顯示

1.3 案例分析

1.4 代碼實現

Servlet的代碼

public class UserServlet extends HttpServlet {

private static final long serialVersionUID = 1L;

protected void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {

try {

// 1.接收表單提交的參數.

String username = request.getParameter("username");

String password = request.getParameter("password");

// 2.封裝到實體對象中.

User user = new User();

user.setUsername(username);

user.setPassword(password);


// 3.調用業務層處理數據.

UserService userService = new UserService();

User existUser = userService.login(user);

// 4.根據處理結果顯示信息(頁面跳轉).

if(existUser == null){

// 登錄失敗

response.getWriter().println("Login Fail...");

}else{

// 登錄成功

response.getWriter().println("Login Success...");

}

} catch (Exception e) {

e.printStackTrace();

}

}


protected void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {

doGet(request, response);

}

}


Service的代碼:

public class UserService {

/**

* 業務層用戶登錄的方法:

* @param user

* @return

* @throws SQLException

*/

public User login(User user) throws SQLException {

// 調用DAO完成對數據庫查詢的操作:

UserDao userDao = new UserDao();

return userDao.login(user);

}

}


DAO的代碼

public class UserDao {

/**

* 用戶登錄的DAO的方法:

* @param user

* @return

* @throws SQLException

*/

public User login(User user) throws SQLException {

QueryRunner queryRunner = new QueryRunner(JDBCUtils.getDataSource());

String sql = "select * from user where username =? and password = ?";

User existUser = queryRunner.query(sql, new BeanHandler<User>(User.class),user.getUsername(),user.getPassword());

return existUser;

}

}


1.5 總結:

1.5.1 Servlet的生命周期:

  • 生命周期:就是一個對象從創建到銷毀的過程.

  • Servlet生命周期:Servlet從創建到銷毀的過程.

    • 何時創建:用戶第一次訪問Servlet創建Servlet的實例 (單實例)

    • 何時銷毀:當項目從服務器中移除的時候,或者關閉服務器的時候.

  • Servlet規范規定,所有的servlet必須實現 javax.servlet.Servlet接口。

1.第一次調用時,將執行初始化方法:init(ServletConfig)

2.每一次調用,都將執行service(ServletRequest,ServletResponse)方法

3.服務器關閉,或項目移除:destroy()方法

  • JavaEE規范中提供Servlet接口實現類:

    • GenericServlet:通用servlet實現。沒有實現service

    • HttpServlet:與Http協議有關的實現。實現service方法,完成與http協議有關的操作。

request.getMethod()  獲得請求方式(get、post)

如果是get,將調用doGet()

如果是post,將調用doPost()

  • servlet被訪問過程描述

1. 用戶第一次訪問Servlet的時候,首先服務器會創建一個Servlet的實例

2. 創建servlet實例同時執行Servlet的init方法。

3. 然后,每一次請求服務器都會創建一個新的線程訪問Servlet中的service的方法,在service方法內部根據請求的方式的不同調用doXxx的方法(get請求調用doGet,post請求調用doPost)。

4. 當Servlet從服務器中被移除,或者關閉服務器,Servlet的實例就會被銷毀,同時destroy方法將會執行。


1.5.2 Servlet的相關的配置:

1.5.2.1 【啟動時創建Servlet

Servlet默認是在第一次訪問的時候創建的.現在讓Servlet在服務器啟動的時候創建好.進行對Servlet的配置:

web.xml中在<servlet></servlet>標簽中配置:

* <load-on-startup>2</load-on-startup>  --- 傳入正整數,整數越小,被創建的優先級就越高.

1.5.2.2 url-pattern的配置】

url-pattern配置方式共有三種:

1.完全路徑匹配 :以 / 開始    

例如: /ServletDemo4 , /aaa/ServletDemo5 , /aaa/bbb/ServletDemo6

2.目錄匹配  :以 / 開始 需要以 * 結束.

例如: /*  (所有) ,/aaa/* aaa目錄下的所有) ,/aaa/bbb/*

3.擴展名匹配  :不能以 / 開始 以 * 開始的. 例如: *.do , *.action *.jsp *.jpg

***** 錯誤的寫法 /*.do

4.缺省路徑 /

通常情況訪問 html頁面時,首先從當前web項目的web.xml文件尋找匹配路徑,如果如果沒有找到,再從tomcat默認的web.xml匹配,將使用缺省servlet

tomcat獲得匹配路徑時,優先級順序:1 > 2 > 3 > 4

有如下的配置:

 <servlet>

   <servlet-name>ServletDemo4</servlet-name>

   <servlet-class>cn.com.javahelp.a_servlet.ServletDemo4</servlet-class>

 </servlet>

 <servlet-mapping>

   <servlet-name>ServletDemo4</servlet-name>

   <url-pattern>/ServletDemo4</url-pattern>

 </servlet-mapping>

 <servlet>

   <servlet-name>ServletDemo5</servlet-name>

   <servlet-class>cn.com.javahelp.a_servlet.ServletDemo5</servlet-class>

 </servlet>

 <servlet-mapping>

   <servlet-name>ServletDemo5</servlet-name>

   <url-pattern>/*</url-pattern>

 </servlet-mapping>


 <servlet>

   <servlet-name>ServletDemo6</servlet-name>

   <servlet-class>cn.com.javahelp.a_servlet.ServletDemo6</servlet-class>

 </servlet>

 <servlet-mapping>

   <servlet-name>ServletDemo6</servlet-name>

   <url-pattern>*.do</url-pattern>

 </servlet-mapping>


如果訪問地址:

http://localhost:8080/day13/ServletDemo4  :第一個

http://localhost:8080/day13/aaa.do    :第二個

***** 完全路徑匹配 > 目錄匹配 > 擴展名匹配


1.5.3 開發中的路徑的編寫:

  • 相對路徑:都是需要找位置相對關系.不能以 / 開始的.

* ./ 當前路徑  ../上一級目錄

* 使用相對路徑訪問:

   * http://localhost:8080/day13/demo4-url/demo1.html

   * http://localhost:8080/day13/ServletDemo6

  • 絕對路徑:不需要找位置相對關系. 以 / 開始的.

* 絕對路徑中分為客戶端路徑和服務器端路徑:

   * 客戶端路徑一定要加工程名.  /day13/ServletDemo6

   * 服務器端路徑不需要加工程名. /ServletDemo6

1.5.4 ServletConfig:獲得Servlet的配置信息(了解)

方法名

返回值類型

描述

getInitParameter(name)

String

獲得Servlet的初始化參數的

getInitParameterNames()

Enumeration

獲得所有Servlet的初始化參數的名稱

getServletContext()

ServletContext

獲得ServletContext對象的引用

getServletName()

String

獲得Servletweb.xml中配置的name的值。

<servlet-name>標簽配置內容。

  • servlet的初始化參數


第2章 總結


支付寶贊助-Java幫幫社區
微信贊助-Java幫幫社區
Java幫幫公眾號生態

Java幫幫公眾號生態

總有一款適合你

Java幫幫-微信公眾號

Java幫幫-微信公眾號

將分享做到極致

Python幫幫-公眾號

Python幫幫-公眾號

人工智能,爬蟲,學習教程

大數據驛站-微信公眾號

大數據驛站-微信公眾號

一起在數據中成長

九點編程-公眾號

九點編程-公眾號

深夜九點學編程

程序員生活志-公眾號

程序員生活志-公眾號

互聯網,職場,程序員那些事兒

Java幫幫學習群生態

Java幫幫學習群生態

總有一款能幫到你

Java學習群

Java學習群

與大牛一起交流

大數據學習群

大數據學習群

在數據中成長

九點編程學習群

九點編程學習群

深夜九點學編程

python學習群

python學習群

人工智能,爬蟲

測試學習群

測試學習群

感受測試的魅力

Java幫幫生態承諾

Java幫幫生態承諾

一直堅守,不負重望

初心
勤儉
誠信
正義
分享
合作品牌 非盈利生態-優質內容分享傳播者
關于我們
友鏈申請
友鏈交換:加幫主QQ2524138991 留言即可 24小時內答復  
全站內容非商業用途,內容來源于網友,并遵循 許可,如有異議請聯系客服。
會員登錄
獲取驗證碼
登錄
登錄
我的資料
留言
回到頂部