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));
}
报错统一抛出异常。