天天看點

JavaEE Day14 Servlet&HTTP&Request

今日内容

1、Servlet

2、HTTP協定

3、Request

一、Servlet

1、概念

2、步驟

3、執行原理

4、生命周期

5、Servlet 3.0注解配置

6、Servlet體系結構

Servlet---接口

        |

GenericServlet---抽象類

        |

 HttpServlet---抽象類

  • GenericServlet:将Servlet接口中的其他方法做了預設空實作,隻将service()方法作為抽象
  • 将來定義Servlet類時,可以繼承GenericServlet,實作service()方法即可
  • 其他方法可以複寫重寫@Override
  • 不用這種方式
  • HttpServlet:對http協定的一種封裝,可以簡化操作
  • 定義類去繼承HttpServlet
  • 複寫doget或dopost方法
JavaEE Day14 Servlet&HTTP&Request

7、Servlet相關配置

  1. urlpattern
  1. 一個Servlet可以定義多個通路路徑   @WebServlet({"/demo4","/dd4"})
  2. 路徑的定義規則
  1. /XXX
  2. /XXX/XXX:多層路徑/目錄結構
  3. *.do/其他字尾名

二、HTTP

1、概念:Hyper Text Transfer Protocol 超文本傳輸協定

  • 傳輸協定:定義了用戶端和伺服器端通信時發送資料的格式
JavaEE Day14 Servlet&HTTP&Request
  • 特點:
  • 基于TCP/IP的進階協定
  • 預設端口好:80
  • ​​http://www.baidu.com:80​​
  • 基于請求響應模型的:一次請求對應于一次響應
  • 無狀态的協定:每次請求之間互相獨立,多次請求響應之間不能互動資料
  • 曆史版本
  • 1.0:每一次請求響應都會建立新的連接配接
  • 1.1:複用之前的連接配接(css、圖檔等,一個頁面包含多個連接配接),對緩存的支援比較好

2、request請求消息資料格式

  • 請求行
  • 請求方式: 請求url  請求協定/版本
  • GET /login.html  HTTP1.1
  • HTTP有7種請求方式,常用的有兩種
  • GET
  • 請求參數在請求行中/在url後
  • 請求的url長度是有限制的
  • 不太安全
  • POST
  • 請求參數在請求體中
  • 請求的url長度是沒有限制的
  • 相對安全
  • 請求頭
  • 請求頭名稱:請求頭值
    JavaEE Day14 Servlet&HTTP&Request
    JavaEE Day14 Servlet&HTTP&Request
  • 常見的請求頭
    • host:請求的主機
    • User-Agent:浏覽器告訴伺服器,通路時使用的浏覽器版本資訊
      • 可以在伺服器端擷取浏覽器的資訊,來解決相容性問題
        JavaEE Day14 Servlet&HTTP&Request
    • Accept:通路時可以相應的格式
    • Accept-Encoding:可以接收的編碼或壓縮格式
    • Refere:告訴伺服器,我(目前請求)從哪裡來
      • 作用
        • 防盜鍊
        • 統計工作
          JavaEE Day14 Servlet&HTTP&Request
    • Connection:連接配接是否可以複用
    • Upgrade-Insecure-request:更新
  • 請求空行
  • 空行
  • 請求體/正文
  • 封裝post請求消息請求體的
  • 字元串格式:

    GET /login.html HTTP1.1

JavaEE Day14 Servlet&HTTP&Request

三、Request

1、request對象和response對象的原理

JavaEE Day14 Servlet&HTTP&Request

通過request對象擷取請求消息資料,通過response對象設定響應消息資料

注意:

  1. request和response對象是由伺服器建立的,我們來使用而已
  2. request對象擷取請求消息,response對象設定響應消息

2、request對象的繼承體系結構

ServletRequest-----接口

            |  繼承

HttpServletRequest---接口

            |  實作

org.apache.catalina.connector.RequestFacade@3beac8b5(tomcat建立的類實作了上述接口)

3、Request對象的功能

  • 擷取請求消息資料
  • 擷取請求行資料
  • GET /day14/demo1?name=zhangsan HTTP/1.1
  • 方法
  • 擷取請求方式:GET
  • String getMethod()
  • (*)擷取虛拟目錄:/day14
  • String getContextPath()
  • 擷取Servlet的路徑:  /demo1
  • String getServlet()
  • 擷取get方式的請求方式:name=zhangsan
  • String getQueryString()
  • (*)擷取請求的URI:/day14/demo1
  • String getRequestURI():/day14/demo1
  • StringBuffer getRequestURL()  :http://localhost/day14/demo1
  • 差別
  • URL:統一資源定位符--http://localhost/day14/demo1,相當于中華人民共和國
  • URI:統一資源辨別符--/day14/demo1,相當于共和國,範圍大
  • 擷取協定及版本 :HTTP/1.1
  • String getProtocol()
  • 擷取客戶機的IP位址
  • String getRemoteAddr()

代碼

package cm.liujinhui.web.request;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/**
 * 示範request對象擷取請求行資料
 *
 * 擷取請求行資料
 GET /day14/demo1?name=zhangsan HTTP/1.1
 方法
 擷取請求方式:GET
 String getMethod()
 (*)擷取虛拟目錄:/day14
 String getContextPath()
 擷取Servlet的路徑:  /demo1
 String getServlet()
 擷取get方式的請求方式:name=zhangsan
 String getQueryString()
 (*)擷取請求的URI:/day14/demo1
 String getRequestURI():/day14/demo1
 StringBuffer getRequestURL()  :http://localhost/day14/demo1
 擷取協定及版本 :HTTP/1.1
 String getProtocol()
 擷取客戶機的IP位址
 String getRemoteAddr()
 */
@WebServlet("/RequestDemo1")
public class RequestDemo1 extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    }
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //1.擷取請求方式
        System.out.println(request.getMethod());
        //2.(*)擷取虛拟目錄:/day14
        System.out.println(request.getContextPath());
        //3.擷取Servlet的路徑:  /demo1
        System.out.println(request.getServletPath());
        //擷取get方式的請求方式:name=zhangsan
        System.out.println(request.getQueryString());
        //(*)擷取請求的URI:/day14/demo1
        System.out.println(request.getRequestURI());
        System.out.println(request.getRequestURL());
        // 擷取協定及版本 :HTTP/1.1
        System.out.println(request.getProtocol());
        //擷取客戶機的IP位址
        System.out.println(request.getRemoteAddr());
    }
}      
  • 擷取請求頭資料
  • 方法
  • String getHeader(String name):通過請求頭的名稱擷取請求頭的值
  • Enumeration<String> getHeaderNames():擷取所有請求頭名稱
  • 該接口的功能由Iterator接口複制。 此外, Iterator添加了可選的删除操作,并且具有較短的方法名稱。 新的實作應該考慮使用Iterator ,而不是Enumeration 。
JavaEE Day14 Servlet&amp;HTTP&amp;Request

代碼示範

package cm.liujinhui.web.request;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Enumeration;

/**
 * 示範擷取請求頭資料:user-agent
 */
@WebServlet("/RequestDemo3")
public class RequestDemo3 extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //示範擷取請求頭資料:user-agent
        String agent = request.getHeader("user-agent");
        //判斷agent的浏覽器版本
        if (agent.contains("Chrome")){
            //谷歌
            System.out.println("谷歌來了。。。");
            //以後可以解決相容資訊
        }else if (agent.contains("Firefox")){
            //火狐浏覽器
            System.out.println("火狐來了");
        }
    }
}      
package cm.liujinhui.web.request;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
 * 示範擷取請求頭資料:referer
 */
@WebServlet("/RequestDemo4")
public class RequestDemo4 extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    }
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //示範擷取請求頭資料:referer
        String referer = request.getHeader("referer");
        System.out.println(referer);
        //防盜鍊
        if (referer!=null){
            if (referer.contains("/day14")){
                //正常通路
                System.out.println("播放電影");
                response.setContentType("text/html;charset=utf-8");
                response.getWriter().write("播放電影");
            }else{
                //盜鍊
                System.out.println("想看電影嗎,來優酷吧");
                response.setContentType("text/html;charset=utf-8");
                response.getWriter().write("想看電影嗎,來優酷吧");
            }
        }

    }
}      
  • 擷取請求體資料
  • 請求體:隻要POST方式,才有請求體,在請求體中封裝了POST請求的請求參數
  • 步驟:
  • 擷取流對象
  • BufferedReader getReader()  :擷取字元輸入流,隻能操作字元資料
  • ServletInputStream getInputStream():擷取位元組輸入流,可以操作所有類型資料【也可以字元】
  • 在檔案上傳知識點後講解
  • 再從流對象中拿資料(位元組流或字元流)
package cm.liujinhui.web.request;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.BufferedReader;
import java.io.IOException;
@WebServlet("/RequestDemo5")
public class RequestDemo5 extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //擷取請求消息體--請求參數
        //1.擷取字元流
        BufferedReader br = request.getReader();
        //2.讀取資料
        String line = null;
        while((line=br.readLine())!=null){
            System.out.println(line);
        }
    }

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

    }
}      
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<form action="/day14/RequestDemo5" method="post">
    <input type="text" placeholder="請輸入使用者名" name="username"><br>
    <input type="password" placeholder="請輸入密碼" name="password"><br>
    <input type="submit" value="注冊">
</form>
</body>
</html>      

4、其他功能

  • 擷取請求參數通用方式:不論是get還是post請求方式都可以使用下列方法來擷取請求參數
  • String getParameter(String name):根據參數名稱擷取參數值
  • 如:user=zs&password=123
  • String[] getParameterValues(String name):根據參數名稱擷取參數值的數組
  • 如:hobby=xxx&hobby=111 複選框
  • Enumeration<String>  getParameterNames():擷取所有請求的參數名稱
  • Map<String,String[]> getParameterMap():擷取參數鍵值對的集合
package cm.liujinhui.web.request;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.BufferedReader;
import java.io.IOException;
import java.util.Enumeration;
import java.util.Map;
import java.util.Set;

@WebServlet("/RequestDemo6")
public class RequestDemo6 extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
       //post擷取請求參數
        //根據參數名稱擷取參數值
        String username = request.getParameter("username");
        /*System.out.println("post");
        System.out.println(username);*/
        //String[] getParameterValues(String name):根據參數名稱擷取參數值的數組
        String[] hobbies = request.getParameterValues("hobby");
        /*for (String hobby : hobbies) {
            System.out.println(hobby);
        }*/
        //Enumeration<String>  getParameterNames():擷取所有請求的參數名稱
        Enumeration<String> parameterNames = request.getParameterNames();
    /*    while(parameterNames.hasMoreElements()){
            String name = parameterNames.nextElement();
            System.out.println(name);
            String value = request.getParameter(name);
            System.out.println(value);
            System.out.println("-----------------");
        }*/
        //Map<String,String[]> getParameterMap():擷取參數鍵值對的集合
        Map<String, String[]> parameterMap = request.getParameterMap();
        //周遊,keySet
        Set<String> keySet = parameterMap.keySet();
        for (String name : keySet) {
            //根據鍵擷取值
            String[] values = parameterMap.get(name);
            System.out.println(name);
            for (String value : values) {
                System.out.println(value);
            }
            System.out.println("-------------");
        }
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //post擷取請求參數
        //根據參數名稱擷取參數值
        /*String username = request.getParameter("username");
        System.out.println("get");
        System.out.println(username);*/
        this.doPost(request,response);
    }
}      
  • 産生的中文亂碼問題
  • get方式:tomcat8已經将get方式亂碼問題解決
  • post方式:會亂碼
  • 解決:在擷取參數前,設定request的編碼request.setCharacterEncoding("utf-8");
package cm.liujinhui.web.request;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Enumeration;
import java.util.Map;
import java.util.Set;

@WebServlet("/RequestDemo7")
public class RequestDemo7 extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //1.設定流的字元集
        request.setCharacterEncoding("utf-8");
        //擷取請求參數username
        String username = request.getParameter("username");
        System.out.println(username);
    }

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

        this.doPost(request,response);
    }
}      
  • 請求轉發:一種在伺服器内部的資源跳轉方式
JavaEE Day14 Servlet&amp;HTTP&amp;Request
  • 步驟
  • 通過request對象擷取請求轉發器對象:RequestDispatcher getRequestDispatcher(String path)
  • 使用RequestDispatcher對象進行轉發:void forward(ServletRequest request,ServletResponse response)
  • 特點【面試】:
  • 浏覽器位址欄路徑沒有發生變化
  • 隻能轉發到目前伺服器内部的資源中
  • 多個轉發屬于同一次請求
package cm.liujinhui.web.request;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebServlet("/RequestDemo8")
public class RequestDemo8 extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("demo8888888888被通路了");
        //轉發到demo9資源
        request.getRequestDispatcher("/RequestDemo9").forward(request,response);
        //request.getRequestDispatcher("http://www.itcast.cn").forward(request,response);
    }

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

        this.doPost(request,response);
    }
}      
package cm.liujinhui.web.request;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebServlet("/RequestDemo9")
public class RequestDemo9 extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("demo999999999999也被通路了");
    }

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

        this.doPost(request,response);
    }
}      
  • 共享資料(域對象)
  • 域對象:一個有作用範圍的對象,可以在範圍内共享資料
  • request域:一次請求的範圍,一般用于請求轉發的多個資源中共享資料。(轉發過程中共享資料)
  • 方法
  • void setAttribute(String name,Object obj ):存儲資料
  • Object getAttribute(String name):通過鍵擷取值
  • void removeAttribute(String name): 通過鍵移除鍵值對
  • 擷取ServletContext對象
  • ServletContext getServletContext()
package cm.liujinhui.web.request;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebServlet("/RequestDemo8")
public class RequestDemo8 extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("demo8888888888被通路了");
        //存儲資料到request中
        request.setAttribute("msg","hello");
        //轉發到demo9資源
        request.getRequestDispatcher("/RequestDemo9").forward(request,response);
        //request.getRequestDispatcher("http://www.itcast.cn").forward(request,response);
    }

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

        this.doPost(request,response);
    }
}      
package cm.liujinhui.web.request;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebServlet("/RequestDemo9")
public class RequestDemo9 extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("demo999999999999也被通路了");
        //擷取資料
        Object msg = request.getAttribute("msg");
        System.out.println(msg);
        ServletContext servletContext = request.getServletContext();
        System.out.println(servletContext);
    }

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

        this.doPost(request,response);
    }
}      

四、登入案例

1、需求描述

使用者登入案例需求:

  • 1.編寫login.html登入頁面
  • username & password 兩個輸入框
  • 2.使用Druid資料庫連接配接池技術,操作mysql,day14資料庫中user表
  • 3.使用JdbcTemplate技術封裝JDBC
  • 4.登入成功跳轉到SuccessServlet展示:登入成功!使用者名,歡迎您
  • 5.登入失敗跳轉到FailServlet展示:登入失敗,使用者名或密碼錯誤

2、分析

JavaEE Day14 Servlet&amp;HTTP&amp;Request

Dao:Database Access Object

JavaEE Day14 Servlet&amp;HTTP&amp;Request
JavaEE Day14 Servlet&amp;HTTP&amp;Request

3、開發步驟

  • 建立項目,導入html頁面,配置檔案,jar包
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <form action="/day14_test/LoginServlet" method="get">
        使用者名:<input type="text" name="username"> <br>
        密碼:<input type="password" name="password"><br>

        <input type="submit" value="登入">

    </form>
</body>
</html>      
  • 建立資料庫環境
CREATE DATABASE day14;

USE day14;

CREATE TABLE USER(
  id INT PRIMARY KEY AUTO_INCREMENT,
  username VARCHAR(32) UNIQUE NOT NULL,
  PASSWORD VARCHAR(32) NOT NULL
);      
  • 建立包:cn.itcast.domain,建立User類(包和類一次建立好)
package cn.liujinhui.domain;

/**
 * 使用者的實體類JavaBean
 */
public class User {
    private int id;
    private String username;
    private String password;
    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", username='" + username + '\'' +
                ", password='" + password + '\'' +
                '}';
    }
}      
  • 先寫操作資料庫邏輯的代碼,再寫對應的Servlet
package cn.liujinhui.util;

import com.alibaba.druid.pool.DruidDataSourceFactory;

import javax.sql.DataSource;
import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.Properties;

/**
 * JDBC的工具類 使用Durid連接配接池
 */
public class JDBCUtils {
    private static DataSource ds;
    static{
        //1.加載配置檔案
        Properties pro = new Properties();
        //使用ClassLoader加載配置檔案,擷取位元組輸入流
        InputStream is = JDBCUtils.class.getClassLoader().getResourceAsStream("druid.properties");
        try {
            pro.load(is);
        } catch (IOException e) {
            e.printStackTrace();
        }
        //2.初始化連接配接對象
        try {
            ds = DruidDataSourceFactory.createDataSource(pro);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    /**
     * 文檔注釋
     * 擷取連接配接池對象
     */
    public static DataSource getDataSource(){
        return ds;
    }


    /**
     * 擷取連接配接Connection對象
     */
    public static Connection  getConnection() throws SQLException {
        return ds.getConnection();
    }
}      
  • 建立包cn.liujinhui.dao,建立類UserDao,提供login方法
package cn.liujinhui.dao;

import cn.liujinhui.domain.User;
import cn.liujinhui.util.JDBCUtils;
import org.springframework.dao.DataAccessException;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;

/**
 * 操作資料庫中User表的類
 */
public class UserDao {
    //聲明JDBCTemplate對象公用
    private JdbcTemplate template = new JdbcTemplate(JDBCUtils.getDataSource());
    /**
     * 文檔注釋:登入方法
     * @param loginUser 隻有使用者名和密碼
     * @return User 包含使用者全部資料;沒有查詢到,傳回null
     * 需要使用druid連接配接池才能實作,先建立一個工具類
     */
    public User login(User loginUser){
        try {
            //1.編寫sql
            String sql= "select * from user where username = ? and password = ?";
            //2.調用query方法
            User user = template.queryForObject(sql,
                    new BeanPropertyRowMapper<User>(User.class),
                    loginUser.getUsername(), loginUser.getPassword());
            return user;
        } catch (DataAccessException e) {
            e.printStackTrace();
            return null;
        }
    }
}      
  • 編寫cn.liujinhui.web.servlet.LoginServlet類
package cn.liujinhui.web.servlet;

import cn.liujinhui.domain.User;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebServlet("/successServlet")
public class successServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //給頁面寫一句話
        //設定編碼
        response.setContentType("text/html;charset=utf-8");
        //擷取request中共享的user對象
        User user = (User) request.getAttribute("user");
        if (user!=null){
            //輸出
            response.getWriter().write("登入成功!"+user.getUsername()+",歡迎您");
        }
    }
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request,response);
    }
}      
package cn.liujinhui.web.servlet;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebServlet("/failServlet")
public class failServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //給頁面寫一句話
        //設定編碼
        response.setContentType("text/html;charset=utf-8");
        //輸出
        response.getWriter().write("登入失敗,使用者名或密碼錯誤");
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request,response);
    }
}      
  • 注意:login.html中form表單的action路徑的寫法
  • 虛拟目錄+Servlet的資源路徑
package cn.liujinhui.test;

import cn.liujinhui.dao.UserDao;
import cn.liujinhui.domain.User;
import org.junit.Test;

public class UserDaoTest {
    @Test
    public void testLogin(){
        User loginuser = new User();
        loginuser.setUsername("superbaby");
        loginuser.setPassword("123");
        UserDao dao = new UserDao();
        User user = dao.login(loginuser);
        System.out.println(user);
    }
}      
driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql:///day14
username=root
password=root
initialSize=5
maxActive=10
maxWait=3000      

4、通過BeanUtils類,簡化資料封裝,一次把所有資料擷取出來

package cn.liujinhui.web.servlet;

import cn.liujinhui.dao.UserDao;
import cn.liujinhui.domain.User;
import org.apache.commons.beanutils.BeanUtils;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.util.Map;

@WebServlet("/LoginServlet")
public class LoginServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //1.設定編碼
        req.setCharacterEncoding("utf-8");
        //2.擷取請求參數
        /*String username = req.getParameter("username");
        String password = req.getParameter("password");
        //3.封裝user對象
        User loginUser = new User();
        loginUser.setUsername(username);
        loginUser.setPassword(password);*/
        //2.擷取所有請求參數
        Map<String, String[]> map = req.getParameterMap();
        //3.建立User對象
        User loginUser = new User();
        //3.2使用BeanU體力上封裝
        try {
            BeanUtils.populate(loginUser,map);
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        }
        //4.調用UserDao的login方法
        UserDao userDao = new UserDao();
        try {
            User user = userDao.login(loginUser);
            //5.判斷uswr
            if(user==null){
                //登入失敗
                req.getRequestDispatcher("/failServlet").forward(req,resp);
            }else{
                //登入成功
                //存儲資料
                req.setAttribute("user",user);
                req.getRequestDispatcher("/successServlet").forward(req,resp);
            }
        } catch (ServletException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        super.doGet(req, resp);
    }
}      

5、BeanUtils介紹

用于封裝JavaBean的

JavaEE Day14 Servlet&amp;HTTP&amp;Request
  • JavaBean:标準的Java類【domain】
  • 定義要求
  • 類必須被public修飾
  • 必須提供空參的構造器
  • 成員變量必須使用private修飾
  • 必須提供公共的getter和setter方法
  • 功能:封裝資料
  • 概念
  • 成員變量
  • 屬性:setter和getter方法截取後的産物
    • 例如:getUsername()--->Username--->username
    • 大多數情況一樣,可以不一樣
  • 方法:
  • setProperty()
  • getProperty()
  • populate(Object obj , Map map):将map集合的鍵值對資訊,封裝到對應的JavaBean對象中
package cn.liujinhui.domain;

/**
 * 使用者的實體類JavaBean
 */
public class User {
    private int id;
    private String username;
    private String password;
    private String gender;
    public void setHehe(String gender){
        this.gender=gender;
    }
    public String getHehe(){
        return gender;
    }
    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", username='" + username + '\'' +
                ", password='" + password + '\'' +
                ", gender='" + gender + '\'' +
                '}';
    }
}      
package cn.liujinhui.test;

import cn.liujinhui.domain.User;
import org.apache.commons.beanutils.BeanUtils;
import org.junit.Test;

import java.lang.reflect.InvocationTargetException;

public class BeanUtilsTest {
    @Test
    public void test(){
        User user = new User();
        try {
            BeanUtils.setProperty(user,"hehe","male");
            System.out.println(user);
            String gender = BeanUtils.getProperty(user, "hehe");
            System.out.println(gender);
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        }
    }
}