Response笔记

笔记内容的发布主要是怕哪天自己的电脑挂了 之前总结的笔记会丢,所以在这个网站晒出来作为备份,笔记的内容也是自己对此技术的粗浅理解,仅供自己观看,并不能保证全部理解都是正确,还需网友观看时自行鉴别 谢谢
`

Response对象

Response 响应消息:服务器端发送给客户端的数据

  • 功能:设置响应消息
    1. 设置响应行:格式:HTTP/1.1 200 ok

    2. 设置状态码:setStatus(int sc)

    3. 设置响应头:setHeader(String name, String value)

    4. 设置响应体

使用步骤:

1.获取输出流 然后使用输出流,将数据输出到客户端浏览器

字符输出流:PrintWriter getWriter()由于这个方法获取的流默认编码的ISO-8859-1
所以要在获取流之前设置response.setContentType("text/html;charset=utf-8");
字节输出流:ServletOutputStream response.getOutputStream()

        //1 设置状态码为302
               response.setStatus(302);
        //2 设置响应头location
               response.setHeader("location","/responseDemo2");

简单的重定向方法:

访问Demo1时 自动重定向到Demo2

response.sendRedirect("重新定向的访问路径");

redirect 重定向特点:
1 重定向地址栏发生变化
2 重定向可以访问自身服务器以外的其他网站
3 重定向是两次请求 不能使用request对象来共享数据

forward 转发的特点:
1 转发地址栏不会改变
2 转发只能访问当前服务器下的资源
3 转发是一次请求 可以使用request对象来共享数据

***************************添加的笔记********************************
	重定向的特点:redirect	
	转发的特点:forward
	相同点:转发和重定向都可以实现资源跳转
	不同点: 转发是一次请求一次相应
			重定向是两次请求两次相应
			
			转发浏览器地址栏不会发生变化
			重定向浏览器地址栏会发生变化
			
			转发可以使用request域对象
			重定向不可以使用request域对象
			
			转发只能在服务器内部跳转
			重定向可以跳转到任意资源
			
			转发不能写工程名
			重定向必须要写工程名

路径写法:

相对路径:无法确定路径是否是唯一资源的一种路径。就是找到当前资源和目标资源的相对位置关系。
如:./index.html 不以 / 开头,是以 . 开头的路径
./: 当前目录
../:后退一级目录
绝对路径:通过绝对路径可以确定唯一的资源。
如: localhost/day15/responseDemo2
/day15/responseDemo2 /开头的路径

问:如何判断定义的路径是给谁使用?
:判断请求将来从哪儿发出去
1 给客户端浏览器使用:需要加虚拟目录(项目的访问路径)建议使用动态获取 方法在下方。
一般<a><form> 重定向 都是需要加虚拟目录的
2 给服务器使用:内部请求 不需要加虚拟目录

******************************添加笔记*********************************
HTML页面中路径
	如果引用的是CSS  js  图片 静态资源建议使用相对路径
	如果引用的是servlet 建议使用绝对路径
	
	jsp页面中不管引用的是什么资源 都建议使用绝对路径
	sevrlet中写路径不管是什么资源 都建议写绝对路径 除了转发不能写工程名
	
	绝对路径:
	服务器路径:服务器内部调转不需要加工程名,列子:请求转发
	客户端路径:从客户端发出来的请求内容都需要加工程名。
	
	什么时候使用转发 什么时候用重定向呢?
	答:在进行资源跳转之前 看有没有使用request域对象,如果用了就必须转发 如果没用request域对象两个都可以用,建议用重定向
	
	绝对路径:/工程名称/资源路径(资源名称)

获取动态虚拟目录的方法:

//动态获取虚拟目录
String contextPath = request.getContextPath();
//把获取的动态虚拟目录在重定向里进行拼接
response.sendRedirect(contextPath +"/拼接的最后路径");

服务器输出字符数据到浏览器

@WebServlet("/responseDemo2")
public class ResponseDemo2 extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //通过响应头 告诉浏览器用utf-8来解析我给你发的东西
        //简化版本字符输出流中文乱码解决代码:
        response.setContentType("text/html;charset=utf-8"); 
        // 1 获取字符输出流
        PrintWriter pw = response.getWriter();
        //2 获取字符输出流数据
        pw.write("Hello response");
    }

因为response是由TomCat实现的 而TomCat是由外国人用拉丁编码写的 所以输出中文就会报错
需要用 response.setContentType("text/html;charset=utf-8");通过这句Cintent-type 来告诉响应头 浏览器用这个来解析后台传过来的文字

2 服务器输出字节数据到浏览器

Servlet("/responseDemo2")
public class ResponseDemo2 extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //简化版本字符输出流中文乱码解决代码:
        response.setContentType("text/html;charset=utf-8");
        //1 获取字节输出流
        ServletOutputStream sos = response.getOutputStream();
        //2 输出数据
        sos.write("你好".getBytes("utf-8"));
    } 

3 验证码

BufferedImageImage的一个子类,ImageBufferedImage的主要作用就是将一副图片加载到内存中。BufferedImage生成的图片在内存里有一个图像缓冲区,利用这个缓冲区我们可以很方便的操作这个图片,通常用来做图片修改操作如大小变换、图片变灰、设置图片透明或不透明等。

能看懂就行
@WebServlet("/checkcodeServlet")
public class CheckcodeServlet extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        // 声明图片的长宽高
        // 宽100xp 高50xp
        int width = 100;
        int height = 50;
        //1 创建对象,验证码图片对象
        BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);

        //2 美化图片    获取画笔对象
        Graphics g = image.getGraphics();
        //设置画笔颜色
        g.setColor(Color.DARK_GRAY);
        //填充一个矩形也就是背景色
        g.fillRect(0, 0, width, height);

        //画边框
        g.setColor(Color.red);
        g.drawRect(0, 0, width - 1, height - 1);
        //随机数生成
        String str = "abcdABCD1234";
        //生成随机角标
        Random ran = new Random();
        //获取字符
        for (int i = 0; i <= 4; i++) {
            int index = ran.nextInt(str.length());
            char ch = str.charAt(index);
            g.drawString(ch + "", width / 5 * i, height / 2);
        }

        //画干扰线
        g.setColor(Color.GREEN);
        //随机生成坐标点
        int x1 = ran.nextInt(width);
        int x2 = ran.nextInt(width);
        int x3 = ran.nextInt(width);
        int x4 = ran.nextInt(width);
        g.drawLine(1, 1, 30, 20);
        //3 将图片输出到页面展示
        ImageIO.write(image, "JPG", response.getOutputStream());
    }
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request, response);
    }
}

ServletContext对象:

概念:代表整个web应用,可以和程序的容器(服务器)来通信
功能:
1获取MIME类型(MIME是互联网通信过程中一种文件数据类型)
格式:大类型/小类型 比如之前响应头常见的text/html就是典型的MIME类型
2域对象共享数据
3获取文件真实(服务器)路径

**获取文件真实路径/读取文件流:它俩是相等的 一模一样。

//方法1 :通过request对象获取
ServletContext context1  = request.getServletContext();

//方法2:HttpServlet获取
ServletContext context2  = this.getServletContext();

1 获取MIME类型(MIME是互联网通信过程中一种文件数据类型)

@WebServlet("/servlet")
public class Servlet extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // 1 获取HttpServlet对象
        ServletContext context = this.getServletContext();
        //2 定义一个文件名
        String filename ="a.jpg";
        //3 获取MIME类型
        String mimeType = context.getMimeType(filename);
        System.out.println(mimeType);
    }
-------------------------------------
    //结果是:image/jpeg

2域对象共享数据 String getMimeType(String file)

ServletContext对象范围:所有用户所有请求的数据 谨慎使用

.setAttribute(String name,Object value).getAttribute(String name).removeAttribute(String name)

3获取文件真实(服务器)路径

方法:String getRealPath(String path)  

String b = context.getRealPath("/b.txt");
	//web目录下资源访问
    System.out.println(b);

   String c = context.getRealPath("/WEB-INF/c.txt");
	//WEB-INF目录下的资源访问
   System.out.println(c);

   String a = context.getRealPath("/WEB-INF/classes/a.txt");
	//src目录下的资源访问
   System.out.println(a);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值