【仿写tomcat】五、响应静态资源(访问html页面)、路由支持以及多线程改进

这篇具有很好参考价值的文章主要介绍了【仿写tomcat】五、响应静态资源(访问html页面)、路由支持以及多线程改进。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

访问html页面

如果我们想访问html页面其实就是将本地的html文件以流的方式响应给前端即可,下面我们对HttpResponseServlet这个类做一些改造

package com.tomcatServer.domain;

import com.tomcatServer.utils.ScanUtil;

import java.io.IOException;
import java.io.PrintWriter;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;

/**
 * http servlet响应
 *
 * @author ez4sterben
 * @date 2023/08/15
 */
public class HttpServletResponse {

    private final PrintWriter out;

    private static final String response;

    private static final String htmlResponse;

    public HttpServletResponse(PrintWriter out) {
        this.out = out;
    }

    static {
        response = "HTTP/1.1 200 OK\r\n" +
                "Content-Type: text/plain\r\n" +
                "\r\n";
        htmlResponse = "HTTP/1.1 200 OK\r\n" +
                "Content-Type: text/html\r\n" +
                "\r\n";
    }


    /**
     * 写
     *
     * @param content 内容
     */
    public void write(String content) {
        out.println(response + content);
    }

    /**
     * 编写html
     *
     * @param htmlFileName html文件名字
     * @throws IOException ioexception
     */
    public void writeHtml(String htmlFileName) throws IOException {
        Path path = Paths.get(ScanUtil.WEB_APP_PATH + "\\" + htmlFileName);
        byte[] bytes = Files.readAllBytes(path);
        out.println(htmlResponse + new String(bytes, StandardCharsets.UTF_8));
    }
}


writeHtml这个方法将会读取webApp下面的html文件,注意只读取下面一级文件中的html文件,然后将这个文件以二进制流的形式转换成字符串拼接到上面定义的html格式的响应头。

处理静态资源请求

当我们有了解析html文件的方法后,下面要做的就是处理静态资源,也就是判断一下请求路径中是否有.html这个字符串,有的话就把这次请求当做静态资源请求处理,没有的话再交给GET或者POST请求。这个逻辑将添加在SocketStore中,下面展示更改玩的SocketStore代码

package com.tomcatServer.socket;

import com.tomcatServer.domain.HttpServletRequest;
import com.tomcatServer.domain.HttpServletResponse;
import com.tomcatServer.utils.ScanUtil;
import com.tomcatServer.utils.ServletUtil;

import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Map;

/**
 * 套接字存储
 *
 * @author ez4sterben
 * @date 2023/08/15
 */
public class SocketStore {

    private static ServerSocket socket;

    public static void connect(Integer port) throws IOException {
        socket = new ServerSocket(port);
    }

    public static void close() throws IOException {
        socket.close();
    }

    public static ServerSocket getSocket() {
        return socket;
    }


    /**
     * 处理请求
     *
     * @throws IOException ioexception
     */
    public static void handleRequest(Socket accept) throws IOException {
        // 获取输入输出流
        BufferedReader in = new BufferedReader(new InputStreamReader(accept.getInputStream()));
        PrintWriter out = new PrintWriter(accept.getOutputStream(), true);
        // 定义字符串接收Http协议内容
        String inputLine;
        StringBuilder requestData = new StringBuilder();
        // 读取数据
        while ((inputLine = in.readLine()) != null && !inputLine.isEmpty()) {
            requestData.append(inputLine).append("\r\n");
        }
        // 解析request param
        String url = requestData.toString().split(" ")[1];
        // 处理静态资源
        if(url.contains(".html")){
            String staticSourceName = (url.split(".html")[0] + ".html").substring(1);
            HttpServletResponse response = new HttpServletResponse(out);
            response.writeHtml(staticSourceName);
        }else {
            // 处理GET与POST请求
            if (!requestData.toString().trim().equals("")){
                handleGetAndPostReuqest(in, out, String.valueOf(requestData));
            }
        }
        // 关闭资源
        accept.close();
    }

    /**
     * 处理post请求
     *
     * @param in          在
     * @param requestData 请求数据
     * @throws IOException ioexception
     */
    private static void handleGetAndPostReuqest(BufferedReader in,PrintWriter out, String requestData) throws IOException {
        // 解析request param
        String url = requestData.split(" ")[1];
        String[] urlContent = url.split("\\?");
        String requestPath = urlContent[0];
        String params = urlContent[1];
        String[] paramsKeyValue = params.split("=");

        // 设置请求参数
        HttpServletRequest request = new HttpServletRequest();
        Map<String, String> paramsMap = request.getParams();
        for (int i = 0; i < paramsKeyValue.length; i += 2) {
            paramsMap.put(paramsKeyValue[i],paramsKeyValue[i+1]);
        }
        if (requestData.contains("POST")) {
            // 解析request body
            int contentLength = Integer.parseInt(requestData.split("Content-Length: ")[1].split("\r\n")[0]);
            StringBuilder requestBody = new StringBuilder();
            for (int i = 0; i < contentLength; i++) {
                requestBody.append((char) in.read());
            }

            // 设置request body
            request.setRequestBody(String.valueOf(requestBody));

            // 设置响应内容
            HttpServletResponse response = new HttpServletResponse(out);
            ServletUtil.invokePost(requestPath,request,response);
        }
        if (requestData.contains("GET")){
            // 设置响应内容
            HttpServletResponse response = new HttpServletResponse(out);
            ServletUtil.invokeGet(requestPath,request,response);
        }
    }

}

访问测试

接下来我们在index.html里面写点东西并访问一下试试
【仿写tomcat】五、响应静态资源(访问html页面)、路由支持以及多线程改进,源码仿写,tomcat,html,java
http://localhost:8080/index.html
【仿写tomcat】五、响应静态资源(访问html页面)、路由支持以及多线程改进,源码仿写,tomcat,html,java

路由支持

其实刚才完成这个功能的时候就会发现,如何访问子目录里面的html呢?
这里其实就要写一个小方法来支持路由重定向了,下面编写一个HttpUtil

package com.tomcatServer.utils;

import com.tomcatServer.domain.HttpServletRequest;
import com.tomcatServer.domain.HttpServletResponse;

import java.io.IOException;

public class HttpUtil {

    private final String redirectPath;

    public HttpUtil(String redirectPath) {
        this.redirectPath = redirectPath;
    }
    public void forward(HttpServletRequest request, HttpServletResponse response) throws IOException {
        response.writeHtml(redirectPath);
    }
}

对HttpServletRequest做一些改进,提供一个加载静态资源的方法。

    public HttpUtil getStaticSource(String path){
        return new HttpUtil(path);
    }

其实这样我们的功能就完成了,写一个servlet以及html来测试一下

package tomcatProject.com.ez4sterben.servlet;

import com.tomcatServer.annotation.WebServlet;
import com.tomcatServer.domain.HttpServlet;
import com.tomcatServer.domain.HttpServletRequest;
import com.tomcatServer.domain.HttpServletResponse;

import java.io.IOException;

@WebServlet("/router")
public class RouterServlet extends HttpServlet {

    @Override
    public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
        request.getStaticSource("WEB-INF/page/"+request.getParam("path")+".html").forward(request, response);
    }

    @Override
    public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException {
        doGet(request, response);
    }
}

【仿写tomcat】五、响应静态资源(访问html页面)、路由支持以及多线程改进,源码仿写,tomcat,html,java
【仿写tomcat】五、响应静态资源(访问html页面)、路由支持以及多线程改进,源码仿写,tomcat,html,java
【仿写tomcat】五、响应静态资源(访问html页面)、路由支持以及多线程改进,源码仿写,tomcat,html,java

多线程改进

为什么要在这里谈多线程改进呢,其实是因为我们最近本的接收请求,响应请求,响应页面以及完成了,接下来要考虑的就是如何支持并发处理请求如何配置并发数如何配置端口等优化问题。

如果想实现并发处理请求的话,实际上只需要预先定义一个线程池即可,把处理请求的方法交给一个任务类并且实现Runnable接口,当然我们后面会再优化这种方案。

package com.tomcatServer.task;

import com.tomcatServer.socket.SocketStore;

import java.io.IOException;
import java.net.Socket;

public class RequestTask implements Runnable{

    private final Socket accept;

    public RequestTask(Socket accept) {
        this.accept = accept;
    }

    @Override
    public void run() {
        try {
            SocketStore.handleRequest(accept);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }
}

        ...
        public static ExecutorService threadPool;
        ...
		// 5.初始化线程池
        threadPool = Executors.newFixedThreadPool(10);

        // 6.处理http请求
        try {
            SocketStore.connect(PORT);
            while (true){
                Socket accept = SocketStore.getSocket().accept();
                if (accept != null){
                    threadPool.submit(new RequestTask(accept));
                }
            }
        } catch (IOException e) {
            throw new RuntimeException(e);
        }finally {
            SocketStore.close();
        }

【仿写tomcat】六、解析xml文件配置端口、线程池核心参数文章来源地址https://www.toymoban.com/news/detail-655776.html

到了这里,关于【仿写tomcat】五、响应静态资源(访问html页面)、路由支持以及多线程改进的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 04 SpringMVC响应数据之页面跳转控制+返回JSON数据+返回静态资源

    总结: 请求数据接收,我们都是通过handler的形参列表 前端数据响应,我们都是通过handler的return快速处理! https://blog.csdn.net/m0_59735420/article/details/128126514 什么是返回模板视图页面? 当http请求被controller中的handler处理时,有时需要指定响应的页面(返回本地的) 为什么要

    2024年01月18日
    浏览(40)
  • Linux中Tomcat发布war包后无法正常访问非静态资源

    在CentOS8中安装完WEB环境,首次部署WEB项目DEMO案例,发现可以静态的网页内容, 但是无法向后台发送异步请求,全部出现 404 问题,导致数据库数据无法渲染到界面上。 CentOS请求中提示 用来获取资源的连接不安全 因为使用的 HTTP 协议访问的项目 不安全是正常的,请暂时忽略

    2024年02月09日
    浏览(50)
  • 【仿写tomcat】四、解析http请求信息,响应给前端,HttpServletRequest、HttpServletResponse的简单实现

    在解析请求之前我们要思考一个问题,我们解析的是其中的哪些内容? 对于最基本的实现,当然是 请求类型 , 请求的url 以及 请求参数 ,我们可以根据请求的类型作出对应的处理,通过url在我们的mapstore中找到servlet, 那么请求的参数我们是不是还没有储存的地方呢? 所以

    2024年02月12日
    浏览(40)
  • c#使用webView2 访问本地静态html资源跨域Cors问题

    在浏览器中访问本地静态资源html网页时,可能会遇到跨域问题如图。   是因为浏览器默认启用了同源策略,即只允许加载与当前网页具有相同源(协议、域名和端口)的内容。 WebView2默认情况下启用了浏览器的同源策略,即只允许加载与主机相同源的内容。所以如果我们把

    2024年02月20日
    浏览(48)
  • express静态资源访问错误 xxx.js was blocked due to MIME type (“text/html“)

    归根结底原因是没有静态资源xxx.js的访问权限 如何在express中给静态资源添加访问权限,我在express js中添加以下语句解决了该问题: 此时访问public文件夹中的xxx.js文件时,只需要使用路径 http://127.0.0.1/xxx.js 即可访问,路径中不需要带public ---------------------------------------------

    2024年02月22日
    浏览(47)
  • c#使用webView2 访问本地静态html资源跨域Cors问题 (附带代理服务helper帮助类)

    在浏览器中访问本地静态资源html网页时,可能会遇到跨域问题如图。   是因为浏览器默认启用了同源策略,即只允许加载与当前网页具有相同源(协议、域名和端口)的内容。 WebView2默认情况下启用了浏览器的同源策略,即只允许加载与主机相同源的内容。所以如果我们把

    2024年02月21日
    浏览(42)
  • HTML+CSS仿写京东页面附代码(web前端大作业)

    学习前端时间不多,看了两晚上就开始赶实训作业,大家看看就行 先来看看效果:         相关资源可以在主页资源查看

    2024年02月11日
    浏览(58)
  • Tomcat无法加载Web项目部署后的静态页面(Caused by: java.lang.IllegalArgumentException: 指定的主资源集[X:XXXX]无效 || 子容器启动失败)

    问题截图: 问题原因: 此种情况一般来讲是 docBase 与 path 的路径有一方是正确路径而另一方路径出错导致的,访问到前面的路径是正确的自然Console是不报错的,如此才会使得资源访问会出现404的问题。 解决方案:  1、在Servers中找到server.xml文件,拉到下方重新统一正确的路

    2024年02月07日
    浏览(62)
  • Tomcat加载静态资源--防止SpringMVC拦截

    最简洁方式:使用API 在配置文件下写配置类SpringMvcSupport,并且让SpringMVC扫描到此文件夹@ComponentScan({\\\"com.itheima.controller\\\",\\\"com.itheima.config\\\"}) SpringMvcSupport配置类如下 步骤: 1、在config文件下写SpringMvcConfig配置类 2、在SpringMvcConfig也就是SpringMVC核心配置类中扫描到此文件夹,那么此

    2024年02月10日
    浏览(38)
  • SpringBoot访问静态资源和jar外部静态资源,部署前端打包后的vue项目放入静态资源里

    记录一下使用SpringBoot访问静态资源和SpringBoot打包之后的jar外部静态资源,在开发的时候,一般选择前后端分离的方式,前端使用vue 后端使用SpringBoot,通常情况下,部署都是前端通过http去请求后端资源,涉及到http请求,那么肯定需要资源的目标地址IP,一般云端部署给到I

    2024年02月09日
    浏览(75)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包