request $ response
Posted bbs1234
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了request $ response相关的知识,希望对你有一定的参考价值。
两个对象 request 和 response 指的是实现了 ServletResponse接口的
HttpServletResponse
功能1 response对象的概述
- response 代表 服务器对浏览器的响应 通过HTTP响应协议
2.在response中 存在的方法 响应给客户端
应用RESPONSE
1. 响应首行手动向浏览器 发送404 状态码
a) 如果一个方法过时了 一般源码有提示信息
2重定向
效果图 输入www.localhost:80/jw08resq&req/Bservlet 错误
2.1开发中重定向
傻瓜式重定向不用明白原理
使用response的一个方法
3浏览器和服务器的访问流程
4. web项目结构
5. refresh头,刷新 五秒后跳转
6. 浏览器和服务器通信监视器Fidder
7. 相应正文
7.1发送字节流 发送中文 制造并且解决乱码问题
字节流乱码 utf-------gbk
7.2使用字符流发送字符
IS5 9 编码集中不存在中文
字节流 发文本 字符流 发图片或者多媒体信息
7.3字节流和字符流不能同时使用
8服务器错误
7.4使用字节流发送图片
告诉浏览器 服务器输入的文件类型 text/html是关于字符内容类型
“imgae/jpeg” 告诉浏览器 服务器发送过去的是一个图片
告诉浏览器 你发送的字节流 0101 是什么格式的 浏览器去解析 这个文件的是什么类型 image/jpeg
7.4使用字节流发送文件(就是文件下载)
服务器把文件发送个浏览器
- 直接访问该文件 下载
- 把文件放在 WEB-INF外界访问不到 控制下载权限
//0 告诉浏览器是什么东西(不用手动去类型查文件对象那个是什么)
//getServletContext().getMimeType(".jar") Context对象根据 后缀名去
web.xml查找mime类型.
response.setContentType(getServletContext().getMimeType(".avi"));
//告诉浏览器推荐用户使用什么名称下载 一般选择英文类型
response.setHeader("Content-Disposition", "attachment;filename=java.avi");
//1 获得图片的输入流
InputStream in =
getServletContext().getResourceAsStream("/WEB-INF/03225.avi");
//2 通过response获得输出字节流
OutputStream out = response.getOutputStream();
//3 两个对接
byte[] buffer = new byte[1024];
int len = 0;
while((len=in.read(buffer))>0){
out.write(buffer, 0, len);
out.flush();
}
in.close();
out.close();
功能2 request对象的概述
1.request对象 封装了 浏览器发过来的信息
Request对象
1. 获取浏览器请求首行请求头
请求首行 请求方式 请求路径 协议/版本号
request.getMethod(): GET
request.getRequestURI(): /Day08-request/AServlet
request.getServletPath(): /AServlet
request.getContextPath(): /Day08-request 获得应用路径 /jw08rr02
request.getScheme(): http
请求头
//--原始方式获得请求头 比较繁琐有key 得到value
String getHeader(String name)
long getDateHeader(String name)
int getIntHeader(String name)
Enumeration getHeaders(String name)
Enumeration getHeaderNames()
//---javaee封装好的方法.
request.getContentLength(): -1
request.getContentType(): null
request.getLocale(): zh_CN zh 中文
request.getQueryString(): name=tom&age=18
request.getRequestURL(): http://localhost:8080/Day08-request/AServlet 绝对路径 网络上的任何资源
request.getRequestURI(): /Day08-request/AServlet 相对路径
request.getRemoteAddr(): 0:0:0:0:0:0:0:1
request.getRemoteHost(): 0:0:0:0:0:0:0:1
request.getRemotePort(): 52074 获得远端 浏览器的
request.getServerName(): localhost
request.getServerPort(): 8080
请求空行
请求正文 表单传送过来的键值对
2.获得请求正文 获得表单提交的参数. 乱码问题
2.1乱码:只要确保编码和解码一致,就绝对没有问题.
1. GET方式
- http://localhost:8080/jw08rr02/BBServlet?name=tom&age=18
1.浏览器负责编码.浏览器使用的码表就是表单所在页面的码表.
2.服务器负责解码.服务器默认使用ISO-8859-1解码. 但如果你的服务器使用的是utf-8就不用配置了 如下配 置的URIEncoding来决定
解码码表
<Connector port="8080" protocol="HTTP/1.1" URIEncoding="UTF-8"
connectionTimeout="20000"
redirectPort="8443" /> 在tomcat servlet .xml 中
如上配置会影响整个服务器不推荐.
我们使用如下代码解决:
//获得参数
String name = request.getParameter("name");
//因为服务器使用了错误的码表,那么我们按照错误的码表原路返回
byte[] nameByte = name.getBytes("ISO-8859-1");
//用正确的码表重新解码
String newName = new String(nameByte,"UTF-8");
System.out.println("解决之后的:"+newName);
2.POST方式
因为Post解码是在调用getParameter同时进行解码,那么解决乱码只需要在调用该方法之前设置服务器解码方式
request.setCharacterEncoding("UTF-8");
String name = request.getParameter("name");
System.out.println(name);
涉及到获得表单参数的方法还有哪些呢?
String getParameter() 根据键获得值
Map getParameterMap() 获得服务器保存表单参数的容器
就是map<String,String[]>. 泛型: habit=chi&habit=shui&habit=la
for(Entry<String, String[]> en : map.entrySet()){
String key = en.getKey();
String[] value = en.getValue();
System.out.println(key+"==>" +Arrays.toString(value));
}
Enumeration getParameterNames() 获得提交的所有键 列举
while(en.hasMoreElements()){
String key = en.nextElement();
System.out.println("提交上来的键==>"+key);
}
String[] getParameterValues(String name) 根据键获得值.
获得一键对应多 个值的情况的.
System.out.println(Arrays.toString(habits));
//---------------------------------------------------------------------------------------------------------------------
2. request的请求转发和包含功能.
转发:
一个Servlet处理完毕交给下面的servlet(JSP)继续处理.
作用:
在现实开发中,没有servlet转发给servlet的情况.都是由servlet转发给JSP.
这样可以达到分工的作用:
servlet: 比较适合处理业务.
JSP: 比较适合显示功能
注意问题:
//servlet中不要做 输出正文的动作,没有结果的
//如果放到前面会出现乱码. 解决 response.serCharacterEncoding(“utf-8”);
字符串 通过 utf-8编码 变为 二进制字节 传输
网页 通过 utf-8编码集 把二进制字节解码
逻辑处理
//1 获得表单提交的用户名密码
String name = request.getParameter("name");
String password = request.getParameter("password");
//2 判断是否正确 tom 1234 才算成功
if(name!=null && name.trim().length()>0 && name.equals("tom")&&
password!=null && password.trim().length()>0 &&
password.equals("1234")){
//成功 ==> 转发到成功页面
request.getRequestDispatcher("/login/success.jsp").forward(request,
response);
//自己来做,很多弊端,不要这样
/* AServlet a = new AServlet();
a.service(request, response);*/
}else{
//失败 ==> 转发到失败页面
request.getRequestDispatcher("/login/error.jsp").forward(request, response);
}
//但是响应头是可以设置的.
请求包含:
两个servlet(jsp)共同向浏览器输出内容.
作用:
在现实开发中,多个页面含有相同的内容,我们把相同的内容抽取到一个jsp中,在需要显示这个段内容的jsp中,包含抽取的jsp.可以达到
统一管理相同的内容.
正文部分和页脚分开显示
两个jsp页面 success包含 error页面 访问一个 success页面就行
有不严谨的地方 使用jsp标签来实现
3.request域的应用.
原理:
在request对象中含有一个map.这个map就是request域.
作用:
在将来开发中. 使用请求转发时,servlet处理完数据, 处理结果要交给jsp显示. 可以使用request域将处理结果有servlet带给jsp显示. 共享数据
操作:
1.setAttribute(key,value) 存入一个键值对
2.getAttribute(key) 通过键取出值
3.getAttributeNames() 获得域中所有键
4.removeAttribute(key) 跟据键移除一个键值对
request的范围:
一个request对象对应一个request域(map).
系统当前有多少个request就有多少request域.
//1 获得表单提交的用户名密码
String name = request.getParameter("name");
String password = request.getParameter("password");
//
Map<String,String> error = new HashMap<String, String>();
//2 验证
if(!(name!=null && name.trim().length()>0 && name.equals("tom"))){
error.put("name", "用户名有误!");
}
if(!(password!=null && password.trim().length()>0 && password.equals("1234"))){
error.put("password", "密码错误!");
}
//将错误信息通过request域带到错误页面
request.setAttribute("error",error );
if(error.size() > 0){
//失败==> 回到登录页面,并显示错误信息
request.getRequestDispatcher("/login2/login.jsp").forward(request, response);
}else{
//成功==> 成功页面
request.getRequestDispatcher("/login2/success.jsp").forward(request, response);
}
<body>
<h1>用户登录</h1>
<form action="/Day08-request/HServlet" method="POST">
用户名:<input type="text" name="name" /> <br>
密码:<input type="password" name="password" /><br>
<input type="submit" >
</form>
<%
Map<String,String> error = (Map<String,String>)request.getAttribute("error");
if(error!=null && error.size()>0){
for(Entry<String,String> en : error.entrySet()){
out.print("<font color=‘red‘>");
out.print(en.getValue()+"<br>");
out.print("</font>");
}
}
%>
</body>
//=================================================================================================================
路径总结:
路径分为两种情况:
1.客户端路径 ==> 给浏览器用的路径“/”相对于主机
<form action="/Day08-request/AServlet" >
<a href="/Day08-request/AServlet" >
<img src="/Day08-request/AServlet" >
response.sendRedirect("/Day08-request/AServlet")
Refresh:3;url=/Day08-request/AServlet
路径写法:
带"/" : "/" ==> 相对于 主机.
例如: 表单所在页面路径为==>
http://localhost:8080/Day08-request/login.jsp ==> "/" 代表http://localhost:8080/
不带"/":(开发中一定不要出现不带"/"的情况).代表从当前目录找.
例如: 表单所在页面路径为==>
http://localhost:8080/Day08-request/info/login.jsp ==> 代表
http://localhost:8080/Day08-request/info/
2.服务器端路径”/”相对于项目
<url-pattern> /AServlet ==> http://localhost:8080/Day08-request/AServlet
request.getRequestDispatcher("/AServlet") ==>
http://localhost:8080/Day08-request/AServlet
路径写法:
"/": 相对于项目. "/"==>http://localhost:8080/Day08-request/
两个对象 request 和 response 指的是实现了 ServletResponse接口的
HttpServletResponse
功能1 response对象的概述
- response 代表 服务器对浏览器的响应 通过HTTP响应协议
2.在response中 存在的方法 响应给客户端
应用RESPONSE
1. 响应首行手动向浏览器 发送404 状态码
a) 如果一个方法过时了 一般源码有提示信息
2重定向
效果图 输入www.localhost:80/jw08resq&req/Bservlet 错误
2.1开发中重定向
傻瓜式重定向不用明白原理
使用response的一个方法
3浏览器和服务器的访问流程
4. web项目结构
5. refresh头,刷新 五秒后跳转
6. 浏览器和服务器通信监视器Fidder
7. 相应正文
7.1发送字节流 发送中文 制造并且解决乱码问题
字节流乱码 utf-------gbk
7.2使用字符流发送字符
IS5 9 编码集中不存在中文
字节流 发文本 字符流 发图片或者多媒体信息
7.3字节流和字符流不能同时使用
8服务器错误
7.4使用字节流发送图片
告诉浏览器 服务器输入的文件类型 text/html是关于字符内容类型
“imgae/jpeg” 告诉浏览器 服务器发送过去的是一个图片
告诉浏览器 你发送的字节流 0101 是什么格式的 浏览器去解析 这个文件的是什么类型 image/jpeg
7.4使用字节流发送文件(就是文件下载)
服务器把文件发送个浏览器
- 直接访问该文件 下载
- 把文件放在 WEB-INF外界访问不到 控制下载权限
//0 告诉浏览器是什么东西(不用手动去类型查文件对象那个是什么)
//getServletContext().getMimeType(".jar") Context对象根据 后缀名去
web.xml查找mime类型.
response.setContentType(getServletContext().getMimeType(".avi"));
//告诉浏览器推荐用户使用什么名称下载 一般选择英文类型
response.setHeader("Content-Disposition", "attachment;filename=java.avi");
//1 获得图片的输入流
InputStream in =
getServletContext().getResourceAsStream("/WEB-INF/03225.avi");
//2 通过response获得输出字节流
OutputStream out = response.getOutputStream();
//3 两个对接
byte[] buffer = new byte[1024];
int len = 0;
while((len=in.read(buffer))>0){
out.write(buffer, 0, len);
out.flush();
}
in.close();
out.close();
功能2 request对象的概述
1.request对象 封装了 浏览器发过来的信息
Request对象
1. 获取浏览器请求首行请求头
请求首行 请求方式 请求路径 协议/版本号
request.getMethod(): GET
request.getRequestURI(): /Day08-request/AServlet
request.getServletPath(): /AServlet
request.getContextPath(): /Day08-request 获得应用路径 /jw08rr02
request.getScheme(): http
请求头
//--原始方式获得请求头 比较繁琐有key 得到value
String getHeader(String name)
long getDateHeader(String name)
int getIntHeader(String name)
Enumeration getHeaders(String name)
Enumeration getHeaderNames()
//---javaee封装好的方法.
request.getContentLength(): -1
request.getContentType(): null
request.getLocale(): zh_CN zh 中文
request.getQueryString(): name=tom&age=18
request.getRequestURL(): http://localhost:8080/Day08-request/AServlet 绝对路径 网络上的任何资源
request.getRequestURI(): /Day08-request/AServlet 相对路径
request.getRemoteAddr(): 0:0:0:0:0:0:0:1
request.getRemoteHost(): 0:0:0:0:0:0:0:1
request.getRemotePort(): 52074 获得远端 浏览器的
request.getServerName(): localhost
request.getServerPort(): 8080
请求空行
请求正文 表单传送过来的键值对
2.获得请求正文 获得表单提交的参数. 乱码问题
2.1乱码:只要确保编码和解码一致,就绝对没有问题.
1. GET方式
- http://localhost:8080/jw08rr02/BBServlet?name=tom&age=18
1.浏览器负责编码.浏览器使用的码表就是表单所在页面的码表.
2.服务器负责解码.服务器默认使用ISO-8859-1解码. 但如果你的服务器使用的是utf-8就不用配置了 如下配 置的URIEncoding来决定
解码码表
<Connector port="8080" protocol="HTTP/1.1" URIEncoding="UTF-8"
connectionTimeout="20000"
redirectPort="8443" /> 在tomcat servlet .xml 中
如上配置会影响整个服务器不推荐.
我们使用如下代码解决:
//获得参数
String name = request.getParameter("name");
//因为服务器使用了错误的码表,那么我们按照错误的码表原路返回
byte[] nameByte = name.getBytes("ISO-8859-1");
//用正确的码表重新解码
String newName = new String(nameByte,"UTF-8");
System.out.println("解决之后的:"+newName);
2.POST方式
因为Post解码是在调用getParameter同时进行解码,那么解决乱码只需要在调用该方法之前设置服务器解码方式
request.setCharacterEncoding("UTF-8");
String name = request.getParameter("name");
System.out.println(name);
涉及到获得表单参数的方法还有哪些呢?
String getParameter() 根据键获得值
Map getParameterMap() 获得服务器保存表单参数的容器
就是map<String,String[]>. 泛型: habit=chi&habit=shui&habit=la
for(Entry<String, String[]> en : map.entrySet()){
String key = en.getKey();
String[] value = en.getValue();
System.out.println(key+"==>" +Arrays.toString(value));
}
Enumeration getParameterNames() 获得提交的所有键 列举
while(en.hasMoreElements()){
String key = en.nextElement();
System.out.println("提交上来的键==>"+key);
}
String[] getParameterValues(String name) 根据键获得值.
获得一键对应多 个值的情况的.
System.out.println(Arrays.toString(habits));
//---------------------------------------------------------------------------------------------------------------------
2. request的请求转发和包含功能.
转发:
一个Servlet处理完毕交给下面的servlet(JSP)继续处理.
作用:
在现实开发中,没有servlet转发给servlet的情况.都是由servlet转发给JSP.
这样可以达到分工的作用:
servlet: 比较适合处理业务.
JSP: 比较适合显示功能
注意问题:
//servlet中不要做 输出正文的动作,没有结果的
//如果放到前面会出现乱码. 解决 response.serCharacterEncoding(“utf-8”);
字符串 通过 utf-8编码 变为 二进制字节 传输
网页 通过 utf-8编码集 把二进制字节解码
逻辑处理
//1 获得表单提交的用户名密码
String name = request.getParameter("name");
String password = request.getParameter("password");
//2 判断是否正确 tom 1234 才算成功
if(name!=null && name.trim().length()>0 && name.equals("tom")&&
password!=null && password.trim().length()>0 &&
password.equals("1234")){
//成功 ==> 转发到成功页面
request.getRequestDispatcher("/login/success.jsp").forward(request,
response);
//自己来做,很多弊端,不要这样
/* AServlet a = new AServlet();
a.service(request, response);*/
}else{
//失败 ==> 转发到失败页面
request.getRequestDispatcher("/login/error.jsp").forward(request, response);
}
//但是响应头是可以设置的.
请求包含:
两个servlet(jsp)共同向浏览器输出内容.
作用:
在现实开发中,多个页面含有相同的内容,我们把相同的内容抽取到一个jsp中,在需要显示这个段内容的jsp中,包含抽取的jsp.可以达到
统一管理相同的内容.
正文部分和页脚分开显示
两个jsp页面 success包含 error页面 访问一个 success页面就行
有不严谨的地方 使用jsp标签来实现
3.request域的应用.
原理:
在request对象中含有一个map.这个map就是request域.
作用:
在将来开发中. 使用请求转发时,servlet处理完数据, 处理结果要交给jsp显示. 可以使用request域将处理结果有servlet带给jsp显示. 共享数据
操作:
1.setAttribute(key,value) 存入一个键值对
2.getAttribute(key) 通过键取出值
3.getAttributeNames() 获得域中所有键
4.removeAttribute(key) 跟据键移除一个键值对
request的范围:
一个request对象对应一个request域(map).
系统当前有多少个request就有多少request域.
//1 获得表单提交的用户名密码
String name = request.getParameter("name");
String password = request.getParameter("password");
//
Map<String,String> error = new HashMap<String, String>();
//2 验证
if(!(name!=null && name.trim().length()>0 && name.equals("tom"))){
error.put("name", "用户名有误!");
}
if(!(password!=null && password.trim().length()>0 && password.equals("1234"))){
error.put("password", "密码错误!");
}
//将错误信息通过request域带到错误页面
request.setAttribute("error",error );
if(error.size() > 0){
//失败==> 回到登录页面,并显示错误信息
request.getRequestDispatcher("/login2/login.jsp").forward(request, response);
}else{
//成功==> 成功页面
request.getRequestDispatcher("/login2/success.jsp").forward(request, response);
}
<body>
<h1>用户登录</h1>
<form action="/Day08-request/HServlet" method="POST">
用户名:<input type="text" name="name" /> <br>
密码:<input type="password" name="password" /><br>
<input type="submit" >
</form>
<%
Map<String,String> error = (Map<String,String>)request.getAttribute("error");
if(error!=null && error.size()>0){
for(Entry<String,String> en : error.entrySet()){
out.print("<font color=‘red‘>");
out.print(en.getValue()+"<br>");
out.print("</font>");
}
}
%>
</body>
//=================================================================================================================
路径总结:
路径分为两种情况:
1.客户端路径 ==> 给浏览器用的路径“/”相对于主机
<form action="/Day08-request/AServlet" >
<a href="/Day08-request/AServlet" >
<img src="/Day08-request/AServlet" >
response.sendRedirect("/Day08-request/AServlet")
Refresh:3;url=/Day08-request/AServlet
路径写法:
带"/" : "/" ==> 相对于 主机.
例如: 表单所在页面路径为==>
http://localhost:8080/Day08-request/login.jsp ==> "/" 代表http://localhost:8080/
不带"/":(开发中一定不要出现不带"/"的情况).代表从当前目录找.
例如: 表单所在页面路径为==>
http://localhost:8080/Day08-request/info/login.jsp ==> 代表
http://localhost:8080/Day08-request/info/
2.服务器端路径”/”相对于项目
<url-pattern> /AServlet ==> http://localhost:8080/Day08-request/AServlet
request.getRequestDispatcher("/AServlet") ==>
http://localhost:8080/Day08-request/AServlet
路径写法:
"/": 相对于项目. "/"==>http://localhost:8080/Day08-request/
以上是关于request $ response的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 Hibernate session.save() 插入/保存对象而不更新旧记录
Request,Request.QueryString,Request.Params,Request.Form,Request.ServerVariables之间的区别
request.getScheme() request.getServerName() request.getServerPort() request.getContextPath()(示例(代码
request.getParameter()request.getInputStream()和request.getReader()
request.getParameter() request.getInputStream()和request.getReader()三者的区别