简单Demo实现Javaweb的搭建在Tomcat

news2024/11/29 0:53:12

文章目录

    • 环境准备
    • 程序编写

环境准备

本机:MacBook Pro 系统:MacOS 13.4

  1. Tomcat 下载:Apache Tomcat® - Welcome!

    这里我下载的是9.0.75版本

启动Tomcat容器碰到Bug:Tomcat started.但是就是没法访问到相关页面,同时jps也没有相关的进程,说明其实没启动起来。同时通过chown改变权限也没法解决问题。

Solution:

在这里插入图片描述

查看相关的版本对应记录,以及README的Release notes,发现apache-tomcat-10.1.9需要jdk11及以上,我本地是jdk8,重新下载tar.gz 9.0.75。

重新解压并且startup,可以访问http://localhost:8080了

  1. 记得需要配置本地的JAVA_HOME路径,我采用命令vim ~/.bash_profile

     export JAVA_HOME="/Library/Java/JavaVirtualMachines/jdk1.8.0_361.jdk/Contents/Home"
    

程序编写

  1. idea maven生成javaweb模版

在这里插入图片描述

  1. pom中导入依赖

    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
      <modelVersion>4.0.0</modelVersion>
      <groupId>com.jxz</groupId>
      <artifactId>MyJavaWeb</artifactId>
      <packaging>war</packaging>
      <version>1.0-SNAPSHOT</version>
      <name>MyJavaWeb Maven Webapp</name>
      <url>http://maven.apache.org</url>
    
      <dependencies>
        <dependency>
          <groupId>javax.servlet</groupId>
          <artifactId>servlet-api</artifactId>
          <version>2.5</version>
        </dependency>
    
        <dependency>
          <groupId>javax.servlet.jsp</groupId>
          <artifactId>javax.servlet.jsp-api</artifactId>
          <version>2.3.3</version>
        </dependency>
    
        <dependency>
          <groupId>junit</groupId>
          <artifactId>junit</artifactId>
          <version>3.8.1</version>
          <scope>test</scope>
        </dependency>
      </dependencies>
    
      <build>
        <finalName>MyJavaWeb</finalName>
      </build>
    </project>
    
  2. main目录下新建java包,并创建com/jxz/servlet目录,在其中放入最简单的HelloServlet,其继承自HttpServlet

    package com.jxz.servlet;
    
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import java.io.IOException;
    import java.io.PrintWriter;
    
    /**
     * @Author jiangxuzhao
     * @Description
     * @Date 2023/6/3
     */
    public class HelloServlet extends HttpServlet {
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            PrintWriter pw = resp.getWriter(); // 获取输出流
            pw.print("hello jxz"); // 打印
        }
    
        @Override
        protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            super.doGet(req, resp);
        }
    }
    

    其中的原理分析:

    我们只实现了Get和Post方法,因为这是最普遍的两个Http请求投,我们也可以看到,其实doPost方法也只是复用了一下doGet方法,因为处理是一样的。那么为什么这样子就可以处理http请求了呢?HelloServlet -> public abstract class HttpServlet -> public abstract class GenericServlet -> implements Servlet

        /**
         * Called by the servlet container to allow the servlet to respond to 
         * a request.
         *
         * <p>This method is only called after the servlet's <code>init()</code>
         * method has completed successfully.
         * 
         * <p>  The status code of the response always should be set for a servlet 
         * that throws or sends an error.
         *
         * 
         * <p>Servlets typically run inside multithreaded servlet containers
         * that can handle multiple requests concurrently. Developers must 
         * be aware to synchronize access to any shared resources such as files,
         * network connections, and as well as the servlet's class and instance 
         * variables. 
         * More information on multithreaded programming in Java is available in 
         * <a href="http://java.sun.com/Series/Tutorial/java/threads/multithreaded.html">
         * the Java tutorial on multi-threaded programming</a>.
         *
         *
         * @param req 	the <code>ServletRequest</code> object that contains
         *			the client's request
         *
         * @param res 	the <code>ServletResponse</code> object that contains
         *			the servlet's response
         *
         * @exception ServletException 	if an exception occurs that interferes
         *					with the servlet's normal operation 
         *
         * @exception IOException 		if an input or output exception occurs
         *
         */
    
        public void service(ServletRequest req, ServletResponse res)
    	throws ServletException, IOException;
    

    从interface Servlet接口中的定义可以看出:service允许web容器处理请求request,而GenericServlet里面并没有对service()方法进行实现,HttpServlet对service()方法进行了重写,同时这里应用了模板模式,在service中定义了各种http请求方法头method的处理方式,在我们的子类HelloServlet中,让我们重写的doGet或者doPost等方法,子类被调用的时候也就是调用被重写的方法。

        /**
         *
         * Receives standard HTTP requests from the public
         * <code>service</code> method and dispatches
         * them to the <code>do</code><i>XXX</i> methods defined in 
         * this class. This method is an HTTP-specific version of the 
         * {@link javax.servlet.Servlet#service} method. There's no
         * need to override this method.
         *
         *
         *
         * @param req	the {@link HttpServletRequest} object that
         *			contains the request the client made of
         *			the servlet
         *
         *
         * @param resp	the {@link HttpServletResponse} object that
         *			contains the response the servlet returns
         *			to the client				
         *
         *
         * @exception IOException	if an input or output error occurs
         *				while the servlet is handling the
         *				HTTP request
         *
         * @exception ServletException	if the HTTP request
         *					cannot be handled
         * 
         * @see 				javax.servlet.Servlet#service
         *
         */
    
        protected void service(HttpServletRequest req, HttpServletResponse resp)
    	throws ServletException, IOException
        {
    	String method = req.getMethod();
    
    	if (method.equals(METHOD_GET)) {
    	    long lastModified = getLastModified(req);
    	    if (lastModified == -1) {
    		// servlet doesn't support if-modified-since, no reason
    		// to go through further expensive logic
    		doGet(req, resp);
    	    } else {
    		long ifModifiedSince = req.getDateHeader(HEADER_IFMODSINCE);
    		if (ifModifiedSince < (lastModified / 1000 * 1000)) {
    		    // If the servlet mod time is later, call doGet()
                        // Round down to the nearest second for a proper compare
                        // A ifModifiedSince of -1 will always be less
    		    maybeSetLastModified(resp, lastModified);
    		    doGet(req, resp);
    		} else {
    		    resp.setStatus(HttpServletResponse.SC_NOT_MODIFIED);
    		}
    	    }
    
    	} else if (method.equals(METHOD_HEAD)) {
    	    long lastModified = getLastModified(req);
    	    maybeSetLastModified(resp, lastModified);
    	    doHead(req, resp);
    
    	} else if (method.equals(METHOD_POST)) {
    	    doPost(req, resp);
    	    
    	} else if (method.equals(METHOD_PUT)) {
    	    doPut(req, resp);	
    	    
    	} else if (method.equals(METHOD_DELETE)) {
    	    doDelete(req, resp);
    	    
    	} else if (method.equals(METHOD_OPTIONS)) {
    	    doOptions(req,resp);
    	    
    	} else if (method.equals(METHOD_TRACE)) {
    	    doTrace(req,resp);
    	    
    	} else {
    	    //
    	    // Note that this means NO servlet supports whatever
    	    // method was requested, anywhere on this server.
    	    //
    
    	    String errMsg = lStrings.getString("http.method_not_implemented");
    	    Object[] errArgs = new Object[1];
    	    errArgs[0] = method;
    	    errMsg = MessageFormat.format(errMsg, errArgs);
    	    
    	    resp.sendError(HttpServletResponse.SC_NOT_IMPLEMENTED, errMsg);
    	}
        }
    
  3. Web.xml中配置servlet,完成路径映射

    <?xml version="1.0" encoding="UTF-8"?>
    <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
                             http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
             version="4.0"
             metadata-complete="true">
    
    <!--  注册servlet名字和类-->
      <servlet>
        <servlet-name>hello</servlet-name>
        <servlet-class>com.jxz.servlet.HelloServlet</servlet-class>
      </servlet>
    
    <!--配置Servlet的映射路径和对应的servlet名字-->
      <servlet-mapping>
        <servlet-name>hello</servlet-name>
        <url-pattern>/hellojxz</url-pattern>
      </servlet-mapping>
    </web-app>
    
  4. Run Configuration中配置web war包到tomcat服务器中

    其中需要配置本地的web服务器:
    在这里插入图片描述

    同时指定生成的Deployment war包

在这里插入图片描述

  1. 测试访问相关路径 http://localhost:8080/hellojxz
    在这里插入图片描述

除此以外,一个servlet可以指定多个路径映射到相同的servlet,同时可以实现默认的请求路径映射,

<!--  多个路径映射到相同的servlet-->
  <servlet-mapping>
    <servlet-name>hello</servlet-name>
    <url-pattern>/hellojxz2</url-pattern>
  </servlet-mapping>

<!--  默认的映射,直接访问localhost:8080映射到这里-->
  <servlet-mapping>
    <servlet-name>hello</servlet-name>
    <url-pattern>/*</url-pattern>
  </servlet-mapping>
</web-app>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/607274.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java数据驱动:CData JDBC Drivers 2022 Crack

JDBC 驱动程序 易于使用的 JDBC 驱动程序&#xff0c;具有强大的企业级功能 无与伦比的性能和可扩展性。 对实时数据的简单 JDBC/SQL 访问。 从流行的 BI 工具访问实时数据。 集成到流行的 IDE 中。 CData JDBC Drivers Software 是领先的数据访问和连接解决方​​案提供商。我…

附录4-微信开发者工具

目录 1.安装 2 微信开发者工具常用操作 2.1 创建项目 2.2 预览效果 2.3 查看小程序信息 2.4 自定义编译 2.4.1 创建编译模式 2.4.2 使用创建好的编译模式 2.4.3 删除编译模式 1.安装 【微信开发者工具下载】2023年最新官方正式版微信开发者工具免费下载 - 腾…

【企业化部署】Nginx之Rewrite与location的用法

文章目录 前言一、正则表达式1. Nginx 的正则表达式2. 正则表达的优势3. Nginx 使用正则的作用 二、location 的概念1. location 和 rewrite 区别2. location 匹配的分类3. location 常用的匹配规则3.1 location 匹配优先级3.2 location 匹配的实例3.3 实际网站规则定义第一个必…

Netty之EventLoop 解读

是什么 EventLoop &#xff08;事件循环对象&#xff09;本质是一个单线程执行器&#xff08;同时维护了一个 Selector&#xff09;&#xff0c;里面有 run 方法处理 Channel 上源源不断的 io 事件。 它的继承关系比较复杂 一条线是继承自 j.u.c.ScheduledExecutorService 因…

CenterSpace.NMath.Standard.Windows.X64 7.4 Crack

适用于所有 .NET 语言&#xff0c;包括 C#、Visual Basic 和 F#。 CenterSpace Software的NMath TM .NET 数学和统计库为.NET平台上的金融、工程和科学应用程序提供数值组件。 基础 .NET 数学和统计库NMath包括复数类、一般向量和矩阵类、结构化稀疏矩阵类和因式分解、一般稀疏…

华为OD机试真题 Java 实现【找出通过车辆最多颜色】【2023Q1 100分】

一、题目描述 在一个狭小的路口&#xff0c;每秒只能通过一辆车&#xff0c;假如车辆的颜色只有3种&#xff0c;找出n秒内经过的最多颜色的车辆数量。 三种颜色编号为0、1、2。 二、输入描述 第一行输入的是通过的车辆颜色信息 [0 1 1 2] 代表4秒钟通过的车辆颜色分别是0 1…

Rust每日一练(Leetday0020) 最后单词的长度、螺旋矩阵II、排列序列

目录 58. 最后一个单词的长度 Length of Last Word &#x1f31f; 59. 螺旋矩阵 II Spiral Matrix II &#x1f31f;&#x1f31f; 60. 排列序列 Permutation Sequence &#x1f31f;&#x1f31f;&#x1f31f; &#x1f31f; 每日一练刷题专栏 &#x1f31f; Rust每日…

Java企业级信息系统开发学习笔记14 Spring Boot(使用Spring Initializr方式构建Spring Boot项目)

文章目录 一、使用Spring Initializr方式构建Spring Boot项目&#xff08;一&#xff09;创建Spring Boot项目&#xff08;二&#xff09;创建控制器&#xff08;三&#xff09;运行入口类&#xff08;四&#xff09;访问Web页面&#xff08;五&#xff09;修改访问映射路径 一…

OpenMMLab-AI实战营第二期-MMPose代码介绍

课程介绍 原始视频链接&#xff1a; 安装MMDetection和MMPose&#xff1a;https://www.bilibili.com/video/BV1Pa4y1g7N7 MMDetection三角板目标检测&#xff1a;https://www.bilibili.com/video/BV1Lm4y1879K MMPose、RTMPose三角板关键点检测&#xff1a;https://www.bilibi…

chatgpt赋能python:Python取消Import:改变编程世界的未来发展趋势

Python取消Import&#xff1a;改变编程世界的未来发展趋势 Python是一门非常流行的编程语言&#xff0c;它是开源的&#xff0c;因此得到了许多人的喜爱。然而&#xff0c;在Python的发展过程中&#xff0c;有些人认为现有的模块和包管理方式不够理想&#xff0c;需要进行改进…

视频压缩的工作原理

一、说明 当你正在观看你最喜欢的节目&#xff0c;出现缓冲的时候&#xff0c;这是什么原因&#xff1f;当 Wi-Fi 带宽不足以下载传输视频流所需的数据时&#xff0c;就会发生缓冲。也有可能是视频网站发布了未压缩版本的视频文件&#xff0c;因此视频文件太大而无法流畅地流式…

Linux常用命令——grpconv命令

在线Linux命令查询工具 grpconv 用来开启群组的投影密码 补充说明 grpconv命令用来开启群组的投影密码。Linux系统里的用户和群组密码&#xff0c;分别存放在/etc目录下的passwd和group文件中。因系统运作所需&#xff0c;任何人都得以读取它们&#xff0c;造成安全上的破绽…

Linux——TCP协议2

目录 确认应答(ACK)机制 超时重传机制 连接管理机制 流量控制 滑动窗口 快重传VS超时重传 拥塞控制 延迟应答 捎带应答 面向字节流 粘包问题 TCP异常情况 基于TCP应用层协议 TCP/UDP对比 用UDP实现可靠传输 listen 的第二个参数 确认应答(ACK)机制 TCP将每个字节的数…

力扣高频SQL50题(基础版)——第五天

力扣高频SQL50题(基础版)——第五天 1 至少有5名直接下属的经理 1.1 题目内容 1.1.1 基本题目信息 1.1.2 示例输入输出 1.2 示例sql语句 #①找到经理的所有编号②让其与员工表内连接,然后分组筛选即可 SELECT e1.name FROM (SELECT id,nameFROM EmployeeWHERE managerId IS…

Vmware虚拟机实例配置静态IP

最近在给虚拟机配置静态IP的时候&#xff0c;出了一些小问题&#xff0c;本文主要描述操作过程中一些小问题的解决。 主要参考资料: How to set up Linux in VMWare Workstation with static IP (IPv4) 个人配置信息: VMware Workstation Debian 记录一下虚拟机的网卡信息 …

文本编辑器

章节目录&#xff1a; 一、Vim 编辑器1.1 检查 vim 软件包1.2 vim 基础1.3 命令模式1.4 输入模式1.5 底线命令模式&#xff08; Ex 模式 &#xff09; 二、nano 编辑器三、结束语 一、Vim 编辑器 vi 编辑器是 Unix 系统中最早的编辑器之一。vim 是从 vi 发展出来的一个文本编辑…

GTK官方教程

前言&#xff1a; 让你在开发中爱不释手的 GT 包。关注GSLS官网&#xff0c;查看更多源码 ヾ(✿&#xff9f;▽&#xff9f;)ノ工具包。 所有文章 小编尽量让读者可以 直接 读懂 与 完全 复制粘贴&#xff0c;其中复杂或较多 的源码 会有 源码 并 贴上 github 网址。 GT 类 里面…

图文并茂教你快速入门React系列04-状态管理

在React中&#xff0c;什么是状态&#xff1f; 响应式 使用 React&#xff0c;你不用直接从代码层面修改 UI。举个栗子哇&#xff0c;不用编写诸如“禁用按钮”、“启用按钮”、“显示成功消息”等命令。相反&#xff0c;你只需要描述组件在不同状态&#xff08;“初始状态”…

chatgpt赋能python:Python另存为在哪:一篇SEO指南

Python另存为在哪&#xff1a;一篇SEO指南 简介 Python是目前最流行的编程语言之一&#xff0c;它的高效性和易用性使得越来越多的人选择使用它来编写软件和web应用程序。然而&#xff0c;Python在保存文件时可能会有些棘手&#xff0c;尤其是在需要另存为不同格式或目录时。…

chatgpt赋能python:Python只取数字:你需要知道的一切

Python只取数字&#xff1a;你需要知道的一切 在当今数字化的时代&#xff0c;数字信息已经成为全球交流和经济活动的主要组成部分。因此&#xff0c;在处理数据时&#xff0c;我们经常需要从文件中提取数字信息。Python是一种广泛应用于数据处理和分析的编程语言&#xff0c;…