首页 > 学院 > 开发设计 > 正文

java攻城师之路--复习java web之request_respone

2019-11-14 21:13:23
字体:
来源:转载
供稿:网友
java攻城师之路--复习java web之request_respone

Servlet技术 两条主线1、HTTP协议 2、Servlet生命周期

init() 方法中参数 ServletConfig 对象使用通过ServletConfig 获得 ServletContext对象 使用

service方法 含有两个参数对象 ServletRequest ServletResponse 在实际开发Servlet过程中 不需要覆盖service ---- HttpServlet 根据请求方式自动调用doGet 或者 doPost doGet和doPost参数 HttpServletRequest 和 HttpServletResponse

今天学习重点:HttpServletRequest HttpServletResponse

客户端每次请求 都会创建request对象和response对象 ------ 被传递service / doGet /doPost

HttpServletRequest封装 客户端相关信息,服务器Servlet程序可以通过request对象 操作客户端信息HttpServletResponse 封装服务器 向客户端发送响应数据信息,Servlet程序 通过response对象向客户端发送响应

response常用 APIsetStatus 设置响应行 当中 状态码setHeader 设置响应头信息getOutputStream 获得字节流 ---- 输出响应体内容getWriter 获得字符流 ---- 输出响应体内容

* HttpServletResponse 继承 ServletResponse 接口 ,ServletResponse 并没有提供与HTTP协议相关API ,HttpServletResponse 添加了与协议相关 API* JavaEE API 中并没有提供 HttpServletResponse 实现类 ---- 实现类由tomcat服务器提供的

常用状态码 : 200 302 304 404 500 200 请求处理成功302 客户端重定向304 客户端访问资源没有被修改,客户端访问本地缓存404 访问资源不存在500 服务器内部出错

案例一:通过302 + Location 头信息实现页面重定向效果 response.setStatus(302);response.setHeader("Location", "/day06/welcome.html"); // 相对路径 和 绝对路径* / 由客户端定向服务器,代表客户端 / , 必须添加工程虚拟目录

 1     public void doGet(HttpServletRequest request, HttpServletResponse response) 2             throws ServletException, IOException { 3         ServletContext  sc = getServletContext(); 4         int time=(Integer)sc.getAttribute("times"); 5          time++; 6          sc.setAttribute("times", time); 7          System.out.PRintln("被访问第:"+time+"次"); 8          response.setStatus(302); 9         //这里的conut为web.xml中设置的访问虚拟路径10          response.setHeader("Location", "/day03/count");11     }
设置客户端请求重定向,必须添加工程虚拟目录

头信息存在多个值Accept-Encoding: gzip, deflate --- key:value1,value2 response.addHeader 用于设置响应头有多个值 ------ 不常用 重点:setHeader

在Response API 中提供sendRedirect ---- 完成302+Location重定向效果 例如: response.sendRedirect("/day06/welcome.html");

案例二: 登陆重定向

 1     public void doGet(HttpServletRequest request, HttpServletResponse response) 2             throws ServletException, IOException { 3         String name = request.getParameter("username"); 4         String passWord = request.getParameter("password"); 5         if (name.equals("admin")&&password.equals("admin")) { 6         //    response.setStatus(302); 7         //    response.setHeader("Location", "/day04/response/Welcome.html"); 8             response.sendRedirect("/day04/response/Welcome.html"); 9         }else{10         //    response.setStatus(302);11         //    response.setHeader("Location", "/day04/loggin.html");12             //sendRedirect()它综合了setStatus(302)+setHeader的效果13             response.sendRedirect("/day04/loggin.html");14         }15     }
使用response.sendRedirect实现登录重定向

案例三: 自动刷新网页 * 登陆成功,5秒后自动跳转XX页面 原理:通过refresh 头信息 格式 ----- refresh: 时间;url=跳转路径例如: refresh:3;url=http://www.itcast.cn -------- 3秒后自动跳转http://www.itcast.cn 网站

* HTML 页面中存在一类非常特殊标签 <meta> ,<meta> 起到设置头信息作用 <meta content="3;url=/day06/response/demo3/result.html" http-equiv="refresh"> ---- 完成自动跳转

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><title>Insert title here</title></head><body>    <form action="/day04/loggin" method="post">        <input type="text"  name="username">        <input type="password" name="password">        <input type="submit" value="登录">    </form></body></html>
loggin.html
 1 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 2 <html> 3 <head> 4 <meta content="3;url=/day04/loggin.html" http-equiv="refresh"> 5 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 6 <title>Insert title here</title> 7 </head> 8 <body> 9    Welcome to loggin ~! 3秒后自动跳转到登录页面....10 </body>11 </html>
Welcome.html
 1 package com.shellway.response; 2  3 import java.io.IOException; 4  5 import javax.servlet.ServletException; 6 import javax.servlet.http.HttpServlet; 7 import javax.servlet.http.HttpServletRequest; 8 import javax.servlet.http.HttpServletResponse; 9 10 public class ResponseForLoggin extends HttpServlet {11 12     public void doGet(HttpServletRequest request, HttpServletResponse response)13             throws ServletException, IOException {14         String name = request.getParameter("username");15         String password = request.getParameter("password");16         response.setContentType("text/html;charset=utf-8");17         if (name.equals("admin")&&password.equals("admin")) {18         //    response.setStatus(302);19         //    response.setHeader("Location", "/day04/response/Welcome.html");20             response.sendRedirect("/day04/response/Welcome.html");21         }else{22         //    response.setStatus(302);23         //    response.setHeader("Location", "/day04/loggin.html");24         //    sendRedirect()它综合了setStatus(302)+setHeader的效果25             response.getWriter().println("您输入的帐号和密码有误,3秒后将自动跳转到登录页面...");26             response.setHeader("refresh", "3;url=/day04/loggin.html");27         //    response.sendRedirect("/day04/response/Error.html");28         }29     }30 31     public void doPost(HttpServletRequest request, HttpServletResponse response)32             throws ServletException, IOException {33                 doGet(request, response);34     }35 }
ResponseForLoggin

案例四:通过response头信息设置 浏览器禁止缓存原理:和禁用缓存相关头信息 三个 Cache-Control:no-cacheExpires:Thu, 01 Dec 1994 16:00:00 GMT ----- setDateHeader("expires",-1);Pragma : no-cache

IE 工具---Internet选项 ---常规 --- 设置 --- 查看文件对于Servlet生成HTML页面,经常需要改变,禁止Servlet动态程序缓存 * 设置Expires时,通常 setDateHeader 为过期时间设置一个毫秒值,生成HTTP响应时,会自动转换日期字符串表示

 1 public class ResponseServlet1 extends HttpServlet { 2  3     public void doGet(HttpServletRequest request, HttpServletResponse response) 4             throws ServletException, IOException { 5             response.setHeader("Cache-Control", "no-cache"); 6             response.setHeader("Pragma", "no-cache"); 7           //response.setHeader("expires", "Thu, 01 Dec 1994 16:00:00 GMT");一般用setDateHeader 8           //通过setDateHeader为expires设置毫秒值,从1970年1月1日 00:00:00毫秒开始 9             response.setDateHeader("expires", -1);//-1就是1970年1月1日前一天最后一秒,表示过期了10             response.getWriter().println("Hello,XXX");11     }12 13     public void doPost(HttpServletRequest request, HttpServletResponse response)14             throws ServletException, IOException {15         doGet(request, response);16     }17 }
禁用缓存:ResponseServlet1

---------------------------------------------------------------通过response 生成 客户端响应体,通过字节流和字符流两种输出方式 * 哪些情况用字节流? 哪些情况用字符流 ? 文件拷贝 ---- 字节流 分析文件内容 --- 字符流 (中文操作 字符流)

案例五:输出中文信息对中文信息进行编码 response.setCharacterEncoding("utf-8");response.setContentType("text/html;charset=utf-8");

setCharacterEncodig 和 setContentType 区别 ?

结论:开发中只需要使用setContentType 就可以了

注意:1、getOutputStream和getWriter 不能同时使用2、必须在getOutputStream和getWriter 之前 设置响应 编码 3、getOutputStream和getWriter 输出内容 是 HTTP响应体 4、getOutputStream和getWriter 存在缓冲区的 ,在service方法结束时,自动关闭流,flush缓冲区内容

案例六 文件下载第一种:通过超链接 完成文件下载 * 如果浏览器可以识别该文件格式,直接打开,只有链接文件浏览器不识别文件格式,才会实现下载

第二种:通过Servlet程序实现下载 原理:通过Servlet读取目标程序,将资源返回客户端通过程序下载文件 设置两个头信息 Content-Type Content-Disposition

response.setContentType(getServletContext().getMimeType(filename)); ---- 设置文件类型 response.setHeader("Content-Disposition", "attachment;filename="+ filename); ---- 设置文件以附件形式下载(对于浏览器识别格式文件)

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><title>Insert title here</title></head><body>     <h1>通过超链接下载</h1>     <a href="/day04/resourses/2.rar">rar压缩文件下载</a>     <a href="/day04/resourses/1.jpg">图片下载</a>          <h1>通过程序下载</h1>     <a href="/day04/download?filename=2.rar">rar压缩文件下载</a>     <a href="/day04/download?filename=1.jpg">图片下载</a></body></html>
download.html
 1 package com.shellway.response; 2  3 import java.io.FileInputStream; 4 import java.io.FileOutputStream; 5 import java.io.IOException; 6  7 import javax.servlet.ServletException; 8 import javax.servlet.ServletOutputStream; 9 import javax.servlet.http.HttpServlet;10 import javax.servlet.http.HttpServletRequest;11 import javax.servlet.http.HttpServletResponse;12 13 public class ResponseDownload extends HttpServlet {14 15     public void doGet(HttpServletRequest request, HttpServletResponse response)16             throws ServletException, IOException {17         String filename =request.getParameter("filename");18         //下面这两句比较固定,第一句根据所给的文件名分析得到文件格式19         response.setContentType(getServletContext().getMimeType(filename));20         //获得文件格式后,通过消息头设置文件以附件(attachment)的形式下载21         response.setHeader("Content-Disposition", "attachment;filename="+filename);22         23         String filepath = getServletContext().getRealPath("/resourses/"+filename);24         ServletOutputStream out = response.getOutputStream();25         FileInputStream fileInputStream = new FileInputStream(filepath);26         int len=0;27         while ((len = fileInputStream.read())!=-1) {28             out.write(len);29         }30         fileInputStream.close();31         out.close();32     }33 34     public void doPost(HttpServletRequest request, HttpServletResponse response)35             throws ServletException, IOException {36 37         doGet(request, response);38 39     }40 }
ResponseDownload

案例七 验证码输出案例 Java图形API 生成验证码图片 ----- 了解 为什么需要验证码 ?防止有人通过程序恶意攻击网站 验证码为什么是图片 ?为什么雪花或者干扰线? 常用验证码 : 字母和数字

验证码旋转效果 rotate(double theta, double x, double y) ----- 参数 theta 旋转弧度 2PI 弧度 = 360 角度

-30 ---- 30 角度

验证码看不清楚,点击切换验证码 ---- 编写Javascript程序 方法一:设置验证码图片不缓存方法二:每次访问使url 不同 ----- url?new Date().getTime() 当前时间

 1 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 2 <html> 3 <head> 4 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 5 <title>Insert title here</title> 6 <script type="text/javascript"> 7          // 重新加载验证码图片  8         // 方法二:如果图片缓存,注意document后面没有括号 9   function change(){10      document.getElementById("myimage").src="/day04/response2?"+new Date().getTime();11   }12 </script>13 14 </head>15 <body>16      用户名:  <input type="text" name="username"/><br/>17      密&nbsp;&nbsp;码:  <input type="password" name="password"/><br/>18      验证码:  <input type="text" name="check"/> 19            <img src="/day04/response2" onclick="change()" id="myimage" style="cursor: pointer;"/>20             <input type="submit" value="注册">21 </body>22 </html>
register.html
 1 package com.shellway.response; 2  3 import java.awt.Color; 4 import java.awt.Font; 5 import java.awt.Graphics; 6 import java.awt.Graphics2D; 7 import java.awt.image.BufferedImage; 8 import java.io.IOException; 9 import java.util.Random;10 11 import javax.imageio.ImageIO;12 import javax.servlet.ServletException;13 import javax.servlet.http.HttpServlet;14 import javax.servlet.http.HttpServletRequest;15 import javax.servlet.http.HttpServletResponse;16 17 public class ResponseServlet2 extends HttpServlet {18 19     public void doGet(HttpServletRequest request, HttpServletResponse response)20             throws ServletException, IOException {21         // response.setHeader("Cache-Control", "no-cache");22         // response.setDateHeader("Expires", -1);23         // response.setHeader("Pragma", "no-cache");24 25         int width = 120;26         int height = 30;27         // 1、创建一张 内存中缓冲图片28         BufferedImage bufferedImage = new BufferedImage(width, height,29                 BufferedImage.TYPE_INT_RGB);30 31         // 2、背景色32         Graphics graphics = bufferedImage.getGraphics(); // 通过 graphics对象 绘制图片33         // 设置颜色34         graphics.setColor(Color.YELLOW);35         graphics.fillRect(0, 0, width, height);36 37         // 3、边框38         graphics.setColor(Color.BLUE);39         graphics.drawRect(0, 0, width - 1, height - 1);40 41         // 4、写验证码内容42         Graphics2D graphics2d = (Graphics2D) bufferedImage.getGraphics();43         graphics2d.setColor(Color.RED);44         // 设置字体45         graphics2d.setFont(new Font("宋体", Font.BOLD, 18));46         // String content =47         // "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890";48         String content = "/u7684/u4e00/u4e86/u662f/u6211/u4e0d/u5728/u4eba/u4eec/u6709/u6765/u4ed6/u8fd9/u4e0a/u7740/u4e2a/u5730/u5230/u5927/u91cc/u8bf4/u5c31/u53bb/u5b50/u5f97/u4e5f/u548c/u90a3/u8981/u4e0b/u770b/u5929/u65f6/u8fc7/u51fa/u5c0f/u4e48/u8d77/u4f60/u90fd/u628a/u597d/u8fd8/u591a/u6ca1/u4e3a/u53c8/u53ef/u5bb6/u5b66/u53ea/u4ee5/u4e3b/u4f1a/u6837/u5e74/u60f3/u751f/u540c/u8001/u4e2d/u5341/u4ece/u81ea/u9762/u524d/u5934/u9053/u5b83/u540e/u7136/u8d70/u5f88/u50cf/u89c1/u4e24/u7528/u5979/u56fd/u52a8/u8fdb/u6210/u56de/u4ec0/u8fb9/u4f5c/u5bf9/u5f00/u800c/u5df1/u4e9b/u73b0/u5c71/u6c11/u5019/u7ecf/u53d1/u5de5/u5411/u4e8b/u547d/u7ed9/u957f/u6c34/u51e0/u4e49/u4e09/u58f0/u4e8e/u9ad8/u624b/u77e5/u7406/u773c/u5fd7/u70b9/u5fc3/u6218/u4e8c/u95ee/u4f46/u8eab/u65b9/u5b9e/u5403/u505a/u53eb/u5f53/u4f4f/u542c/u9769/u6253/u5462/u771f/u5168/u624d/u56db/u5df2/u6240/u654c/u4e4b/u6700/u5149/u4ea7/u60c5/u8def/u5206/u603b/u6761/u767d/u8bdd/u4e1c/u5e2d/u6b21/u4eb2/u5982/u88ab/u82b1/u53e3/u653e/u513f/u5e38/u6c14/u4e94/u7b2c/u4f7f/u5199/u519b/u5427/u6587/u8fd0/u518d/u679c/u600e/u5b9a/u8bb8/u5feb/u660e/u884c/u56e0/u522b/u98de/u5916/u6811/u7269/u6d3b/u90e8/u95e8/u65e0/u5f80/u8239/u671b/u65b0/u5e26/u961f/u5148/u529b/u5b8c/u5374/u7ad9/u4ee3/u5458/u673a/u66f4/u4e5d/u60a8/u6bcf/u98ce/u7ea7/u8ddf/u7b11/u554a/u5b69/u4e07/u5c11/u76f4/u610f/u591c/u6bd4/u9636/u8fde/u8f66/u91cd/u4fbf/u6597/u9a6c/u54ea/u5316/u592a/u6307/u53d8/u793e/u4f3c/u58eb/u8005/u5e72/u77f3/u6ee1/u65e5/u51b3/u767e/u539f/u62ff/u7fa4/u7a76/u5404/u516d/u672c/u601d/u89e3/u7acb/u6cb3/u6751/u516b/u96be/u65e9/u8bba/u5417/u6839/u5171/u8ba9/u76f8/u7814/u4eca/u5176/u4e66/u5750/u63a5/u5e94/u5173/u4fe1/u89c9/u6b65/u53cd/u5904/u8bb0/u5c06/u5343/u627e/u4e89/u9886/u6216/u5e08/u7ed3/u5757/u8dd1/u8c01/u8349/u8d8a/u5b57/u52a0/u811a/u7d27/u7231/u7b49/u4e60/u9635/u6015/u6708/u9752/u534a/u706b/u6cd5/u9898/u5efa/u8d76/u4f4d/u5531/u6d77/u4e03/u5973/u4efb/u4ef6/u611f/u51c6/u5f20/u56e2/u5c4b/u79bb/u8272/u8138/u7247/u79d1/u5012/u775b/u5229/u4e16/u521a/u4e14/u7531/u9001/u5207/u661f/u5bfc/u665a/u8868/u591f/u6574/u8ba4/u54cd/u96ea/u6d41/u672a/u573a/u8be5/u5e76/u5e95/u6df1/u523b/u5e73/u4f1f/u5fd9/u63d0/u786e/u8fd1/u4eae/u8f7b/u8bb2/u519c/u53e4/u9ed1/u544a/u754c/u62c9/u540d/u5440/u571f/u6e05/u9633/u7167/u529e/u53f2/u6539/u5386/u8f6c/u753b/u9020/u5634/u6b64/u6cbb/u5317/u5fc5/u670d/u96e8/u7a7f/u5185/u8bc6/u9a8c/u4f20/u4e1a/u83dc/u722c/u7761/u5174/u5f62/u91cf/u54b1/u89c2/u82e6/u4f53/u4f17/u901a/u51b2/u5408/u7834/u53cb/u5ea6/u672f/u996d/u516c/u65c1/u623f/u6781/u5357/u67aa/u8bfb/u6c99/u5c81/u7ebf/u91ce/u575a/u7a7a/u6536/u7b97/u81f3/u653f/u57ce/u52b3/u843d/u94b1/u7279/u56f4/u5f1f/u80dc/u6559/u70ed/u5c55/u5305/u6b4c/u7c7b/u6e10/u5f3a/u6570/u4e61/u547c/u6027/u97f3/u7b54/u54e5/u9645/u65e7/u795e/u5ea7/u7ae0/u5e2e/u5566/u53d7/u7cfb/u4ee4/u8df3/u975e/u4f55/u725b/u53d6/u5165/u5cb8/u6562/u6389/u5ffd/u79cd/u88c5/u9876/u6025/u6797/u505c/u606f/u53e5/u533a/u8863/u822c/u62a5/u53f6/u538b/u6162/u53d4/u80cc/u7ec6";49 50         // 内容四个字 --- 随机从content中抽取四个字51         Random random = new Random();52         int x = 10;53         int y = 20;54         for (int i = 0; i < 4; i++) { // 循环四次55             // 为字 生成旋转角度 -30 ---- 3056             double jiaodu = random.nextInt(60) - 30;57             // 将旋转角度 换算弧度58             double theta = jiaodu / 180 * Math.PI;59 60             int index = random.nextInt(content.length());61             char letter = content.charAt(index); // letter 验证码内容62             graphics2d.rotate(theta, x, y);63             graphics2d.drawString(letter + "", x, y);64             // 将角度还原65             graphics2d.rotate(-theta, x, y);66             x += 30;67         }68 69         // 5 绘制随机干扰线70         int x1;71         int x2;72         int y1;73         int y2;74         graphics.setColor(Color.LIGHT_GRAY);75         for (int i = 0; i < 10; i++) {76             x1 = random.nextInt(width);77             x2 = random.nextInt(width);78             y1 = random.nextInt(height);79             y2 = random.nextInt(height);80             // 根据两点 绘制直线81             graphics.drawLine(x1, y1, x2, y2);82         }83 84         // 内存中资源 释放85         graphics.dispose();86 87         // 将图片输出到 浏览器 ImageIO88         // 将内存的图片 通过 浏览器输出流 写成 jpg格式图片89         ImageIO.write(bufferedImage, "jpg", response.getOutputStream());90 91     }92 93     public void doPost(HttpServletRequest request, HttpServletResponse response)94             throws ServletException, IOException {95 96         doGet(request, response);97 98     }99 }
生成验证码:ResponseServlet2

-----------------------------------------------------------------HttpServletRequest 分为四个部分HttpServletRequest 想比 ServletRequest 添加与协议相关 API1、获取客户机信息URI和URL区别url:http://localhost/day06/request1 --- 完整uri:/day06/request1 ---- 部分

URI 包含 URL的 ,URL 一定完成路径,URI可以相对路径 http://localhost/day06/request1 是一个URL 同时也是 URI./hello /day06/request1 ---- 都是URI 不是URL

获得ip : request.getRemoteAddr();

获得当前访问资源路径 : request.getRequestURI().substring(request.getContextPath().length());

2、获取请求头信息getHeader 获得头信息的值,转换一个字符串getHeaders 获得头信息值 ,获得EnumerationgetHeaderNames 获得所有头信息名称 返回 Enumeration

* 掌握getHeader使用,遍历Enumeration 获得所有头信息

编写防盗链程序,存在合法referer不是盗链,否则控制目标资源无法访问 !* 通过URL 绕过盗链判断

3、获取请求参数什么是请求参数? 用户通过请求提交服务器一些数据 ----- <a href="url?xxx=xxx" >、<form method="get"> 、 <form method="post">/day06/request4?name=zhangsan&city=beijing ---- 包括两个参数的 name 和 city

常用API四个getParametergetParameterValuesgetParameterNamesgetParameterMap

非空校验if (username != null && username.trim().length() > 0) {} ----- 短路

乱码问题post ---- request.setCharacterEncoding("客户端编码集");

get乱码手动解决username = URLEncoder.encode(username, "ISO-8859-1");// 用ISO编码username = URLDecoder.decode(username, "utf-8"); // 用utf-8解码简化上面写法 : username = new String(username.getBytes("ISO-8859-1"), "utf-8");

get乱码 配置tomcat默认解码字符集在tomcat/conf/server.xml Connector中 添加一个属性 URIEncoding="utf-8"

结论:开发时,尽量不要修改tomcat默认解码集 ,提交请求请尽量使用post ,如果非要使用get ,手动编码

问题:http://localhost/day06/servlet?username=zhangsan+lisi在服务器端 通过 request.getParameter("username") 结果是 ??? ----- zhangsan lisi

4、利用请求域传递对象HttpServletRequest 和 ServletContext 类似 都是数据域对象 , 以Map方式保持数据区分:存活时间不同 ServletContext对象 服务器启动对象创建,服务器停止对象销毁ServletRequest对象 当产生一次请求时 创建,当响应结束后,对象销毁

通过request转发请求,request保存数据进行Servlet之间传递 ---- 应用?Servlet进行数据处理 --- 生成结果 --- 转发结果给jsp显示

注意事项1、在使用forward之前 不能将响应内容传输到客户端情况一 response输出流执行flush 情况二 同一个Servlet不能连续使用forward 和 redirect2、在执行forward 和 redirect时,清除之前写入响应流数据 3、ServletContext进行转发 路径必须/开始,request进行转发路径可以使用相对路径

转发和重定向区别1、转发一次请求、一次响应 重定向 两次请求 两次响应2、转发只能跳转站内程序,重定向定向任何站点 3、转发 URL地址不变 ,重定向URL地址改变 4、转发 对客户端不可见,重定向对客户端可见 5、转发共享同一个Request中数据,重定向两次请求,不同Request对象,不能共享Request数据

* request.setAttribute 必须和 request.getRequestDispatcher().forward 一起使用

RequestDispatcher 的 include 方法 用来做页面布局 ------ <%@include%> <jsp:include> 将页面公共部分抽取出来,通过include 引用到页面中 ---- 更加方便维护

总结:1、Response 四个必须 API setStatus setHeader getOutputStream getWriter setStatus 状态码setHeader 头信息getOutputStream getWriter 响应体

2、重定向 302 + Location ---- 简写 sendRedirect 案例 用户登录重定向

3、refresh自动刷新网页 <meta> 标签使用

4、禁用浏览器缓存 三个头字段

5、响应中文乱码 ---- 都使用setContentType

6、文件下载 超链接和Servlet程序 Servlet程序 设置两个头字段 Content-Type Content-Disposition

7、验证码程序 (写完整存档)* 验证码点击切换 两种方法

8、request请求行相关API getRequestURI getContextPath getRemoteAddr getMethod 思考:获得访问资源路径

9、request头信息获得(不重要) ---- 掌握防盗链案例

10、获得请求参数 乱码解决 get 、post (超级重要)

11、转发共享request数据 、include进行页面布局 ---- 了解即可


上一篇:多线程基础

下一篇:Thread的run和start

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表