Request对象

request对象与response对象的原理

  1. request和response对象是由服务器创建的
  2. request对象是来获取请求消息,response对象是来设置响应消息

请求响应的具体实现

Request

request对象继承体系结构

ServletRequest       -- 接口
      |   继承
HttpServletRequest    --接口
      |   实现
org.apache.catalina.connector.RequestFacade  --tomcat提供的类

request功能

1. 获取请求消息数据

- 获取请求行数据
    * GET  /itcast_web/jin?name=yolin HTTP/1.1
    * 方法
        ①获取请求方式:GET
            String getMethod()
        ②获取虚拟目录:/itcast_web  (重点)
            String getContextPath()
        ③获取Servlet路径:/itcast_web
            String getServletPqth()
        ④获取get方式请求参数:name=yolin
            String getQueryString()
        ⑤获取请求URL:/itcast_web/jin  (重点)
            String getRequestURI()
            StringBuffer getRequestURL() 完整地址
        ⑥获取协议及版本:HTTP/1.1
            String getProtocol()
        ⑦获取客户机的IP地址:
            String getRemoteAddr() 

- 获取请求头数据
    * String getHeader(String name):通过请求头的名称获取请求头的值  (重点)
    * Enumeration<String> getHeaderNames():获取所有的请求头名称

设置防盗链

- 获取请求体数据
    * 请求体:只有在POST请求方式,才有请求体,在请求体重封装了POST请求的请求参数
    * 步骤:
        ①获取流对象
            BufferedReader getReader():获取字符输入流,只能操作字符数据
            ServletInputStream getInputStream():获取字节输入流,可以操作所有类型数据
        ②再从流对象中拿数据

2. 其他功能(重点)

- 获取请求参数通用方式
    * String getParameter(String name):根据参数名称获取参数值
    * String [] getParameterValues(String name):根据参数名称获取参数值的数组(多用于复选框)
    * Enumeration<String> getParameterNames():获取所有请求的参数名称
    * Map<String,String[]> getParameterMap():获取所有参数的map集合

1
2
//中文乱码
request.setCharacterEncoding("utf-8");
- 请求转发
    *一种在服务器内部的资源跳转方式
    *步骤:
        ①通过request对象获取请求转发器对象:RequestDispatcher getRequestDispatcher(String path)
        ②使用RequestDispatcher对象来进行转发:forward(ServletRequest request,ServletResponse response)
    *特点:
        ①浏览器地址栏路径不发生变化
        ②只能转发到当前服务器内部资源中
        ③转发是一次请求

- 共享数据
    *request域:代表一次请求的范围,一般用于请求转发的多个资源中共享数据
    *方法:
        ①void setAttribute(String name,Object obj):存储数据
        ②Object getAttribute(String name)

- 获取ServletContext
    *ServletContext getServletContext()

案例:用户登录

需求

  1. 编写login.html登录页面
  2. 使用Druid数据库连接池技术操作数据库
  3. 使用JdbcTemplate技术封装JDBC
  4. 登录成功跳转到SuccessServlet展示:登陆成功!用户名,欢迎您
  5. 登录失败跳转到FailServlet展示:登录失败,用户名或密码错误

  • 工具类
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
package Util;

import com.alibaba.druid.pool.DruidDataSourceFactory;

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

public class JDBCUtils {
private static DataSource ds;
//获取连接池对象
static{
try {
//1.加载配置文
Properties pro = new Properties();
//使用ClassLoader加载配置文件,获取字节输入流
pro.load(JDBCUtils.class.getClassLoader().getResourceAsStream("druid.properties"));
//2.获取DataSource,初始化连接池对象
try {
ds= DruidDataSourceFactory.createDataSource(pro);
} catch (Exception e) {
e.printStackTrace();
}
} catch (IOException e) {
e.printStackTrace();
}
}
//获取连接Connection对象
public static Connection getConnection() throws SQLException {
return ds.getConnection();
}
//获取连接池对象
public static DataSource getDataSource(){
return ds;
}

public static void close(Connection conn, Statement stat, ResultSet rs){
if(conn!=null){
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(stat!=null){
try {
stat.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(rs!=null){
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
public static void close(Connection conn, Statement stat){
close(conn,stat,null);
}
}
  • Dao层UseDao.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
package Dao;


import Util.JDBCUtils;
import domain.User;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;

public class UseDao {
User user =null;
private JdbcTemplate template=new JdbcTemplate(JDBCUtils. getDataSource());

public User login(User loginUser){
String sql="select * from user where username = ? and password = ?;";
try{
user=template.queryForObject(sql, new BeanPropertyRowMapper<User>(User.class),
loginUser.getUsername(), loginUser.getPassword());
}catch (Exception e){
return null;
}

return user;
}
}
  • 判断登录的servlet

  • 重定向的servlet

运行效果:

  • 使用BeanUtils工具类,简化数据封装

BeanUtils是用于封装JavaBean的,那么什么是JavaBean呢

JavaBean?

JavaBean是标准的Java类,其功能是封装数据,该类必须遵守以下规范

  1. 被public修饰
  2. 必须提供空参的构造器
  3. 成员变量必须使用private修饰
  4. 提供公共setter和getter方法

方法

  1. setProperty()
  2. getProperty()
  3. populate(Object obj,Map map):将map集合的键值对信息,封装到对应的JavaBean对象中

请我喝杯咖啡吧~

支付宝
微信