Request对象
行
GET http://localhost:8080/day04/a_form.html?username=jack&nickname=1234HTTP/1.1
POST http://localhost:8080/day04/a_form.html HTTP/1.1
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//GET http://localhost:8080/day04/a_form.html?username=jack&nickname=1234 HTTP/1.1
//重要的三个API
//1.获得请求方式
String method = request.getMethod();
System.out.println("请求方式:" + method);
//2.获得服务器发布的名称 application 应用 context 根路径= day04_request
String contextPath = request.getContextPath();
System.out.println("根路径:"+contextPath);//动态路径设置
//3.远程主机的ip地址 指的是访问的浏览器ip地址 Remote 远程 Addr 地址 0:0:0:0:0:0:0:1 ipv6的地址 本地等效127.0.0.1
String remoteAddr = request.getRemoteAddr();
System.out.println("远程主机的ip地址:"+remoteAddr);
}
头
Host: localhost:8080
Connection: keep-alive
Content-Length: 27
Cache-Control: max-age=0
Origin: http://localhost:8080
Upgrade-Insecure-Requests: 1
Content-Type: application/x-www-form-urlencoded
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.87 Safari/537.36
Sec-Fetch-Dest: document
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Sec-Fetch-Site: same-origin
Sec-Fetch-Mode: navigate
Sec-Fetch-User: ?1
Referer: http://localhost:8080/day04/a_form.html
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9
Cookie: Idea-a04ab689=b23c0a93-4c5e-4a7e-9125-9dbc273d9498
格式:
key-value
获得请求头request.getHader(String key)一般请求情况下 不需要特殊设置请求头 默认情况: 浏览器自动发起的。
体-请求数据(重要)
get没有请求体
浏览器将数据传输给服务器 服务器目的 获得浏览器传输的数据 重要的时用户传递的主观数据(用户输入)
页面代码
a.html
<!--注册-->
<form action="/day04_request/requestParam" method="get">
用户名:<input type="text" name="username"><br/>
昵称:<input type="text" name="nickname"><br/>
爱好: <input type="checkbox" name="hobby" value="0"> 抽烟
<input type="checkbox" name="hobby" value="1"> 喝酒
<input type="checkbox" name="hobby" value="2"> 烫头
<input type="submit" value="get提交">
</form>
<hr/>
<form action="/day04_request/requestParam" method="post">
用户名:<input type="text" name="username"><br/>
昵称:<input type="text" name="nickname"><br/>
爱好: <input type="checkbox" name="hobby" value="0"> 抽烟
<input type="checkbox" name="hobby" value="1"> 喝酒
<input type="checkbox" name="hobby" value="2"> 烫头
<input type="submit" value="post提交">
</form>
web.xml
<servlet>
<servlet-name>RequestParamServlet </servlet-name>
<servlet-class>com.llz.servlet.RequestParamServlet </servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>RequestParamServlet</servlet-name>
<url-pattern>/requestParam</url-pattern>
</servlet-mapping>
Servlet代码
public class RequestParamServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("doPost");
//getParameter() 根据指定的名称 获得指定的一个返回值
String username = request.getParameter("username");
String nickname = request.getParameter("nickname");
System.out.println(username + " @@ " + nickname);
//getParameterValues() 根据指定的名称获得一组值
String[] hobbies = request.getParameterValues("hobby");
System.out.println(Arrays.toString(hobbies));
//获得浏览器传输的所有key和所有的value value是一个数组
//数组中可能只有一个成员
Map<String, String[]> parameterMap = request.getParameterMap();
//遍历数据
//parameterMap.entrySet().iter + table键
for (Map.Entry<String, String[]> entry : parameterMap.entrySet()) {
System.out.println(entry.getKey() + "@@" + Arrays.toString(entry.getValue()) );
}
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("doGet");
String username = request.getParameter("username");
String nickname = request.getParameter("nickname");
System.out.println(username + " @@ " + nickname);
String[] hobbies = request.getParameterValues("hobby");
System.out.println(Arrays.toString(hobbies));
//获得浏览器传输的所有key和所有的value value是一个数组
//数组中可能只有一个成员
Map<String, String[]> parameterMap = request.getParameterMap();
//遍历数据
//parameterMap.entrySet().iter + table键
for (Map.Entry<String, String[]> entry : parameterMap.entrySet()) {
System.out.println(entry.getKey() + "@@" + Arrays.toString(entry.getValue()) );
}
}
}
(note:/day04_request 为项目发布的名称,/requestParam为资源名称)
调用顺序(理解)
问题
get提交没有出现乱码 post提交有乱码
问题分析
解决方法
//解决乱码 处理请求编码
request.setCharacterEncoding("utf-8");
//处理乱码 请求和响应的处理 都必须写最前面
request.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");
BeanUtils
BeanUtils的jar 可以 快速的将 map的数据 封装到 对象中
页面代码
<!--注册-->
<form action="/day04_request/registerServlet" method="get">
用户名:<input type="text" name="username"><br/>
昵称:<input type="text" name="nickname"><br/>
密码:<input type="text" name="password"><br/>
性别:<input type="text" name="gender"><br/>
年龄:<input type="text" name="age"><br/>
电话:<input type="text" name="telephone"><br/>
爱好: <input type="checkbox" name="hobby" value="抽烟"> 抽烟
<input type="checkbox" name="hobby" value="喝酒"> 喝酒
<input type="checkbox" name="hobby" value="烫头"> 烫头
<input type="submit" value="get提交">
</form>
<hr/>
<form action="/day04_request/registerServlet" method="post">
用户名:<input type="text" name="username"><br/>
昵称:<input type="text" name="nickname"><br/>
密码:<input type="text" name="password"><br/>
性别:<input type="text" name="gender"><br/>
年龄:<input type="text" name="age"><br/>
电话:<input type="text" name="telephone"><br/>
爱好: <input type="checkbox" name="hobby" value="抽烟"> 抽烟
<input type="checkbox" name="hobby" value="喝酒"> 喝酒
<input type="checkbox" name="hobby" value="烫头"> 烫头
<input type="submit" value="get提交">
</form>
Servlet类代码
public class RegisterServlet extends HttpServlet {
/**
* get和post的代码基本是一致 只不过 post多一行出乱码的代码
* @param request
* @param response
* @throws ServletException
* @throws IOException
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request,response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
try {
//1.处理乱码 只对post生效 对get不生效
request.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");
//2.获得数据
Map<String, String[]> parameterMap = request.getParameterMap();
//3.将map的数据 封装到 User中 面向对象 操作User简单
User user = new User(); //100个字段
/* user.setUsername( parameterMap.get("username")[0] );
user.setNickname( parameterMap.get("nickname")[0] );*/
//BeanUtils的jar 可以 快速的将 map的数据 封装到 对象中
//java中的类 其实是要分门别类的 , 实体类 : 只有私有化属性 并且提供get/set的类
//Bean对象 : javaBean domain entity 实体类
//Utils 工具类 : 不需要修改代码 能直接使用的类 IOUtils.copy
//BeanUtils 操作实体类的工具类
//参数1: javaBean
//参数2: map数据
//可以快速的将 map的数据赋值到 javaBean中
BeanUtils.populate(user , parameterMap ); //需要try 底层反射
//赋值数据的时候 只有当 页面和后台同时都具有该字段 才会赋值成功 否则数据为null 不会报错
System.out.println(user);
/*for (Map.Entry<String, String[]> entry : parameterMap.entrySet()) {
System.out.println(entry.getKey() + " @@ " + Arrays.toString(entry.getValue()));
if("username".equals(entry.getKey())){
user.setUsername( Arrays.toString(entry.getValue()) );
}
}*/
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
}
}
请求的其他作用
域对象
域对象: 范围 , 在一定的范围中去共享数据 对象中必然有可以存储数据的地方(map list)
域对象的api一致
getAttribute(String key ) setAttribute( String key , Object value) removeAttribute(String key )
域对象共享的范围不同
ServletContext 特性 : 所有的Servlet对象获得同一份 ServletContext 对象, 一份数据 大家共享 项目启动ServletContext 就初始化了。
请求转发
request域对象一般与请求转发一起使用
请求转发:将当前请求从某一个位置跳转到另外一个位置
代码:
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("oneServlet 执行");
/**
* 两个类之间如何调用
* 拿到第二个类的实力对象 . 方法 对象.方法
* twoServlet.doGet(request , response)
*
* 以前的方式 : 对象 变量 = new 对象() 我们自己控制的 new对象过程
*
* 现在的方式:对象是由tomcat创建 ,而tomcat并没有将实例化的变量给我们
* 实例化的变量还在tomcat的内部 , 如果需要调用另外一个类的方法
* 通知tomcat 让tomcat去调用
* 问题: 1.明确知道 调用的对象
* 2.明确指导 参数是谁 ( 两个方法的参数一样 照样传递即可)
* get 获得 Request 请求 Dispatcher 调度器
* 获得请求调度器: 交通枢纽 , 作用: 控制我们的请求 去向何处
* 参数: 调度的位置
* request.getRequestDispatcher("twoServlet")
* dispatcher.forward(); 执行调度 twoServlet.doGet(request , response)
*/
//请求转发的代码
RequestDispatcher dispatcher = request.getRequestDispatcher("twoServlet");
dispatcher.forward(request ,response );
}
请求转发和重定向的区别
重定向特点:
- 有两次请求 两次响应
- 访问的地址会发生改变 重定向之后的地址
- 可以跳转站外资源 (除了我们网站内部的资源)
- 重定向不可以携带数据
请求转发特点:
- 只有一次请求 一次响应
- 访问地址没有改变 还指向的第一次访问路径
- 只能站内跳转 (服务器内部处理)
- 请求转发可以携带数据
ServletContext域和request域区别
ServletContext : 整个项目只有一份 所有人共享这一份数据(数据之间有冲突) , 常用于放置公共数据 例如 :charset=utf-8
request生命周期: ,请求开始的时候 request创建 响应结束的request销毁
存储数据的范围: request 一次请求中 请求转发的过程中传递数据
ServletContext的生命周期:项目启动就创建 整个项目就一份 tomcat关闭 ServletContext就销毁
存储数据的范围: 存储数据后 数据会一直保存在 服务器中 不会被销毁 只有服务停止或者手动的执行removeAttribute 数据销毁