缺省的Servlethtml
在tomcat/conf/web.xml中java
<init-param>web
<param-name>listings</param-name>数组
<param-value>false 这个改为true</param-value>浏览器
</init-param>缓存
response对象(响应对象)tomcat
想要获取客户端的内容,使用request对象;对客户端做出响应使用responsedom
状态码 jsp
setStatus(int sc) 设置状态码,如302字体
sendError(int sc):发送错误的状态码 如40四、500
sendError(int sc,String msg):发送错误的状态码,而且加上附加信息
响应头(key:value的形式出现的,一个key对应一个value 一个key对应多个value) 下面add开头的不多见
一、setHeader(String name,String value) 一个key对应一个value
如 setHeader(“aa”, “bb”);
setHeader(“aa”, “cc”);
结果为 aa:cc 会进行覆盖
二、addHeader(String name,String value) 一个key对应多个value
如 setHeader(“aa”, “bb”);
setHeader(“aa”, “cc”);
结果 aa:bb,cc 会进行追加
三、setIntHeader(String name,int value) 单值的int类型的响应头
四、addIntHeader(String name,int value) 多值的int类型的响应头
五、setDateHeader(String name,long value) 单值的毫秒类型的响应头
六、addDateHeader(String name,long value) 多值的毫秒类型的响应头
响应体
ServletOutputStream getOutputStream() 字符输出流
PrintWriter getWriter()
重定向案例
package cn.idcast.response; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; /* * 用户请求访问ResponseServlet,而后ResponseServlet响应302,给出Location头 * 浏览器会重定向到ResponseServlet2 */ public class ResponseServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { System.out.println("ResponseServlet"); // 下面2个方法均可以用,建议重定向用第二个比较方便 // response.setHeader("Location", "/Day4/ResponseServlet2"); //重定向到下面的那个页面 记得项目名前面要加 / // response.setStatus(302); response.sendRedirect("/Day4/ResponseServlet2"); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } }
package cn.idcast.response; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class ResponseServlet2 extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { System.out.println("ResponseServlet2"); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } }
自动刷新案例
package cn.idcast.response; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class ResponseRefresh extends HttpServlet { // 自动刷新 public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.getWriter().write("5second"); // 表示5秒后将会自动跳转到/Day4/Refresh2这个页面 response.setHeader("Refresh", "5;Url=/Day4/Refresh2"); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } }
package cn.idcast.response; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class ResponseRefresh2 extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.getWriter().write("hahah"); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } }
禁用浏览器缓存(三个头信息)
Cache-Control no-cache
expires 这里是 -1 要用setDateHeader 其余2个都是setHeader
pragma no-cache
不用记 只要在index.jsp里面找 就能够
中文乱码
字节输入中文乱码问题 不必定乱码
解决方法
一、设置浏览器打开文件时所采用的编码。
二、获取字符串byte数组时编码和打开文件时编码一致。
response.setHeader(“Content-Type”,“text/html;charset=UTF-8”);
os.write(“你好”.getBytes(“UTF-8”));
字符输入中文乱码问题 确定乱码
解决方法
一、设置response缓冲编码
二、设置浏览器打开文件所采用的编码
response.setCharacterEncoding(“UTF-8”);
response.setHeader(“Content-Type”,“text/html;charset=UTF-8”);
这2句能够简写成response.setContentType(“text/html;charset=UTF-8”);
案例
package cn.idcast.response; import java.io.IOException; import java.io.OutputStream; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class OutServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 解决字节中文乱码问题 记得解决乱码要写在前面 // OutputStream os = response.getOutputStream(); // response.setHeader("Content-Type", "text/html;charset=UTF-8"); // os.write("你好啊".getBytes("UTF-8")); // 解决字符中文乱码问题 记得解决乱码要写在前面 response.setContentType("text/html;charset=UTF-8"); response.getWriter().write("哈哈哈"); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } }
文件下载
一、先准备一个文件
二、读取文件,读入到输出流中
三、经过response读出到浏览器
四、设置头信息
Content-Disposition attachment;filename=文件名称
以附件的形式打开
代码
package cn.idcast.response; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import javax.servlet.ServletContext; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class DownloadServlet extends HttpServlet { // 实现文件的下载,以附件的形式 public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String path = getServletContext().getRealPath("/img/1.jpg"); /* * 这步是把文件路径设置让他不要写死了 好比文件是在c:\tomcat\1.jpg里面 */ String filename = null; int index = path.lastIndexOf("\\"); // 若是文件存在的话 if (index != -1) { filename = path.substring(index + 1); } // 设置头信息,"Content-Disposition", "attachment;filename=文件名称" response.setHeader("Content-Disposition", "attachment;filename=" + filename); // 获得文件的路径:绝对路径 InputStream is = new FileInputStream(path); OutputStream os = response.getOutputStream(); // 字节流 byte[] b = new byte[1024]; int len = 0; while ((len = is.read(b)) != -1) { os.write(b, 0, len); } is.close(); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } }
验证码案例
package cn.idcast.response; import java.awt.Color; import java.awt.Font; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.image.BufferedImage; import java.io.IOException; import java.util.Random; import javax.imageio.ImageIO; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; /* * 在内存中生成图片,由于没有方法设置背景颜色,因此要画一个填充的矩形,而且和画布的大小相同,矩形有颜色,最好要画个矩形边框 * 获取笔的对象(设置颜色、字体,画验证码) * 先准备好数据,随机生成4个字符,把字符画到纸上 * 画干扰线 * 把内存中的图片输出到客户端上。 * * */ public class DrawServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 在内存生成一张图片 int width = 100; int height = 50; BufferedImage bi = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); // 由于要用到弧度,因此用2D的画笔对象 Graphics2D g = (Graphics2D) bi.getGraphics(); g.setColor(Color.YELLOW); // 用矩形填充 g.fillRect(0, 0, width, height); g.setColor(Color.BLUE); // 画一个边框,由于旁边会重合,因此-1 g.drawRect(0, 0, width - 1, height - 1); // 得到验证码 String s = "qwertyuiopasdfghjjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM1234567890"; g.setColor(Color.BLACK); // 设置验证码的字体 g.setFont(new Font("宋体", Font.BOLD, 20)); Random r = new Random(); int x = 20; int y = 20; for (int i = 0; i < 4; i++) { // 获取角度和弧度 弧度的公式为:角度*π/180,角度在正负30之间 int jiaodu = r.nextInt(60) - 30; Double hudu = jiaodu * Math.PI / 180; g.rotate(hudu, x, y); // 获取验证码的下标 int index = r.nextInt(s.length()); // 返回指定下标位置的字符,随机获取下标 char ch = s.charAt(index); // 把验证码写到画布上 g.drawString("" + ch, x, y); // 由于字体旋转有可能会旋转到画布外面,因此要归零 g.rotate(-hudu, x, y); // 验证码得有间隔 x += 20; } // 设置干扰线 g.setColor(Color.RED); int x1, y1, x2, y2; // 干扰线的不能超出画布的位置 for (int i = 0; i < 4; i++) { x1 = r.nextInt(width); y1 = r.nextInt(height); x2 = r.nextInt(width); y2 = r.nextInt(height); g.drawLine(x1, y1, x2, y2); } // 把内存的图片输出到客户端中 ImageIO.write(bi, "jpg", response.getOutputStream()); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } }