【Tomcat】第六站(最后一站啦!):数据的返回

发布于:2024-12-22 ⋅ 阅读:(19) ⋅ 点赞:(0)

1. 引言   

        前端资源比如html页面,进行返回。截止到目前我们写的项目架构不支持前端页面(静态资源 )。

2. 数据的返回

2.1 准备

        为了能够写前端页面,新建一个项目。选择Maven项目,下一步,下一步。

        加载完成之后,在Resources下新建一个html。

写一个index.html,

        把原来写的资源拷贝过来,启动测试一下。

输出结果没问题,说明当前构建的项目框架没问题。

没问题我们想办法让他访问静态资源。


2.2 静态资源访问

        静态资源的访问涉及到数据的返回。要想给浏览器返回数据,目前只是在下面进行打印,还不能将数据返回给浏览器,浏览器返回的是个空状态。

        我们知道,一个完整的http请求包含请求和响应两部分,就是当前浏览器把请求打到tomcat服务器上,然后tomcat同样也需要把数据返回给浏览器,这是一个完整的http请求。

         目前http请求不完整,只是有请求,能接收到并解析数据。

我们想要输出静态资源的时候,怎样输出静态资源?

response

返回数据用response。

* 接收数据打开了inputstream,这是输入流。想要输出首先打开输出流。

* 创建对象的时候,需要生成构造函数。

* 需要一个工具类FileUtil,与I/O相关(每一行代码去读取,是能够帮助数据转换成二进制进行传输  --->  当前html代码是一个文件形式,在网络上传输文件形式非常麻烦。于是用输入输出的方式把文件转换成相应的二进制形式,通过二进制形式对数据进行传输。

* 想要输出静态资源,少不了FileUtil的支持,调用它的getResourcePath()方法,把访问路径放进去。---->获取当前访问路径。

FileUtil.getResoucePath(path);

默认给定的访问路径是index.html

        但是这并不是完整路径,需要用getResourcePath方法获取资源地址,将其转换成完整的路径,再将路径进行输出。

        如果文件存在,说明访问的静态资源文件是存在的,存在就返回数据。

File file=new File(resourcePath);
if(file.exists()){//访问的静态资源文件是存在的
    System.out.println("静态资源存在");
    FileUtil.writeFile(file,outputStream);
}else{
    System.out.println("静态资源不存在");
}

  $ 尝试对静态资源做真正的输出。

        要想输出,首先需要从Socket那里获取当前输出流。在Socket创建输出流对象,并且把输出流传进去。

public static void handler(Socket socket) throws Exception {
    //读取请求的数据
    InputStream inputStream = socket.getInputStream();

    response=new Response(socket.getOutputStream());//先创建对象
    requestContext(inputStream);
}

不是动态资源,就是静态资源访问。

if(!request.getPath().equals("")){//不是空请求
    if(ServletConfigMapping.classMap.get(request.getPath())!=null){//当前请求地址能否从classMap中查找到
        Class<HttpServlet> ClassServlet=ServletConfigMapping.classMap.get(request.getPath());//获取类对象
        HttpServlet servlet=ClassServlet.newInstance();//根据获取到的类对象,创建对应的对象  用父类去接,多态(父类的引用指向子类的对象)
        servlet.service(request,response);//调用HttpServlet的service方法,判断是get请求还是post请求
    }else{
        response.wirthHtml(request.getPath());
    }
}

启动tomcat,启动之后,浏览器访问。

总结:

        首先在response中写好相关的方法,首先全局变量输出流,这个输出流只能是Socket生成。

        抽取到输出流之后,当访问动态资源没有访问到,访问静态资源,假设静态资源存在,返回静态资源。

        浏览器访问静态资源,目前浏览器还是没有返回静态资源内容,因为还不成熟

为什么访问不到?

        请求数据,返回数据都需要请求头和返回头。

        响应的话,也需要一定的格式。

当前html页面需要格式。(当前ResponseUtil工具类中有格式)。

此时再访问,浏览器能够访问到html资源。

 


  2.3 动态资源返回

          当前动态资源返回信息也可。在动态资源里定义模拟标签即可。

String context="<h1>MyFirstServlet实现了</h1>";

 封装上响应头。

response.wirth(ResponseUtil.getResponseHeader200(context));//封装上响应头

数据的返回还需要response,在response里写方法返回。

public void wirth(String context) throws IOException {
    outputStream.write(context.getBytes(StandardCharsets.UTF_8));
}

         报错统一抛出异常。