Request对象
1. request对象和response对象的原理
- request和response对象是由服务器创建的。我们来使用它们
- request对象是来获取请求消息,response对象是来设置响应消息
2. request对象继承体系结构:
ServletRequest – 接口
| 继承
HttpServletRequest – 接口
| 实现
org.apache.catalina.connector.RequestFacade 类(tomcat)
3. request功能:获取请求消息数据
- 获取请求行数据
1 | GET /day14/demo1?name=zhangsan HTTP/1.1 |
- 方法:
获取请求方式 :GET
- String getMethod()
(*)获取虚拟目录:/day14
- String getContextPath()
获取Servlet路径: /demo1
* String getServletPath()
- 获取get方式请求参数:name=zhangsan&age=18
- 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()
- 不在HttpServletRequest中,在父类ServletRequest中
- 获取客户机的IP地址:
- String getRemoteAddr()
- 获取请求头数据
String getHeader(String name):通过请求头的名称获取请求头的值
Enumeration
1 | protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { |
也可以直接获取指定的请求头。
1 | protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { |
使用referer请求头防盗链。
1 | protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { |
- 获取请求体数据:
请求体:只有POST请求方式,才有请求体,在请求体中封装了POST请求的请求参数
步骤:
- 获取流对象
* BufferedReader getReader():**获取字符输入流,只能操作字符数据**(BufferedReader 高效,带有缓冲区,有readline())
- ServletInputStream getInputStream():获取字节输入流,可以操作所有类型数据
- 再从流对象中拿数据
1 | protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { |
4. request其他功能
获取请求参数通用方式:不论get还是post请求方式都可以使用下列方法来获取请求参数
String getParameter(String name):根据参数名称获取参数值 username=zs&password=123
String[] getParameterValues(String name):根据参数名称获取参数值的数组 hobby=xx&hobby=game
Enumeration
getParameterNames():获取所有请求的参数名 Map<String,String[]> getParameterMap():获取所有参数的map集合
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
39protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//post 获取请求参数
//根据参数名称获取参数值
System.out.println("-------------------"+"getParameter");
String username = request.getParameter("username");
System.out.println(username);
//根据参数名称获取参数值的数组
System.out.println("-------------------"+"getParameterValues");
String[] hobbies = request.getParameterValues("hobby");
for (String hobby:hobbies){
System.out.println(hobby);
}
//获取所有请求的参数名称
System.out.println("-------------------"+"getParameterNames");
Enumeration<String> parameterNames = request.getParameterNames();
while(parameterNames.hasMoreElements()){
String name = parameterNames.nextElement();
String value = request.getParameter(name);
System.out.println(name+":"+value);
}
// 获取所有参数的map集合
System.out.println("-------------------"+"getParameterMap");
Map<String, String[]> parameterMap = request.getParameterMap();
//遍历
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("-----------------");
}
}
5. 中文乱码问题:
get方式:tomcat 8 已经将get方式乱码问题解决了
post方式:会乱码
* 解决:在获取参数前,设置request的编码
1
request.setCharacterEncoding("utf-8");
请求转发:一种在服务器内部的资源跳转方式
步骤:通过request对象获取请求转发器对象:
1
RequestDispatcher getRequestDispatcher(String path)
2. 使用RequestDispatcher对象来进行转发:
1
forward(ServletRequest request, ServletResponse response)
3. 特点:
1
request.getRequestDispatcher("/requestDemo9").forward(request,response);
- **浏览器地址栏路径不发生变化**
- 只能转发到当前服务器内部资源中,不能访问外部资源
- 转发是一次请求
共享数据:
域对象:一个有作用范围的对象,可以在范围内共享数据
- request域:代表一次请求的范围,一般用于请求转发的多个资源中共享数据
- 方法:
- void setAttribute(String name,Object obj):存储数据
- Object getAttitude(String name):通过键获取值
- void removeAttribute(String name):通过键移除键值对
- 获取ServletContext:
* ServletContext getServletContext()
5. 用户登录案例
5.1 用户登录案例需求:
1 | 1.编写login.html登录页面 |
5.2 分析
5.3 开发步骤
- 创建项目,导入html页面,配置文件,jar包
druid数据库连接池druid.properties
1 | driverClassName=com.mysql.jdbc.Driver |
配置jar包
- 创建数据库环境
1 | CREATE DATABASE day14; |
- 创建包cn.app.domain,创建类User
1 | public class User { |
- 创建包cn.app.dao,创建类UserDao,提供login方法
1 | import cn.app.domain.User; |
- 创建包cn.app.util,编写工具类JDBCUtils
1 | import com.alibaba.druid.pool.DruidDataSourceFactory; |
- 创建包cn.app.test,创建类UserDaoTest,测试login方法是否正确
1 | public class UserDaoTest { |
- 编写cn.itcast.web.servlet.LoginServlet类,完成登录逻辑
1 | import cn.itcast.dao.UserDao; |
- 编写FailServlet和SuccessServlet类
1 | import javax.servlet.ServletException; |
1 | import cn.itcast.domain.User; |
- login.html中form表单的action路径的写法
虚拟目录+Servlet的资源路径
1 | <!DOCTYPE html> |
- BeanUtils工具类,简化数据封装
1 | //2.获取所有请求参数 |
6. BeanUtils工具类(用于封装JavaBean)
6.1 JavaBean
JavaBean:标准的Java类
要求:
- 类必须被public修饰
- 必须提供空参的构造器
- 成员变量必须使用private修饰
- 提供公共setter和getter方法
功能:封装数据
6.2 成员变量和属性
成员变量:private int name;
属性:setter和getter方法截取后的产物
- 例如:getUsername() –> Username–> username
6.3 方法
setProperty() // 操作的是属性 set和get方法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21public class BeanUtilsTest {
@Test
public void test(){
User user = new User();
try {
BeanUtils.setProperty(user,"haha","male");
System.out.println(user);
String gender = BeanUtils.getProperty(user, "haha");
System.out.println(gender);
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
}
}
}getProperty()
populate(Object obj , Map map):将map集合的键值对信息,封装到对应的JavaBean对象中