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 密 码: <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进行页面布局 ---- 了解即可
新闻热点
疑难解答