request基础
Request
-
Request和Response对象的原理
- request和response这两个对象是由tomcat服务器创建的,我们不创建它们,我们只使用他们.
- request对象是来获取请求消息的,response对象是用来设置响应消息的.
- 原理图:
.
-
request对象的继承体系结构
- ServletRequest(接口)
- HttpServletRequest(接口): 继承自ServletRequest.
- [email protected]: tomcat实现了HttpServletRequest接口,编写了这个RequestFacade类,通过这个类创建request对象.
-
request对象:
- 获取请求消息数据
-
获取请求行数据
- 请求行格式: GET /requestDemo(虚拟目录)/requestDemo1?name=fan HTTP/1.1
- 方法:
- 获取请求方式(GET):
String getMethod()
.- 这个方法就是在service中判断判断是什么请求方法,然后由service去掉用对应的方法,所以我们不怎么用到.
- (重要)获取虚拟目录(/requestDemo):
String getContextPath()
. - 获取资源路径,也可以成为servlet路径(/requestDemo1):
String getServletPath()
. - 获取get方式的请求参数(name=fan):
String getQueryString()
. - (重要)获取请求的uri,即虚拟目录+资源目录(/requestDemo(虚拟目录)/requestDemo1):
String getRequestURI()
.-
StringBuffer getRequestURL()
: 返回整个url路径,比如http://localhost:8080/requestDemo/requestDemo1
. - url: 统一资源定位符.
- uri: 统一资源标识符,其代表的范围大于url,可以理解为url是中华人民共和国,而uri是共和国.
-
- 获取协议和版本(HTTP/1.1):
String getProtocol()
. - 获取客户机的ip地址:
String getRemoteAddr()
.
- 获取请求方式(GET):
- 演示代码.
-
获取请求头数据
- 方法
- (重要)String getHeader(String name): 通过请求头的名称来获取请求头的值,其中name不区分大小写.
- Enumeration getHeaderNames(): 获取所有请求头的名称.
- 演示代码.
- 方法
-
获取请求体数据
- 请求体只有
POST
请求方式才有请求体,在请求体中封装了POST请求的请求参数. - 步骤:
- 获取流对象(字节流,字符流).
- BufferedReader getReader(): 获取字符输入流,只能操作字符数据.
- ServletInputStream getInputStream():获取字节输入流,可以操作所有类型的数据,这个在文件上传再说.
- 再从流对象中拿数据.
- 获取流对象(字节流,字符流).
- 演示代码, 这个代码中文读出来是乱码,怎么搞都是乱码,果断放弃.
- 请求体只有
-
- 其它功能
- 获取请求参数通用方式(GET, POST都可以用来获取请求参数)
- String getParameter(String name): 根据参数名称来获取参数值,例如你有这样一串参数:
user=饭饭&password=123
,我传入参数为user
就可以得到饭饭
这个值. - String[] getParameterValues(String name): 根据参数名称获取参数值的数组,例如: hobby=abc&def&hij,我们通过这个方法就可以获取多个值,多用于复选框.
- Enumeration getParameterNames(): 获取所有请求的参数名称.
- Map<String, String[]> getParameterMap(): 获取所有参数的键值对集合.
- 中文乱码问题
- 通过实验发现有一个问题,就是如果表单的提交方式是
post
,传中文就会乱码;但是如果表单提交方式是get
,传中文就不会出现乱码,为什么呢? - get方式: tomcat8 就已经将get方式乱码问题解决了.
- post方式: 在获取参数前设置request的编码格式,多写一行代码就可以了:
request.setCharacterEncoding("UTF-8");
,括号中的参数和html文件中的编码格式一样就可以了,一般都是utf-8.
- 通过实验发现有一个问题,就是如果表单的提交方式是
- 获取请求参数通用方式示例代码.
- String getParameter(String name): 根据参数名称来获取参数值,例如你有这样一串参数:
- 请求转发: 可以理解为一种
在服务器内部的一种资源跳转方式
,形象一点就是在同一个tomcat中,多个serevlet类之间互相跳转的方式.- 步骤:
- 通过request对象调用
RequestDispatcher getRequestDispatcher(String path)
方法,获取请求转发器对象. - 使用
RequestDispatcher
对象调用void forward(ServletRequest request, ServletResponse response)
方法进行转发. - 请求转发示例代码.
- 通过request对象调用
- 特点:
- 浏览器地址栏路径没有发生改变,就算跳转到了另一个servlet,但是地址栏中还是原来的servlet地址.
- 只能转发到当前服务器的内部资源中,就是说只能转发到一个tomcat服务器下的的东西,也就是同一个src文件夹下面的不同类可以相互随便转发,不在一个包没得事.
- 这样子的转发只发出一次请求,通过浏览器的
f12
然后查看网络,当我们输入链接后,发现浏览器只有一次请求.
- 步骤:
- 共享数据
- 获取servletContext对象
- 方法:
ServletContext getServletContext()
. - 案例代码:
System.out.println(request.getServletContext());
,在浏览器输入网址:http://localhost:8080/requestDemo8
后得到一个对象的地址.
- 方法:
- 获取请求参数通用方式(GET, POST都可以用来获取请求参数)
- 获取请求消息数据
request案例: 用户登录
-
需求:
- 编写
login.html
登录页面,有username和password两个输入框. - 使用druid数据库连接池技术,操作mysql.
- 使用jdbcTemplate技术封装jdbc.
- 登录成功跳转到SuccessServlet,同时显示:
登录成功! 用户名, 欢迎您!
字样. - 登录失败跳转到FailServlet,同时显示:
登录失败! 用户名或 密码错误!
字样.
- 编写
-
开发步骤:
- 创建项目,创建html页面,导入druid配置文件以及一系列jar包.
- 创建数据库环境,在数据库中建表,插入一点数据等.
- 创建一个domain包,创建一个实体类User
- 这里有一个叫法,我们把
实体类
也叫做javabean
,就是一般都只有get和set方法,提供属性这些的.
- 这里有一个叫法,我们把
- 创建一个dao包,创建类UserDao,在类中提供login方法.
- 创建servlet包,同时创建loginServlet类.
- 注意:
login.html
中form表单的action的路径的写法: 虚拟目录(就是我之前说的点击tomcat->编辑结构->Deployment->Application context中的路径,如果只是一个斜杠就表示虚拟目录不用写) + servlet的资源路径.
- 注意:
- 创建SuccessServlet和FailServlet类.
- 建立一个BeanUtils工具类,简化数据的封装(我这里会有问题,就是用这些工具类永远获取不到用户名,我也不晓得为啥).
- 登录案例代码.
-
JavaBean: 标准的Java类(一般放在domain包里面)
- 要求
- 类必须被public修饰.
- 必须提供空参的构造器.
- 成员变量必须使用private修饰.
- 提供公共的getter和setter方法.
- 功能: 封装数据的
- 成员变量: 如private int age中的age就是成员变量.
- 属性: getter()和setter()方法截取后的产物,例如: getAge()方法中的Age就是属性,一般和成员变量名字相同.
- 方法:
- setProperty(Object bean, String name, Object value): bean表示一个javabean对象,例如user; name表示一个属性名,例如
getAge
中的age,这个必须写成小写,虽然方法名中是大写
; value表示前一个参数属性名的属性值. - getProperty(Object bean, String name): 含义和上面一样.
- populate(Object obj, Map map):这个比较重要,将map集合中的键值对信息封装到对应的javabean对象中.
- setProperty(Object bean, String name, Object value): bean表示一个javabean对象,例如user; name表示一个属性名,例如
- 要求