response对象
在Servlet中可以使用的内置对象主要有:request、response、application、session、out(PrintWriter)。
ServletResponse简介
定义辅助 servlet 将响应发送到客户端的对象。servlet 容器创建 ServletResponse 对象,并将它作为参数传递给 servlet 的 service 方法。 要发送 MIME 正文响应中的二进制数据,请使用 getOutputStream 返回的 ServletOutputStream。要发送字符数据,请使用 getWriter 返回的 PrintWriter 对象。
HttpServletResponse介绍
扩展 ServletResponse 接口以提供特定于 HTTP 的发送响应功能。例如,该接口拥有访问 HTTP 头和 cookie 的方法。 客户端向服务器发起的都是HTTP协议操作,所以我们大部分使用HttpServletResponse对象作为直接操作对象!
HttpServletResponse 常用API介绍
方法名称 | 作用 |
---|---|
setStatus(int code) | 设置响应状态码:200 成功 302 临时重定向 304 处理缓存 404 Not Found没有找到资源,500 服务器错误 |
setHeader(name,value) | 设置响应信息头 |
setCharacterEncoding(String); | 设置编码格式 |
setContentType(String) | 设置返回数据mimetype |
getWriter() | 获取字符输出流 |
getOutputStream() | 获取字节输出流 |
设置返回字符编码格式
-
方案1
response.setCharacterEncoding("utf-8"); 设置tomcat编码格式 <html> <head> <meta charset="utf-8"> <title>xxx</title> </head> <body>编写返回的文本内容</body> </html> 设置浏览器解析文本内容格式
可以解决返回字符串乱码问题,但是需要将返回的字符串封装到html代码中.操作繁琐!
-
方案2
response.setHeader("Content-type","text/html;charset=UTF-8")
方案按相对简单,通过设置响应头告知浏览器解析字符串的编码格式!
-
方案3(推荐)
response.setContentType("text/html;charset=UTF-8")
利用setContentType这种综合性的写法解决问题!此方法也是开发中常用的方法!方便!
response练习
-
用户下载服务器图片
public class DownLoadServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { /** * 别人访问我 我给你一张图片 * * 1.获取图片的输入流 * 2.response的字节输出流 */ //1.获取图片或者文件的输入流 //想要或某个文件 你必须知道绝对路径 //手段: 项目中的相对路径 去获取绝对路径 //ServletContext getRealPath 相对路径转成绝对路径 String path = getServletContext().getRealPath("/img.jpg"); System.out.println(path); //文件输入流 FileInputStream stream = new FileInputStream(path); String filename = path.substring(path.lastIndexOf(File.separator)+1); //文件名编码 filename = URLEncoder.encode(filename,"UTF-8"); //设置响应头 //content-disposition", "attachment;filename="+filename //下载用的 attachment下载: filename下载文件的名字 response.setHeader("content-disposition", "attachment;filename="+filename); //根据文件名字的后缀名获取类型 String mimetype = getServletContext().getMimeType(filename); response.setContentType(mimetype); //下载文件的类型 ServletOutputStream outputStream = response.getOutputStream(); byte [] buffer = new byte [8*1024]; int len = 0; while((len=stream.read(buffer)) != -1){ outputStream.write(buffer, 0, len); } stream.close(); } }
-
页面中添加验证码
- 项目中添加第三方jar包validatecode.jar
- 创建返回验证码的servlet!
public class CodeServlet extends HttpServlet { /** * The doGet method of the servlet. <br> * This method is called when a form has its tag value method equals to get * @param request the request send by the client to the server * @param response the response send by the server to the client * @throws ServletException if an error occurred * @throws IOException if an error occurred */ public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //1.设置生成规则 /** * width:验证码的宽度 px 像素 * height: px * codeCount:生成验证码有几个数 * lineCount:有几根线 */ ValidateCode code = new ValidateCode(200, 50, 6, 20); //2.获取生成的验证码的字符串值 System.out.println(code.getCode()); //获取正确值 //3.响应写回验证图片 code.write(response.getOutputStream()); } }
- 页面中使用当前servlet
<!DOCTYPE html> <html> <head> <title>login.html</title> <meta name="keywords" content="keyword1,keyword2,keyword3"> <meta name="description" content="this is my page"> <meta name="content-type" content="text/html; charset=UTF-8"> <!--<link rel="stylesheet" type="text/css" href="./styles.css">--> </head> <body> <form action="/Day11_Response1/servlet/LoginServlet" method="post"> <input type="text" name="username" placeholder="请输入账号!" /> <input type="submit" value="登录"/> </form> <img src="/Day11_Response1/servlet/CodeServlet" onclick="changeCodes()" alt="验证码" title="验证码"/> <a href="javascript:changeCodes()" >看不清?</a> <script type="text/javascript"> function changeCodes(){ var img= document.getElementsByTagName("img")[0]; img.src = "/Day11_Response1/servlet/CodeServlet?r="+Math.random(); } </script> </body> </html>