这篇文章主要讲解了“Javaweb的Response对象怎么使用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Javaweb的Response对象怎么使用”吧!
response的理解概述:
与request相对,response对象是设置响应消息。在浏览器按下F12键–点击网络–ctrl+R: 可以查看用户在浏览器端每次操作时浏览器向服务器发送的响应消息。
response的使用概述:
response作为tomcat服务器已实现的对象,最直接的用法就是在servlet类中调用response对象的方法,response对象的功能是设置响应消息,所以方法的总体逻辑就是设置响应消息,这类方法的关键在于对响应消息的理解。
reponse对象设置响应消息的方法: -setStatus(int sc):设置状态码 -setHeader(String name, String value) :设置响应头 设置响应体的方法: -PrintWriter getWriter():获取字符输出流对象 -ServletOutputStream getOutputStream():获取字节输出流对象 重定向方法: -sendRedirect(String Path): 资源跳转
redirect(重定向)和forward(转发)同为资源跳转方法,但有所区别:
* 重定向的特点: redirect
1. 跳转后地址栏发生变化:
2. 重定向可以访问项目外其他站点(服务器)的资源
3. 重定向是两次请求。前后Servlet下的request对象不能共享数据
* 转发的特点:forward
1. 转发地址栏路径不变 :
2. 转发只能访问当前服务器下的资源
3. 转发是一次请求,可以使用request对象来共享数据
跳转资源需要确定跳转后资源的路径,分为相对路径和绝对路径。
通过相对路径不可以确定唯一资源,使用相对路径需要找到当前资源和目标资源之间的相对位置关系,比如:./ 表示当前目录,../ 表示后退一级目录;
通过绝对路径可以确定唯一资源,绝对路径以/开头的路径,比如:/day15/responseDemo2即http://localhost/day15/responseDemo2。 如果资源跳转的请求是由客户端浏览器发出比如:***,则项目的绝对路径需要加虚拟目录;如果是由服务器端发出比如:sendRedirect(),则可加可不加。
response的测试代码:
/**运行前提: *1.备好responseTest2资源 *2. */ /**responseTest1:重定向资源跳转:使访问responseTest1资源会自动跳转到responseTest2资源 * 1.动态获取虚拟目录 * 2.通过request对象设置共享数据到request域中 * 3.调用以跳转资源为参数的重定向方法 */ @WebServlet("/responseTest1")public class ResponseDemo1 extends HttpServlet { protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //1. String contextPath = request.getContextPath(); //2. request.serAttribute("msg","hello Test2, I come from Test1."); //3. response.sendRedirect(contextPath+"/responseTest2"); //response.sendRedirect("http://www.baidu.com"); //sendRedirect方法可跳转到项目外的资源 //response.sendRedirect("location","/responseTest2");//以静态虚拟目录作为参数 /* 初始重定向资源跳转方式:设置状态码,响应头。又因为"302""location"取固定值,可直接调用方sendRedirect(响应头的值)。 response.setStatus(302);//设置状态码为302 response.setHeader("location","/MyTest/responseTest2");//设置响应头location = /MyTest/responseTest2 */ /*响应状态码:服务器告诉客户端浏览器本次请求和响应的一个状态。 1. 状态码都是3位数字 2. 分类: 1. 1xx:服务器接受客户端消息,但没有接受完成,等待一段时间后,发送1xx多状态码 2. 2xx:成功。代表:200 3. 3xx:重定向。代表:302(重定向),304(访问缓存) 4. 4xx:客户端错误。 * 代表: * 404(请求路径没有对应的资源) * 405:请求方式没有对应的doXxx方法 5. 5xx:服务器端错误。代表:500(服务器内部出现异常) */ } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { this.doPost(request,response); } }
/**ResponseTest2:服务器输出字符数据到浏览器 *1.设置编码,并告诉浏览器编码类型 *2.获取字符输出流 *3.输出数据 */@WebServlet("/responsTset2")public class ResponseTest1 extends HttpServlet { protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //1.再获取输出流之前设置编码,并告诉浏览器使用的编码,避免编码解码码表不一致出现乱码问题 response.setContentType("text/html;charset=utf-8"); //response.setHeader("content-type","text/html;charset=utf-8");通过消息头"content-type"设置字符流编码并告诉浏览器 // response.setCharacterEncoding("utf-8"); 仅仅设置字符流编码格式,不能保证与浏览器默认解码格式统一 //2.获取字符输出流,默认情况下获取字符流的编码是tomcat实现的ISO-8859-1,所以需要提前设置 PrintWriter pw = response.getWriter(); //3.输出数据 String msg ="hello Test2, I don't come from Test1." //String msg = (String)request.getAttribute("msg");错于重定向是两次请求,不能通过request共享数据 // pw.write(msg); //pw.write("<h1>msg</h1>"); } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { this.doPost(request,response); } }
/**ResponseTest3: * 1.设置编码,并告诉浏览器编码类型 * 2.获取字节输出流 * 3.输出数据 */@WebServlet("/responseTest3")public class ResponseTest3 extends HttpServlet { protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //1. response.setContentType("text/html;charset=utf-8"); //2. ServletOutputStream sos = response.getOutputStream(); //3. sos.write("你好".getBytes("utf-8")); } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { this.doPost(request,response); } }
基于response的验证码的案例代码:
/**CheckCodeServlet:验证码 *1.在内存中创建图片(验证码图片对象) *2.美化图片 * 2.1 填充背景图 * 2.2 画指定颜色边框 * 2.3 生成验证码 * 2.4 画干扰线 *3.将图片输出到页面展示 */@WebServlet("/checkCodeServlet")public class CheckCodeServlet extends HttpServlet { protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { int width = 100; int height = 50; //1.在内存中创建一个指定宽高,背景色为黑色的图片对象 BufferedImage image = new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB); //BufferedImage image = new BufferedImage(width,height,BufferedImage.TYPE_INT_ARGB);创建一个带透明色的对象,最后一个参数调节灰度 //2.用代码画图的步骤逻辑和“画图工具”鼠标点击画图一样 //2.1 代码“获取画笔--设置画笔颜色--填充图片背景色”相当于鼠标“点击画笔--选择画笔颜色--点击图片填充颜色” Graphics g = image.getGraphics();//获得画笔 g.setColor(Color.PINK);//设置画笔颜色 g.fillRect(0,0,width,height); //填充图片颜色 //2.2代码“设置边框颜色--设置边框起始位置和长宽幅度”相当于鼠标“点击选择边框起始位置--拖动鼠标确定最终边框大小” g.setColor(Color.BLUE); //设置边框颜色 g.drawRect(0,0,width - 1,height - 1); //设置边框起始坐标和长宽像素,注意边框占一个像素 //2.3 String str = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghigklmnopqrstuvwxyz0123456789"; Random ran = new Random(); for (int i = 1; i <= 4; i++) { int index = ran.nextInt(str.length());//生成随机角标 char ch = str.charAt(index);//获取随机角标对应的字符 g.drawString(ch+"",width/5*i,height/2);//在图片上写验证码 } //2.4 g.setColor(Color.GREEN); // //随机生成干扰线的始末点坐标,并连接成干扰线 for (int i = 0; i < 10; i++) { int x1 = ran.nextInt(width); int x2 = ran.nextInt(width); int y1 = ran.nextInt(height); int y2 = ran.nextInt(height); g.drawLine(x1,y1,x2,y2); } //3.将图片响应给客户端 ImageIO.write(image,"jpg",response.getOutputStream()); } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { this.doPost(request,response); } }