今日内容
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方法
7、Servlet相關配置
- urlpattern
- 一個Servlet可以定義多個通路路徑 @WebServlet({"/demo4","/dd4"})
- 路徑的定義規則
- /XXX
- /XXX/XXX:多層路徑/目錄結構
- *.do/其他字尾名
二、HTTP
1、概念:Hyper Text Transfer Protocol 超文本傳輸協定
- 傳輸協定:定義了用戶端和伺服器端通信時發送資料的格式
- 特點:
- 基于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長度是沒有限制的
- 相對安全
- 請求頭
- 請求頭名稱:請求頭值
- 常見的請求頭
- host:請求的主機
- User-Agent:浏覽器告訴伺服器,通路時使用的浏覽器版本資訊
- 可以在伺服器端擷取浏覽器的資訊,來解決相容性問題
- Accept:通路時可以相應的格式
- Accept-Encoding:可以接收的編碼或壓縮格式
- Refere:告訴伺服器,我(目前請求)從哪裡來
- 作用
- 防盜鍊
- 統計工作
- Connection:連接配接是否可以複用
- Upgrade-Insecure-request:更新
- 請求空行
- 空行
- 請求體/正文
- 封裝post請求消息請求體的
-
字元串格式:
GET /login.html HTTP1.1
三、Request
1、request對象和response對象的原理
通過request對象擷取請求消息資料,通過response對象設定響應消息資料
注意:
- request和response對象是由伺服器建立的,我們來使用而已
- 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 。
代碼示範
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);
}
}
- 請求轉發:一種在伺服器内部的資源跳轉方式
- 步驟
- 通過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、分析
Dao:Database Access Object
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的
- 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();
}
}
}