day08-request&responseのPPT学习
来源:互联网 发布:卫星地图软件 编辑:程序博客网 时间:2024/06/06 05:38
1:HttpServletResponse
*定义:HttpServletResponse对象代表服务器的响应,这个对象封装了向客户端发送数据,发送响应头,发送响应状态码的方法:
1. void setStatus(int sc);
2. void setHeader(java.lang.String name,java.lang.String value);
3. java.io.PrintWriter getWriter();
4. ServletOutputStream getOutputStream();
2:response常见应用
1:向客户端输出中文数据
1:用字节流输出数据用OutputStream(字节流)发送数据
- response.getOutputStream().write(“中国”.getBytes());//以默认编码发送数据
- response.getOutputStream().write(“中国”.getBytes(“UTF-8”));//以UTF-8编码发送数据,浏览器默认用GB2312会出现乱码
解决方法
- 更改浏览器的编码方式:IE/查看/编码/UTF-8(不可取)
- 通过设置响应头告知客户端编码方式,response.setHeader(“Content-type”,”text/html;charset=UTF-8”);//告知浏览器数据类型及编码
- 通过meta标签模拟请求头:out.write(“”.getBytes());
- response.setContentType(“text/html;charset=UTF-8”);
总结:程序以什么编码输出,就需要告诉客户端以什么编码显示。
问题:输出字符“97”用response.getOutputStream().write(1),会出现的问题2:用字符流输出数据
response.getWriter().write(“中国”);有没有乱码???
会产生乱码:
原因:以默认编码发送数据ISO-8859-1(没有中国二字编码),此时会发生乱码
解决办法:
- setCharacterEncoding(“UTF-8”);//更改编码为UTF-8
- response.setHeader(“Context-type”,”text/html;charset=UTF-8”);//告诉客户端编码方式
*注意:不要忘记告诉客户端的编码方式- 由于经常改动编码,resonse提供了一种更简单的方式:
response.setContentType(“text/html;charset=UTF-8”);//其作用相当于以上两条代码
2:文件下载
String path = getServletContext().getRealPath("/store/112.gif");String fileName = path.subString(path.lastIndexOf("\\")+1);//设置响应头,告诉客户端是下载response.setHeader("Content-disposition","attachment;filename="+fileName);InputStream is = new FileInputStream(path);OutputStream os = new response.getOutputStream();int len = 0;byte buffer[] = new byte[1024];while((len=is.read(buffer)) != -1){ os.write(buffer,0,len);}is.close();os.close();
注意中文文件下载的文件名乱码问题:
问题:文件名乱码或无法下载
解决:将文件名进行编码
“attachment;filename=”+URLEncoder.encode(fileName,”UTF-8”);
3:输出随机图片
(CAPTCHA图像):
Completely Automated Public Turing Test to Tell Computers and Humans Apart(全自动区分计算机和人类的测试)
相关主要类
- BufferedImage:内存图像
- Graphics:画笔
- ImageIO:输出图像
- 放在html页面上
注意:浏览器默认会缓存图片
控制浏览器不要缓存图片
- response.addHeader(“Pragma”,”no-cache”);
- response.setHeader(“Cache-Control”,”no-nocache”);
- response.setHeader(“Expires”,”0”);
通过js刷新图片
4:发送http头,控制浏览器定时刷新网页
1.输出一个随机数,控制浏览器每2s刷新一次
int i = new Random().nextInt(10000);//产生随机数response.getWriter().write(i+"");//这里如果i不加空字符串,会输出i所对应的字符eg:97:aresponse.setHeader("Refresh","2");//每隔2s刷新一次
2.利用Refresh刷新到其他组件。模拟注册页面,注册处理交由一个Servlet,在Servlet处理完成后,显示注册成功并转向主页。(meta也可实现)
//将用户名和密码保存到数据库中,假设此代码完成执行response.setContentType("text/html;charset=UTF-8");response.setHeader("Refresh","3;URL=index.jsp");//3秒后转向index.htmlresponse.getWriter().write("注册成功!,3秒后自动跳转。"若没有跳转,请猛戳<a href='index.html'>这里</a>
3.思考:web.xml中能使用Servlet作为默认主页么?Why????????
5:发送http头,控制浏览器缓存当前文档内容
举例:注意此处相对于1970年1月1日00:00:00的时间
response.setDateHeader("Expires",System.currentTimeMillis()+1000*60*60);//缓存1小时
设置缓存,主要是对于不怎么变化的数据,利用缓存能减轻服务器的负担,可以通过查看缓存文件了解
6:通过response实现请求重定向
请求重定向:一个web资源收到客户端请求后,通知客户端访问另一个web资源,这称之为请求重定向
说明:地址栏会变,并发送2次请求,增加了服务器的负担
**实现方式:**response.sendRedirect();
**实现原理:**302、207状态码和location头即可实现重定向
7:response细节
- getOutputStream 和getWriter方法分别用户得到输出二进制数据,输出文本数据的ServletOutputStream,PrintWriter对象
- getOutputStream和getWriter这两个方法互相排斥,调用了其中的一个任何方法后,就不能再调用另一个方法,否则会抛出异常
- Servlet程序向ServletOutputStream或PrintWriter对象中写入的数据将会被Servlet引擎从response里面获取,Servlet引擎将这些数据当作响应消息的正文,然后再与响应状态行和各响应头组合后输出到客户端
- Servlet的service方法结束后,Servlet引擎将检查getWriter或getOutputStream方法返回的输出流对象是否已经调用了close方法,如果没有,Servlet引擎将调用close方法关闭该输出流对象。
8:HttpServletRequest对象
request常用方法
获取客户机信息:
1. getRequestURL()方法返回客户端发出请求的完整URL
2. getRequestURI()方法返回请求行中的资源名部分
3. getQueryString()方法返回请求行中的参数部分
4. getRemoteAddr()方法返回发出请求的客户机的IP地址
5. getRemoteHost()方法返回发出请求的客户机的完整主机名
6. getRemotePort()方法返回客户机所使用的网络端口号
7. getLocalAddr()方法返回WEB服务器的IP地址
8. getLocalName()方法返回WEB服务器的主机名
9. getMethod()得到客户机请求方式获取客户机请求头:
1. getHead(name)方法
2. getHeaders(String name)方法
3. getHeaderNames方法获取客户机请求参数(客户端提交的数据):
1. getParameter(name)方法
2. getParameterValues(String name)方法
3. getParameterNames方法
4. getParameterMap方法//做框架用,非常实用
5. getInputStream()
请求参数的中文乱码问题
浏览器是以什么编码就以什么编码传送数据
解决:
request.setCharacterEncoding(“UTF-8”);//只针对Post有效
new String(username.getBytes(“ISO-8859-1”),”UTF-8”);//GET方式
超链接:cn//GET方式提交数据
更改Tomcat的配置解决URL编码问题:
<!-- checkbox radio 只要一个都木选,浏览器根本不会传值给服务器 -->
姓名:
密码:
性别:男
女
已婚:
故乡:
北京
山东
湖北
爱好:吃饭
睡觉
学Java
简介:
</form>
9:request对象实现请求转发
request的请求转发:请求转发指一个web资源收到客户端请求后,通知服务器去调用另外一个web资源进行处理
request.getRequestDispatcher(“相对路径”).forward(reqeust,response);
request对象作为域对象的常用四个方法:
- setAttribute
- getAttribute
- removeAttribute
- getAttributeNames
10:转发和包含
一个Servlet对象无法获得另一个Servelt对象的引用;如果需要多个Servet组件共同协作(数据传递),只能使用Servelt规范为我们提供的两种方式:
请求转发:Servlet(源组件)先对客户请求做一些预处理操作,然后把请求转发给其他web组件(目标组件)来完成包括生成响应结果在内的后续操作。
包含:Servelt(源组件)把其他web组件(目标组件)生成的响应结果包含到自身的响应结果中。
转发和请求的共同点
源组件和目标组件处理的都是同一个客户请求,源组件和目标组件共享同一个ServeltRequest和ServletResponse对象
目标组件都可以为Servlet、JSP或HTML文档
都依赖 javax.servlet.RequestDispatcher接口
11.RequestDispather
表示请求分发起,它有两个方法:
forward():把请求转发给目标组件public void forward(ServletRequest request,ServletResponse response) throws ServletException,java.io.IOExceptioninclude():包含目标组件的响应结果public void include(ServletRequest request,ServletResponse response) throws ServletException,java.io.IOException
得到RequestDispatcher对象
>
1. ServletContext对象的getRequestDispather(String path1)
path1必须用绝对路径,即以”/”开头,若用相对路径会抛出异常IllegalArgumentException
2. ServletRequest对象的getRequestDispatcher(String path2)
path2可以用绝对路径也可以用相对路径
1. Include包含网页时,设置头信息无效
2. request.getContextPath();
12:转发
dispatcher.forward(request,response)的处理流程:
- 清空用于存放响应正文数据的缓冲区
- 如果目标组件为Servlet或JSP,就调用它们,把它们产生的响应结果发送到客户端;如果目标组件为文件系统中的静态HTML文档,就读取文档中的数据并把它发送给客户端。
特点:
- 由于forward()方法先清空用于存放响应正文数据的缓冲区,因此源组件生成的响应结果不会被发送到客户端,只有目标组件生成的响应结果才会被送到客户端。
- 如果源组件在进行请求转发之前,已经提交了响应结果(如调用了response的flush或close方法),那么forward()方法会抛出IllegalStateException。为了避免该异常,不应该在源组件中提交响应结果。
代码示例:
public class CheckServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String username = request.getParameter(“username”);
String message = null;
if(username==null){
essage = “Please input username!”;
}else{
message = “Hello,”+username;
}
request.setAttribute(“msg”,message);
RequestDispatcher dispatcher = getServletContext().getRequestDispatcher("/upload.html"); PrintWriter out = response.getWriter(); out.println("Output from CheckServlet before forwarding request.1"); System.out.println("Output form CheckServlet before forwarding request.2"); dispatcher.forward(request, response); out.println("Output from CheckServlet after forwarding request.1"); System.out.println("Output form CheckServlet after forwarding request.2"); }}-------------------------------------------------------------------------------public class OutputServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String message = (String) request.getAttribute("msg"); response.getWriter().println(message); }}
13:包含
include()方法的处理流程:
- 如果目标组件为Servlet或JSP,就执行它们,并把它们产生的响应正文添加到源组件的响应结果中;如果目标组件为HTML文档,就直接把文档的内容添加到源组件的响应结果中。
- 返回到源组件的服务方法中,继续执行后续代码块。
特点:
- 源组件与被包含的目标组件的输出数据都会被添加到响应结果中。
- 在目标组件中对响应状态代码或者响应头所做的修改都会被忽略。
14:请求范围
>
1. web应用范围内的共享数据作为ServeltContext对象的属性而存在(setAttribute),只要共享ServletContext对象也就共享了其数据。
2. 请求范围内的共享数据作为ServletRequest对象的属性而存在(setAttribute),只要共享ServletRequest对象也就共享了其数据。
14:重定向
重定向机制的运作流程
HttpServeltResponse的sendRedirect(String location)用于重定向
>
1. 用户在浏览器端输入特定URL,请求访问服务器端的某个组件
2. 服务器端的组件返回一个状态码为302的响应结果。
3. 当浏览器端接收到这种响应结果后,再立即自动请求访问另一个web组件
4. 浏览器端接收到来自另一个web组件的响应结果。
特点:
1. Servlet源组件生成的响应结果不会被发送到客户端。 response.sendRedirect(String location)方法一律返回状态码为302的响应结果。
2. 如果源组件在进行重定向之前,已经提交了响应结果,会抛出IllegalStateException。为了避免异常,不应该在源组件中提交响应结果。
3. 在Servlet源组件重定向语句后面的代码也会执行。
4. 源组件和目标组件不共享同一个ServletRequest对象。
5. 对于sendRedirect(String location)方法的参数,如果以“/”开头,表示相对于当前服务器根路径的URL。以“http”//”开头,表示一个完整路径。
6. 目标组件不必是同一服务器上的同一个web应用的组件,它可以是任意一个有效网页。
- day08-request&responseのPPT学习
- day08-request&responseの代码练习
- day08-JavaWeb之http协议request-response
- request和response学习
- request/response学习笔记
- JavaEE学习04--request&response
- Tomcat学习之Request/Response封装
- FiddlerScript学习一:修改Request或Response
- request和response的学习总结
- Tomcat学习之Request/Response封装
- FiddlerScript学习一:修改Request或Response
- MassTransit 学习记录(二) Request/Response
- tomcat学习之request与response
- Tomcat学习之Request/Response封装
- express 学习笔记(二)request && response
- Java学习笔记——request&response
- Tomcat学习之Request/Response封装
- 10 request&&response的学习笔记
- C++ tree(1)
- QPM 使用日志,接入第三方日志
- Unix Command
- 缓冲区的运用
- Just4Fun - Comparaison between const and readonly in C#
- day08-request&responseのPPT学习
- day08-request&responseの代码练习
- WebView loadData 乱码
- 删除github的master分支
- LeetCode 题解(73): Roman to Integer
- linux下IPTABLES配置详解
- LeetCode - Spiral Matrix I && II - Frequent
- Reverse Linked List II
- [Leetcode]Multiply Strings