Tomcat第一课--构建简单静态资源访问

Tomcat:eclipse中启动tomcat访问服务器外部静态资源 ----------------环境及配置----------------- 服务器:阿里云 操作系统:Windows 配置:CPU 2G 开发工具:eclipse web服务器:tomcat ---------------------------------------------   --------------关于tomcat配置访问服务器外部磁盘资源--------- 打... 阅读详情
    最近在看《深入剖析TOMCAT》这本书,跟着书边看边学,试着搭搭tomcat,主要是试着了解思想~
    首先,单纯的只是访问静态资源————比如Html,只需要三个类就可以:
    HttpServer、Reuest、Response
其实单看架构跟一些互联网项目是有类似的地方的。

1.HttpServer

package com.draz.ex01;

import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;

/**
 * Created by Drazen on 2017/2/24.
 */
public class HttpServer {
    public static final String WEB_ROOT =
            System.getProperty("user.dir") + File.separator  + "web";
    // shutdown command
    private static final String SHUTDOWN_COMMAND = "/SHUTDOWN";

    // the shutdown command received
    private boolean shutdown = false;

    public static void main(String[] args) {
        HttpServer server = new HttpServer();
        server.await();
    }

    public void await() {

        ServerSocket serverSocket = null;
        int port = 8001;
        try {
            serverSocket =  new ServerSocket(port, 1, InetAddress.getByName("127.0.0.1"));
        }
        catch (IOException e) {
            e.printStackTrace();
            System.exit(1);
        }

        // Loop waiting for a request
        while (!shutdown) {
            Socket socket = null;
            InputStream input = null;
            OutputStream output = null;
            try {
                socket = serverSocket.accept();
                input = socket.getInputStream();
                output = socket.getOutputStream();

                // create Request object and parse
                Request request = new Request(input);
                request.parse();

                // create Response object
                Response response = new Response(output);
                response.setRequest(request);
                response.sendStaticResource();

                // Close the socket
                socket.close();

                //check if the previous URI is a shutdown command
                shutdown = request.getUri().equals(SHUTDOWN_COMMAND);
            }
            catch (Exception e) {
                e.printStackTrace();
                continue;
            }
        }
    }
}
    这个类主要是通过一个main()方法启动一个关于本地的监听,有一个公有方法await(),主要作用是启动监听,设置端口号(后期可以修改成配置文件的形式),加工请求并相应。
    WEB_ROOT的值是我存放html的目录,也就是web。
    调用的ServerSocket对象的accept()方法,这个方法的执行将使Server端的程序处于等待状态,程序将一直阻塞直到捕捉到一个来自Client端的请求,并返回一个用于与该Client通信的Socket对象Link-Socket。此后Server程序只要向这个Socket对象读写数据,就可以实现向远端的Client读写数据。结束监听时,关闭ServerSocket对象: 
    Socket类的构造函数有两个参数,第一个参数是欲连接到的Server计算机的主机地址,第二个参数是该Server机上提供服务的端口号。
    Socket对象建立成功之后,就可以在Client和Server之间建立一个连接,并通过这个连接在两个端点之间传递数据。利用Socket类的方法getOutputStream()和getInputStream()分别获得向Socket读写数据的输入/输出流,最后将从Server端读取的数据重新返还到Server端。
    当Server和Client端的通信结束时,可以调用Socket类的close()方法关闭Socket,拆除连接。
    这样,在Request类中处理的访问请求会传给Response并指向要访问的资源

2.Request


package com.draz.ex01;

import java.io.InputStream;
import java.io.IOException;

public class Request {

  private InputStream input;
  private String uri;

  public Request(InputStream input) {
    this.input = input;
  }

  public void parse() {
    // Read a set of characters from the socket
    StringBuffer request = new StringBuffer(2048);
    int i;
    byte[] buffer = new byte[2048];
    try {
      i = input.read(buffer);
    }
    catch (IOException e) {
      e.printStackTrace();
      i = -1;
    }
    for (int j=0; j<i; j++) {
      request.append((char) buffer[j]);
    }
    System.out.print(request.toString());
    uri = parseUri(request.toString());
  }

  private String parseUri(String requestString) {
    int index1, index2;
    index1 = requestString.indexOf(' ');
    if (index1 != -1) {
      index2 = requestString.indexOf(' ', index1 + 1);
      if (index2 > index1)
        return requestString.substring(index1 + 1, index2);
    }
    return null;
  }

  public String getUri() {
    return uri;
  }
}

一个公有的parse方法
Request 类里干的最主要的活就是加工!加工!加工
InputStream实例被拆分成字节数组的形式,
打印出来的request是这样的:


GET /index.html HTTP/1.1
Host: localhost:8001
Connection: keep-alive
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Encoding: gzip, deflate, sdch, br
Accept-Language: zh-CN,zh;q=0.8
Cookie: logName=23700013181

最后

3.Response



package com.draz.ex01;

import java.io.OutputStream;
import java.io.IOException;
import java.io.FileInputStream;
import java.io.File;

/*
  HTTP Response = Status-Line
    *(( general-header | response-header | entity-header ) CRLF)
    CRLF
    [ message-body ]
    Status-Line = HTTP-Version SP Status-Code SP Reason-Phrase CRLF
*/

public class Response {

  private static final int BUFFER_SIZE = 1024;
  Request request;
  OutputStream output;

  public Response(OutputStream output) {
    this.output = output;
  }

  public void setRequest(Request request) {
    this.request = request;
  }

  public void sendStaticResource() throws IOException {
    byte[] bytes = new byte[BUFFER_SIZE];
    FileInputStream fis = null;
    try {
      File file = new File(HttpServer.WEB_ROOT, request.getUri());
      if (file.exists()) {
        fis = new FileInputStream(file);
        int ch = fis.read(bytes, 0, BUFFER_SIZE);
        while (ch!=-1) {
          output.write(bytes, 0, ch);
          ch = fis.read(bytes, 0, BUFFER_SIZE);
        }
      }
      else {
        // file not found
        String errorMessage = "HTTP/1.1 404 File Not Found\r\n" +
          "Content-Type: text/html\r\n" +
          "Content-Length: 23\r\n" +
          "\r\n" +
          "<h1>File Not Found</h1>";
        output.write(errorMessage.getBytes());
      }
    }
    catch (Exception e) {
      // thrown if cannot instantiate a File object
      System.out.println(e.toString() );
    }
    finally {
      if (fis!=null)
        fis.close();
    }
  }
}
springboot静态资源访问+jsp 莫名其妙好了,老实说,我现在还在晕着呢! 因为前端选择的是jsp页面,所以就将静态资源都放到了webapp下,webapp是自己建的,springboot项目创建完毕无该文件夹。 使用的是外置tomcat,版本tomcat7 项目整体结构: 配置文件: 启动类:不拦截.do请求 @SpringbootApplication默认已经配置很多注解,有时候不知道在写一遍,可能在注... 阅读详情

相关推荐

基于MYD-YT153与AD7616的16通道高速ADC采集系统实战指南

在嵌入式系统与工业数据采集领域,模拟信号采集是连接物理世界与数字系统的关键技术。其核心原理是通过模数转换器(ADC)将连续的模拟电压信号转换为离散的数字码值,供处理器处理。这项技术的价值在于实现了对温度、压力、振动等关键物理量的精确感知与数字化,是工业自动化、设备监测、科学实验等场景的基石。本文聚焦于**多通道**、**高精度**采集这一常见需求,深入剖析如何利用全志T153处理器的LocalBus并行总线接口,高效驱动ADI的16位、16通道同步采样ADC芯片AD7616,构建一个稳定可靠的高速数据采集系

weixin_30335353的博客 443

tomcat配置静态资源访问(亲测ok版)

最近偶尔接收一个ssm+jsp的项目,因为之前的文件上传都是存在项目里,用tomcat启动的话,往往不能实时加载图片等资源做一个用户头像切换功能,上传了文件后(上传是用的layui的组件,上传无问题)。但是加载的时候,必须重新启动项目才可以。我靠,这怎么行?

i_for的博客 5165

嵌入式八股文-ARM

嵌入式八股文总结(ARM篇)-优快云博客现象:I2C死锁就是时钟线SCL一直处于高电平,数据线SDA一直处于低电平。从机拉低数据线SDA时(发送应答信号给主机时或发送数据0时)主机意外复位,主机复位后时钟线SCL就为高电平了,此时,SCL为高电平而SDA为低电平,主机就以为有其他设备占有了总线,而SCL为高电平时 数据位SDA不允许有变化,意思是:主机就一直等待时钟线SDA拉高,而从机就一直等待时钟线SCL拉高 就造成了死锁的现象。解决方法:1.选择带有复位功能的从设备,复位后SDA被拉高。

m0_63127436的博客 1260

tomcat配置静态资源访问

tomcat配置静态资源访问

weixin_52116015的博客 2349

基于 Wi-Fi 的室内定位系统

目前,随着国内外相关从业人员的研究,研究者们提出了众多室内定位技术的理论与方法。在此仅讨论基于 Wi-Fi 的室内定位技术。 WI-FI室内定位 近年来Wi-Fi技术飞速发展,城市中的公共场所如大型超市商场、学校、企业等都已经广泛部署Wi-Fi。Wi-Fi室内定位技术已经出现了很多具有代表性的研究成果,如RADAR系统、Nibble系统、Weyes系统等室内定位系统。2012年,Google把Wi...

温染的笔记 9567

[Vue][面试]谈谈你对MVC、MVP和MVVM的理解

谈谈你对MVC、MVP和MVVM的理解 答题思路:此题涉及知识点很多,很难说清楚,说透彻,因为MVC,MVP这些我们前端程序员自己甚至都没用过。但是恰恰反映了前端这些年从无到有, 从有到优的变迁过程,因此沿此思路回答将十分清除。 Web1.0时代 在web1.0时代,并没有前端的概念。开发一个web应用多数采用ASP.NET/Java/PHP编写,项目通常由多个aspx/jsp/php文件构成,每个文件中同时包含了HTML、CSS、JavaScript、C#/Java/PHP代码, 系统整体架构可能如下图所

你好,欢迎光临! 723

tomcat的静态资源和动态资源的访问

tomcat的静态资源和动态资源的访问

weixin_51395608的博客 2199

2025年普通人转向人工智能运维(AIOps)学习建议(附最新技术实践与资源)

AIOps不仅是技术的叠加,更是运维流程的重构。建议通过“学习-实践-反馈”循环,逐步从工具使用者成长为解决方案设计者。如需完整资源链接,可访问上述推荐的优快云博客及GitHub仓库。

资深全栈架构师,乐于在 优快云 分享技术见解,与大家携手共进,共攀技术巅峰! 3096

tomcat加载静态资源(图片、文件、html等)

前提:jdk和tomcat已经安装好了 方案一: 直接把静态项目复制到Tomcat安装目录的webapps目录中。 例如:我们新建一个test文件夹,在文件夹里面新建一个test.html文件,然后将整个test文件夹复制到Tomcat安装目录的webapps目录中,启动tomcat后在浏览器输入localhost:8080/test/test.html即可访问了。 方案二: 在tomc...

孙霸天的专栏 1万+

Response Instance 详解:在 ABAP OData Client Proxy 中读懂每一次响应

ABAP OData Client Proxy中的Response Instance是关键信息载体,封装了业务数据及调用上下文(如分页、delta link等)。响应实例在执行请求后自动生成,根据请求类型返回特定接口(如READ返回/IWBEP/IF_CP_RESPONSE_READ)。响应抽象与OData版本解耦,支持统一处理V2/V4服务。常见响应类型包括单实体读取、列表读取(支持分页和增量同步)、创建/更新/删除响应等。开发时可通过响应对象的安全类型方法获取数据,如get_business_data获

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 137

28、沉浸式体验技术:概念、类型与应用

本文全面介绍了沉浸式体验技术的概念、类型与应用。从双边滤波器的图像处理原理切入,系统阐述了VR、AR、MR、ER及数字孪生等核心技术的特点与区别,并通过丰富案例展示了其在商业、医疗、教育、旅游、房地产、物流等多个领域的实际应用。文章还分析了技术融合趋势、硬件升级方向、应用场景拓展潜力,同时探讨了数据处理、网络延迟、隐私安全等挑战及应对策略,最后以流程图和对比表格总结技术发展脉络,展望沉浸式技术推动社会进步的广阔前景。

wind6的博客 381

Tomcat配置文件访问webAPP下的静态资源

通过配置Tomcat的文件,访问webAPP下的静态资源

人工智能-机器学习-研究学习APP 2556

RK3588开发笔记-麦克风阵列多pdm通道合并成一个声卡

在音频设备的开发中,特别是在多通道音频数据处理场景中,如何将多个PDM(Pulse Density Modulation)通道整合成一个声卡设备,是一个非常具有挑战性的问题。RK3588芯片作为一款性能强大的平台,提供了对多个音频通道的支持。本文将介绍如何在RK3588上将多个PDM通道合并成一个麦克风阵列声卡,从而在Linux系统下统一管理和使用,提高多通道音频的同步性。在本文中我们主要介绍使用2通道回采+4通道mic声音采集构成一个6通道声卡,加以回声消除实现一个多麦克风阵列。

flypig has a dream! 1926

idea中没有tomcat,tomcat配置,以及访问静态资源

如果Application context是/,访问静态页面路径: http://localhost:8080/static/mycss/style.css。下图是解释,注意,配置的话,URL和Application context都配成上文的正常情况,而不是下图这样两者不对应;,都按照上文说的正常情况为例,也就是默认URL和Application context都是。如果URL,和Application context。启动tomcat后,自动跳转的页面会出现404页面,(这个是我URL中的路径)

weixin_45986454的博客 3002

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

Tomcat部署SpringMvc项目出现无法访问静态资源的问题

Tomcat部署SpringMvc项目出现无法访问静态资源的问题结构图: 最近在做一个web项目,在本地部署Tomcat服务器的时候可以访问静态资源,但是在服务器端却没有办法访问静态资源,网上找了很多博客,都不适用于我的情况,最后在师兄协助下解决了问题。 首先来看我的项目结构 webapp下存放的是静态资源statics和WEB-INF文件夹。 以下是我的jsp页面资源路径和mvc静态资源配置...

whason的博客 3105

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

在tomcat中部署静态资源访问

如果你想让你的服务器直接能访问某一个目录,不需要经过servlet,也不需要用ftp。 在tomcat下conf文件夹中修改server.xml <Hostname="localhost"appBase="webapps" unpackWARs="true"autoDeploy="true"> <!--SingleSig...

weixin_39878226的博客 1518

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

JavaWeb 中的静态资源访问

逻辑上,用户所访问的资源分为 3 种:ServletJSP静态资源(例如:html、css、js、png 等)Tomcat 判断请求的资源的类型,也是按照上述顺序在判断:先判断是否是请求 Servlet(.do请求),再判断是否是 JSP(.jsp请求)。要是都不是,那么就是静态资源(.png等请求)。通过配置,进行合理安排,我们应该/预期达到如下效果:对于 Servlet 的请求的处理,由我们自定义的Servlet进行处理。对于 JSP 的请求的处理,由 Tomcat 中的。

xiaotu的博客 1742

springmvc的静态资源无法访问解决方法(基本全面)

解决springmvc静态资源无法访问的解决方案

此成非彼诚博客 1万+

[细节]Tomcat对静态资源的缓存支持

使用tomcat时我们可以通过配置DefaultServlet来支持对静态资源的访问,而DefaultServlet是具有缓存功能的,下面通过对关键的源码对其进行分析并介绍如何通过配置来控制tomcat静态资源的缓存行为。 1. 配置DefaultServlet: 我们有两种方式来配置资源,一种是通过部署描述符,另一种就是通过代码进行配置: 通过代码配置DefaultServ

Zerohuan的专栏 1万+

tomcat部署的网站访问不到静态资源

问题描述:javaweb项目,tomcat发布,别人写的工程部署到自己的tomcat上,访问不到静态资源 404错误,但在别人的机器上可正常使用。好久不接触前端代码了,最后发现居然是路径问题。。。。 静态资源在/WEB-INF/resources/下,已经在springMVC中对该目录下的文件放开访问权限了,而且在他的机器上能正常访问,说明项目配置文件应该是没问题的 分析: html访问资源

猴子哥哥的博客 3万+

linux搭建java环境、配置访问tomcat静态资源

一、安装jdk,配置java环境 1、查看当前linux是否存在自带jdk 命令: java -version 如果没有上述提示表明尚未安装jdk或安装失败,需要重新检查安装 2、oracle官网下载jdk 官网地址 : https://www.oracle.com/java/technologies/javase/javase-jdk8-downloads.html 3、下载成功后 通过某文件传输器将压缩包传输至服务器指定目录中 一般是安装在usr/local目录下,在该目录下创建一个文件夹用来存放需

weixin_44064037的博客 870

Tomcat 配置访问静态资源

第一种:将要访问的文件test.txt放至tomcat安装路径下的webapps/ROOT文件夹下: 访问路径为:localhost:8080/test.txt 或者在webapps文件夹下新建一个文件夹(test),将文件test.txt放在test文件夹下: 访问路径:localhost:8080/test/test.txt 第二种:修改tomcat 中的server.xml ,在 中添加 ...

weixin_39076313的博客 3058

tomcat配置静态资源后无法正常访问

tomcat配置静态资源后无法正常访问

weixin_52116015的博客 1233

配置Tomcat 8 访问静态资源,并解决Tomcat8 CORS跨域问题

问题背景: 之前配置过apache作为静态资源的服务器,后因端口问题无法使用,但此时tomcat8的端口可以使用,因此需要通过配置tomcat8作为静态资源服务器,已达成某些静态资源的访问。但配置完成后,可能会涉及跨域访问的问题,因此还需要解决跨域问题,本文最后会解决跨域问题。 步骤1:配置Tomcat 8访问静态资源 打开apache-tomcat-8.5.20\conf目录下的 server.xml 文件,在<Host>节点中增加如下文本 <Context path="/st

ThinkingInGIS的博客 4304

通过tomcat访问静态资源

1.修改tomcat的server.xml文件 <Context path="/static" docBase="E:/staticFile" deBug="0" reloadable="false"/> 访问地址如: http://127.0.0.1:8080/static/1.png static表示8080端口后接的访问路径,可以自定义名字,1.png这个图片可以放在E:/...

单调枯燥的CC的博客 3149

SpringMVC访问静态资源的三种方式

如果你的DispatcherServlet拦截 *.do这样的URL,就不存在访问不到静态资源的问题。如果你的DispatcherServlet拦截“/”,拦截了所有的请求,同时对*.js,*.jpg的访问也就被拦截了。 问题原因:罪魁祸首是web.xml下对spring的DispatcherServlet请求url映射的配置,原配置如下: <servlet> &l...

pengjunlee的博客 4万+
上一篇: DQL -- 数据查询语言
drazen08
博客等级 码龄10年 3粉丝 1原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值