目录
[编辑 3.实验](#编辑 3.实验)
①先运行MyTomcat,时刻捕捉4747端口(以4747为例)的请求:
引入
在先前的学习中,tomcat已经实现了大半部分,即获取请求以及做出request处理,接下来就是处理response(在先前的学习中都是虚拟模拟的空,现在来处理一下response这一块。)
一、前端项目容器的搭建
既然是返回,那么返回的数据包括且不限于是HTML文件,动态资源servlet等等,但是目前的Java项目并不支持前端界面HTML的承载,那么就需要重建这么一个能承载HTML文件的项目。
重建项目:
1.创建一个新的项目:
选择Maven后什么都不点,点击下一步:
这里可以改变它的创建路径:
随后点击完成,点击确认新窗口打开,就会进到这里面来。
2.创建HTML文件
此时,这个窗口就可以编写HTML前端文件了,可以正常编写前端代码:
编写如下代码,接着我们用tomcat实现获取这个静态HTML文件:
3.将先前编写的所有tomcatJava文件挪过来
copy后挪过来:
二、配置java文件
1.重启一下MyTomcat
确定copy到这个项目后,依旧能够正常使用:
2.配置两个工具包
①FileUtil
这个文件主要用于处理文件和流:
java
import java.io.*;
/**
* 该类的主要作用是进行读取文件
*/
public class FileUtil {
public static boolean writeFile(InputStream inputStream, OutputStream outputStream){
boolean success = false ;
BufferedInputStream bufferedInputStream ;
BufferedOutputStream bufferedOutputStream;
try {
bufferedInputStream = new BufferedInputStream(inputStream);
bufferedOutputStream = new BufferedOutputStream(outputStream);
bufferedOutputStream.write(ResponseUtil.responseHeader200.getBytes());///
int count = 0;
while (count == 0){
count = inputStream.available();
}
int fileSize = inputStream.available();
long written = 0;
int beteSize = 1024;
byte[] bytes = new byte[beteSize];
while (written < fileSize){
if(written + beteSize > fileSize){
beteSize = (int)(fileSize - written);
bytes = new byte[beteSize];
}
bufferedInputStream.read(bytes);
bufferedOutputStream.write(bytes);
bufferedOutputStream.flush();
written += beteSize;
}
success = true;
} catch (IOException e) {
e.printStackTrace();
}
return success;
}
public static boolean writeFile(File file,OutputStream outputStream) throws Exception{
return witeFile(new FileInputStream(file),outputStream);
}
/**
* 获取资源地址
* @param path
* @return
*/
public static String getResoucePath(String path){
String resource = FileUtil.class.getResource("/").getPath();
return resource + "\\" + path;
}
}
②ResponseUtil(响应头)
java
public class ResponseUtil {
public static final String responseHeader200 ="HTTP/1.1 200 \r\n"+
"Content-Type:text/html \r\n"+"\r\n";;
public static String getResponseHeader200(String context){
return "HTTP/1.1 200 \r\n"+
"Content-Type:text/html \r\n"+"\r\n" +context;
}
}
三、处理Response文件
【注意注释】
在注释中做了详细解释:
输出流相关看这里:搭建Tomcat(一)---Socket&ServerSocket_serversocket(int porti nt backlog)-CSDN博客
Response内编写内容:
java
import com.my.tomcat.util.FileUtil;
import java.io.File;
import java.io.IOException;
import java.io.OutputStream;
import java.nio.charset.StandardCharsets;
public class Response {
//打开输出流
private OutputStream outputStream;//设置为private,这个输出流只能由这个类自己内部使用
//初始化输出流
/*
* 输入输出流都来源于socket,那么这里初始化的outputStream究竟是什么
* 就取决于MyTomcat中传进来的socket.getOutputStream是什么了
* */
public Response(OutputStream outputStream){
this.outputStream=outputStream;
}
//对静态资源输出
public void wirthHtml(String path) throws Exception {
/*
getResoucePath()是工具类FileUtil中获取完整路径的方法
其内部主要用了getResource()方法--根据当前类的位置来定位资源文件
*/
String resourcePath= FileUtil.getResoucePath(path);
System.out.println("resourcePath="+resourcePath);//打印一下
File file=new File(resourcePath);//让这个完整路径做一个输出
if(file.exists()){
System.out.println("静态资源存在!");
FileUtil.writeFile(file,outputStream);//有则输出
}else{
System.out.println("404");//查不到这个静态资源,返回404
}
}
public void wirth(String context) throws IOException {
outputStream.write(context.getBytes());
/*
将输出流的数据进行处理--write类同于PrintStream中的处理
只是这里传输的是HTML文件,所以用outputStream自带的write方法即可
*/
}
}
File
File
文件(或更准确地说,File
类的实例)并不直接承载文件的内容,而是承载了与文件系统中的一个文件或目录相关的路径名和其他元数据(如大小、修改时间等)的抽象表示。
File
主要被用于表示文件和目录(也被称为文件夹)的路径名,虽然File
类本身并不直接处理文件内容的读写,但它确实提供了丰富的功能来管理和操作文件系统中的文件和目录。
四、处理MyTomcat
在这之前,MyTomcat中的response一直以来只是一个空的,用于模拟的,现在我们已经完善了response的代码,那么接着去更改MyTomcat中有关response的代码,来合理化tomcat:
1.处理扫描资源的方法
在这之前,我们只做了对动态资源映射表的检索去查找动态资源,这里我们添加else:
使得if的动态资源没找到的情况下,转去检索静态资源:
2.处理Response实例
response照常创建:
那么在哪里给response赋值呢?
在这个方法中借socket来获取outputStream,并将其放进初始化的Response中;
3.实验
完成上述操作后,就可以去客户端(浏览器)试验正确性了:
①先运行MyTomcat,时刻捕捉4747端口(以4747为例)的请求:
【注:上面的"类名:"是动态资源】
②客户端搜索:
③回车后得到结果:
处理成功。
五、完善动态资源的检索
MyWeb下的文件:
【注意:这里的子类抛出异常了,那么父类的HttpServlet也要抛出异常】
此时再去客户端检验,中文和符号会出乱码(正常):
以上就是一个简单的,完全体tomcat搭建过程。