Request和Response,转发和重定向
主要内容:
HttpServletRequest
请求转发
HttpServletResponse
请求重定向
具体内容:
每次请求service()方法,都会由容器创建一个新的对象
Servlet对象的比较
Request和response在每一次访问时都被创建。由容器创建的
Serlvet只会被创建一次,由用户来开发,由容器来创建,单一的实例。
ServletConfig会为每一个Servlet创建一个Config对象,且由Servlet维护。就是声明成了成员变量。
ServletContext对象,是这一个项目就只有一个此对象。
HttpServletRequest 简介
Servlet API 中定义的 ServletRequest 接口类用于封装请求消息。
HttpServletRequest 是专用于HTTP协议的ServletRequest 子接口,它用于封装 HTTP 请求消息。
在 service() 方法内部调用 HttpServletRequest 对象的各种方法来获取请求消息。
Request功能
接收用户的参数
接收用户的所有请求头信息
转发、包含
做为域对象也可以存放数据
接收用户的参数
getParameter(String)方法
根据名字获取一个参数,返回类型为String
getParameterValues (String)方法
根据名字获取一组相关的数据,返回类型为String[]
getParameterNames ()方法
获取所有参数的名字,返回类型为Enumeration
getParameterMap ()方法
获取所有数据,,返回类型为Map
例子:
<form action="one" method="post">
姓名:<input type="text" name="name"><br>
爱好:<input type="checkbox" name="hobby" value="read">读书
<input type="checkbox" name="hobby" value="football">足球
<input type="checkbox" name="hobby" value="run">跑步 <br>
性别:<input type="radio" name="sex" value="male">男
<input type="radio" name="sex" value="female">女<br>
<input type="submit" value="提交">
</form>
// 获取名字<input type="text" name="name">的值
String name = req.getParameter("name");
// 爱好<input type="checkbox" name="hobby" value="read">
String[] hobbys = req.getParameterValues("hobby");
// 性别<input type="radio" name="sex" value="male">
String sex = req.getParameter("sex");
// 显示到页面上
resp.setContentType("text/html;charset=utf-8");
PrintWriter out = resp.getWriter();
out.print("你叫:" + name + "<br/>");
out.print("你的爱好是:<br/>");
for (String h : hobbys) {
out.print(h + "<br/>");
}
out.print("你的性别是:" + sex + "<hr/>");
// 使用getParameterNames()获取所有参数名字
Enumeration<String> names = req.getParameterNames();
while (names.hasMoreElements()) {
String nm = (String) names.nextElement();
out.print("获取到的名字:" + nm + "<br/>");
}
out.print("<hr/>");
// 使用getParameterMap()获取所有数据
Map<String, String[]> map = req.getParameterMap();
for (Entry<String, String[]> en : map.entrySet()) {
out.print(en.getKey() + "<br>");
String[] vs = en.getValue();
for (String str : vs) {
out.print(str + "<br>");
}
out.print("<hr/>");
}
获取参数时的乱码问题
解决方法一
String name = req.getParameter("name");//目前获取到的是iso-8859-1的编码
byte[] bs = name.getBytes("iso-8859-1");//根据iso-8859-1获取字节码
String name1 = new String(bs,"utf-8");//根据utf-8编码,重新组成新字符串
resp.setContentType("text/html;charset=utf-8");
PrintWriter out = resp.getWriter();
out.print("姓名是:" + name1 + ",原来的是"+name);
解决方法二
req.setCharacterEncoding("utf-8");// 只能post类型有效
String name = req.getParameter("name");
resp.setContentType("text/html;charset=utf-8");
PrintWriter out = resp.getWriter();
out.print("姓名是:" +name);
获取请求行的相关信息
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setContentType("text/html;charset=uTF-8");
PrintWriter out = resp.getWriter();
out.print("请求类型:"+req.getMethod()+"<br/>");
out.print("请求协议:"+req.getProtocol()+"<br/>");
out.print("请求地址:"+req.getRequestURI()+"<br/>");
out.print("你的ip:"+req.getRemoteAddr()+"<br/>");
out.print("请求:"+req.getQueryString()+"<br/>");
out.print("请求主机:"+req.getHeader("Host")+"<br/>");
out.print("请求来自哪里:"+req.getHeader("Referer")+"<hr/>");
//以下获取所有头信息
Enumeration<String> en = req.getHeaderNames();
while(en.hasMoreElements()){
String key = en.nextElement();
out.print(key+"=="+req.getHeader(key)+"<br/>");
}
}
转发:
转发:是将请求在服务器内部交给另一个组件再去执行,同时共享request中的数据
例子:
req.setAttribute("name", "Jack"+new Random().nextInt(100));
// 通过request获取RequestDispatcher
// 以 "/" 开始是指 项目的上下文根, http://127.0.0.1:8081/Servlet03 里面的 '/Servlet03’
RequestDispatcher rd = req.getRequestDispatcher("/sb");
// 执行转发
rd.forward(req, resp);
resp.setContentType("text/html;charset=utf-8");
resp.getWriter().print("这是servletB....."+req.getAttribute("name"));
转发过程图解:
n包含:是将另一个组件的执行结果包含到自己的响应结果中
req.setAttribute("name", "山东济宁");
out.print("这是第一个ServletA<br/>");
req.getRequestDispatcher("/sd").include(req, resp);
out.print("这是第一个ServletA执行完成了<br/>");
out.print("这是第二个ServletB,"+req.getAttribute("name")+"<br/>");
HttpServletResponse简介
Servlet API中定义的ServletResponse接口类用于创建响应消息。
HttpServletResponse是专用于HTTP协议的ServletResponse子接口,它用于封装HTTP响应消息。
重定向
请求重定向:指的是一个web资源受到客户端请求后,通知客户端去访问另外一个web资源
sendRedirect
使用方法:response.sendRedirect(路径)
重点:
请求转发和重定向:
本质区别:请求转发只发送了一次请求,重定向发了两次请求
1)请求转发:地址栏还是初次请求的地址栏
重定向:地址栏不再是第一次请求的地址,地址栏为最后一次请求的地址
2)请求转发:在最终的servlet中,request对象和中转的request对象是同一个对象
重定向:在最终的servlet中,request对象和中转的request对象是不是同一个对象
3).请求转发:/代表的是当前web应用的根目录 http://localhost:8080/Servlet02--》这是web应用根目录
重定向:/代表的是当前web站点的根目录 http://localhost:8080---》这是web站点
4)请求转发:只能转发到当前web应用
重定向:可以重定向到外部资源
5)转发时请求的类型不变
重定向时 的被调用者的请求类型只能是get
推荐阅读
-
Linux编程 22 shell编程(输出和输入重定向,管道,数学运算命令,退出脚本状态码)
-
通过过滤器(Filter)解决JSP的Post和Request中文乱码问题
-
精通awk系列(13):print、printf、sprintf和重定向
-
shell 1>&2 2>&1 &>filename重定向的含义和区别
-
JSP中response.setContentType和response.setCharacterEncoding区别分析
-
HTTP: Request中的post和get区别
-
Scrapy 中 Request 对象和 Response 对象的各参数及属性介绍
-
SSH远程登录和端口转发详解
-
dos 内容重定向符 >和>>
-
玩转Linux文件描述符和重定向