Tomcat构建

news2024/11/26 7:34:18

软件架构

C/S:Client/Server.需要安装才能使用。

B/S:Brower/Server。有浏览器就可以。

资源分类

  • 动态资源:每个用户访问相同的资源后,得到的结果可能不一样,称为动态资源。动态资源被访问后,先转换为静态资源,再被浏览器解析。

  • 静态资源:所有的用户在访问后,得到的结果都是一样的,称为静态资源。静态资源可以直接被浏览器解析

服务器

  1. 服务器:安装了服务器软件的计算机。

  1. 服务器软件:接收用户的请求,处理请求,做出响应。(接请求,传参数,给响应)

  1. web服务器软件:接收用户的请求,处理请求,做出响应。(接请求,传参数,给响应)

在web服务器软件中,可以部署web项目。让用户通过浏览器来访问这些项目。

常见的服务器软件

  • 动态服务器:

webLogic:oracle公司,大型的JavaEE服务器,支持所有的JavaEE规范,收费的。

webSphere:IBM公司。大型的JavaEE服务器,支持所有的JavaEE规范,收费的。

JBOSS:JBOSS公司。大型的JavaEE服务器,支持所有的JavaEE规范,收费的。

Tomcat:Apache基金组织,中小型的javaEE服务器,仅仅支持少量的JavaEE规范servle/JSP。开源免费。(300左右的并发)

  • 静态服务器:

nginx:代理,极高的并发

apache:Apache基金组织。PHP领域。

Tomcat

  1. Tomcat早期是Sun公司。javaWEBServer
  1. Tomcat4.0,里程碑版本。实现了Servlet

Tomcat的目录结构

  • bin:存放的是Tomcat的启动,停止批量处理脚本文件

startup.bat,startup.sh:启动tomcat的脚本文件

shutdown.bat,showdown.sh:停止tomcat的脚本文件

  • conf:用来存放Tomcat的相关配置文件

Catania:用来存储每个虚拟机的context配置

Context.xml:定义所有的web应用需要加载的context配置

Catalina.properties:Tomcat的环境变量

Logging.properties:Tomcat的日志配置文件,修改Tomcat的日志级别。

server.xml:Tomcat的核心配置文件

  • lib:Tomcat服务器的依赖包

  • logs:Tomcat默认的日志存放目录

  • webapps:Tomcat默认的web应用部署目录

  • work:Web应用jsp代码生成和编译的临时目录。

Servlet

servlet就是一个Java程序,一个java类。用来处理请求和响应。

Servlet的生命周期

  • init():Servelt进行初始化。

在tomcat启动的时候就会对所有的Servelt进行初始化

init方法只初始化一次

单例模式。

  • service():处理请求

可以处理GET,POST,PUT,DELETE请求

  • destroy():释放资源

创建servlet的三种方式

  1. 实现javax.servlet.Servlet接口

  1. 继承javax.servlet.GenericServlet类

  1. 继承javax.servlet.HttpServlet类

Servlet注册的两种方式

通过配置文件web.xml方式注册----Servlet3.0之前

WEB-INF:加密路径,不允许在地址栏

在web.xml进行注册servlet

    <!---注册servlet-->
    <servlet>
        <servlet-name>myServlet</servlet-name>
        <!--写全类名-->
        <servlet-class>com.jsoft.morning.Myservlet1</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>myServlet</servlet-name>
        <!--url pattern 当发起什么样的请求的时候,才让myServlet去处理-->
        <url-pattern>/hello</url-pattern>
    </servlet-mapping>

通过注解方式进行注册√

@WebServlet("/haha")
public class MyServlet3 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("MyServlet3 doGet....");
    }

Servlet的参数

HttpServletRequest:

简称request,代表请求对象,当请求来的时候,request会自动实例化

HttpServletResponse:

简称response

response代表响应,当请求来的时候,response会自动实例化。

如果写中文,需要设置相应的字符集

响应头:增加一个响应头,并且解决字符集问题。

        response.setCharacterEncoding("utf-8");
        response.addHeader("content-type","text/html;charaset=utf-8");
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("MyServlet3 doGet....");
        //向页面打印回去一句话
        //服务器和客户端之间的通信依然是使用的流
        response.setCharacterEncoding("utf-8");
        response.addHeader("content-type","text/html;charaset=utf-8");

        PrintWriter out = response.getWriter();
        //把后台想要给出的响应写会去
        out.write("我收到了你的请求!!!");
    }

URL匹配规则

  1. 精确匹配,每个servlet是可以处理多个请求的。

@WebServlet(urlPatterns = {"/haha","/haha1","/haha2"})

localhost:8080/javaweb20230214/haha2

  1. 路径匹配

@WebServlet(urlPatterns = {"/haha/*"})

localhost:8080/javaweb20230214/haha/aaa

  1. 扩展名匹配

@WebServlet(urlPatterns = {"*.do"})

localhost:8080/javaweb20230214/aaa.do

  1. 缺省匹配

@WebServlet(urlPatterns = {"/"})

注意:

不能出现/*.do

多看控制台

匹配顺序

  1. 精确匹配

  1. 路径匹配,先最长路径匹配,再最短路径匹配。 /user/* /user/add/*

  1. 扩展名匹配。

注意:扩展名匹配,前面不能有任何的路径,包括不能有/

/*和/的含义:
  • /*属于路径匹配。覆盖所有的扩展名匹配

  • /servlet中的特殊匹配模式

会拦截静态资源!!!

启动时初始化:

        <servlet-class>com.jsoft.morning.Myservlet1</servlet-class>
        <load-on-startup>1</load-on-startup>

Request

request功能分为以下几种:

  • 封装请求头:

  • 封装一些正文数据。如果是get请求,没有正文。

  • request实际上是一个域对象,可以把它当成map来添加和获取数据。

  • request提供请求转发功能。

常用的方法:

getRemoteaddr():获取客户端的IP地址。

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//        System.out.println(request.getRemoteAddr());
        System.out.println(request.getRemoteHost());
        if(Objects.equals(request.getRemoteHost(),"127.0.0.1")){
            response.getWriter().write("your Ip is closed!!!");
        }
    }

获取请求参数

常见的客户端传参方式:

  • 浏览器地址栏直接输入:GET请求

  • 超链:GET请求

  • 表单:可以是GET,可以是POST。

  • Ajax:可以是GET,可以是POST

GET请求和POST请求的区别?

GET请求:

  • 请求参数会在浏览器地址栏显示,所以不安全

  • 请求的参数长度在1k以内。

  • GET请求没有请求体

POST请求:

  • 请求参数不会显示在浏览器的地址栏,相对安全

  • 请求参数没有限制

  • 有请求体

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String username = request.getParameter("username");
        String password = request.getParameter("password");
        response.addHeader("content-type","text/html;charset=utf-8");
        PrintWriter out = response.getWriter();

//        System.out.println("username:"+username+",password:"+password);
        //调用service,调用dao,返回一个结果
        boolean flag=true;
        if(flag){
            out.write("登录成功,欢迎你"+username);
        }


    }
<form action="login" method="post">
username:<input type="text" name="username">
password:<input type="password" name="password">
<input type="submit" value="登录">
</form>

登录注册:

  protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String username = request.getParameter("username");
        String password = request.getParameter("password");
        String[] hobbies = request.getParameterValues("hobby");
        System.out.println(Arrays.toString(hobbies));
        Enumeration<String> names= request.getParameterNames();
        while(names.hasMoreElements()){
            System.out.println(names.nextElement().toString());
        }
        Map<String, String[]> parameterMap = request.getParameterMap();
        for(Map.Entry entry:parameterMap.entrySet()){
            System.out.println(entry.getKey()+"-->"+Arrays.toString((String[])entry.getValue()));
        };
        


        response.addHeader("content-type","text/html;charset=utf-8");
        PrintWriter out = response.getWriter();

//        System.out.println("username:"+username+",password:"+password);
        //调用service,调用dao,返回一个结果
        boolean flag=true;
        if(flag){
            out.write("登录成功,欢迎你"+username);
        }


    }
<form action="login" method="post">
账号:<input type="text" name="username"><br>
密码:<input type="password" name="password"><br>
性别:<input type="radio" name="gender" value="man">男
  <input type="radio" name="gender" value="woman" >女<br>
爱好:<input type="checkbox" name="hobby" value="swimming">游泳
  <input type="checkbox" name="hobby" value="readding">读书
  <input type="checkbox" name="hobby" value="writting">写字
  <br>
   复选:<select name="select" multiple>
  <option value="a">a</option>
  <option value="b">b</option>
  <option value="c">c</option>

</select>
<input type="submit" value="登录">
</form>

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

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

相关文章

ESP-IDF: 基于计数型信号量的生产者和消费者模型代码

ESP-IDF: 基于计数型信号量的生产者和消费者模型代码 SemaphoreHandle_t freeBowl NULL;//初始状态有5个空碗 SemaphoreHandle_t Mantou NULL;//初始状态没有馒头&#xff0c;从零开始计数 int queue[5]; //用数组模拟空碗&#xff0c;对数组取余操作&#xff0c;模拟循环链…

如何利用 ESLint 规范 TypeScript 代码

ESLint 是一种 JavaScript linter&#xff0c;可以用来规范 JavaScript 或 TypeScript 代码&#xff0c;本文教你怎么在项目中快速把 ESLint 安排上。 前导 怎么写出优雅的代码是一个老生常谈的话题&#xff0c;这其中包含了太多内容可聊&#xff0c;但搞一套标准规范绝对是万…

opencv锁定鼠标定位

大家好&#xff0c;我是csdn的博主&#xff1a;lqj_本人 这是我的个人博客主页&#xff1a; lqj_本人的博客_CSDN博客-微信小程序,前端,python领域博主lqj_本人擅长微信小程序,前端,python,等方面的知识https://blog.csdn.net/lbcyllqj?spm1011.2415.3001.5343哔哩哔哩欢迎关注…

【MySQL进阶】 存储引擎 索引

&#x1f60a;&#x1f60a;作者简介&#x1f60a;&#x1f60a; &#xff1a; 大家好&#xff0c;我是南瓜籽&#xff0c;一个在校大二学生&#xff0c;我将会持续分享Java相关知识。 &#x1f389;&#x1f389;个人主页&#x1f389;&#x1f389; &#xff1a; 南瓜籽的主页…

如何编译和运行C++程序?

C 和C语言类似&#xff0c;也要经过编译和链接后才能运行。在《C语言编译器》专题中我们讲到了 VS、Dev C、VC 6.0、Code::Blocks、C-Free、GCC、Xcode 等常见 IDE 或编译器&#xff0c;它们除了可以运行C语言程序&#xff0c;还可以运行 C 程序&#xff0c;步骤是一样的&#…

SpringMvc的请求和响应

SpringMvc的数据响应 1.springmvc的数据相应方式 &#xff08;1&#xff09;页面跳转 直接返回字符串 通过ModelAndView对象返回 &#xff08;2&#xff09;回写数据 直接返回字符串 返回对象或集合 页面跳转 jsp页面 <% page contentType"text/html;charsetUTF-8&q…

ChatGPT的出现,为我们展现出来的是智能社会来临的美好图景

ChatGPT&#xff0c;的确是当下最炙手可热的一个话题。然而&#xff0c;人们对于ChatGPT的认识&#xff0c;依然还是仅仅停留在ChatGPT本身&#xff0c;而没有将它与它的「前任」——元宇宙、web3.0&#xff0c;乃至NFT联系在一起。如果在看待ChatGPT的时候&#xff0c;将它放置…

KDJ日周月金叉共振指标

昨天介绍了MACD多周期共振指标公式&#xff0c;KDJ通过类似的写法&#xff0c;也可以共振。本文介绍的KDJ日周月金叉共振指标包含日周金叉共振、日月金叉共振、周月金叉共振、日周月金叉共振四种类型。 需要注意的问题依然是周、月金叉的信号漂移&#xff0c;接近周末月末的信…

如何用Redis实现延迟队列

背景前段时间有个小项目需要使用延迟任务&#xff0c;谈到延迟任务&#xff0c;我脑子第一时间一闪而过的就是使用消息队列来做&#xff0c;比如RabbitMQ的死信队列又或者RocketMQ的延迟队列&#xff0c;但是奈何这是一个小项目&#xff0c;并没有引入MQ&#xff0c;我也不太想…

企业级信息系统开发学习1.1 初识Spring——采用Spring配置文件管理Bean

文章目录一、Spring容器演示——采用Spring配置文件管理Bean&#xff08;一&#xff09;创建Maven项目&#xff08;二&#xff09;添加Spring依赖&#xff08;三&#xff09;创建杀龙任务类&#xff08;四&#xff09;创建勇敢骑士类&#xff08;五&#xff09;采用传统方式让勇…

IDEA设置方法注释模板

IDEA设置方法注释模板 类注释模板方法注释模板 效果步骤 补充 类注释模板 类注释模板是IDEA创建类时生成的注释&#xff0c;之前发文章跟大家分享过了&#xff0c;而且这也不是本篇文章的重点&#xff0c;文章的链接附在下面&#xff0c;需要的朋友可以去看看。 Intellij ID…

从码农到开发攻城狮,我经历了什么?

对于很多想从事或者刚进入开发岗位的伙伴们来说&#xff0c;对于开发这个职位的了解并不多&#xff0c;甚至已经有些迷茫&#xff0c;感觉总有敲不完的代码和无尽的加班赶项目&#xff0c;一眼望不到头。今天就借用朋友的故事讲述一个普普通通的开发蜕变之路&#xff0c;可能会…

mybatis-plus 源码解析

序 没错&#xff0c;又是需求导致我 需要研究下 mybatis-plus了。。。。 本来我想直接网上百度出来一篇&#xff0c;看看得了&#xff0c;就不自己从头研究了 我都看了一遍&#xff0c;但是很可惜 &#xff0c;没一个能用的。。。。 有一个掘金的写的&#xff0c;我看了下他…

备战蓝桥杯【一维前缀和】

&#x1f339;作者:云小逸 &#x1f4dd;个人主页:云小逸的主页 &#x1f4dd;Github:云小逸的Github &#x1f91f;motto:要敢于一个人默默的面对自己&#xff0c;强大自己才是核心。不要等到什么都没有了&#xff0c;才下定决心去做。种一颗树&#xff0c;最好的时间是十年前…

如何使用Arduino IDE编程ATTINY13/ATTINY13A单片机

尽管ATtiny系列被认为是非常便宜和有用的&#xff0c;但是仍然缺少有关它的项目和教程。在本篇文章中&#xff0c;您将学习如何使用通过Arduino IDE编程的ATtiny13微控制器开始构建应用程序。 首先&#xff0c;ATtiny13是基于AVR增强RISC架构的低功耗CMOS 8位微控制器。通过在一…

Seata-Server分布式事务原理加源码 (四)- Seata事务日志储存方式DB

Seata Server&#xff08;TC&#xff09;环境搭建详解 Server端存储模式&#xff08;store.mode&#xff09;支持三种&#xff1a; file&#xff1a;单机模式&#xff0c;全局事务会话信息内存中读写并持久化本地文件root.data&#xff0c;性能较高&#xff08;默认&#xff…

【Redis】Redis持久化之RDB详解(Redis专栏启动)

&#x1f4eb;作者简介&#xff1a;小明java问道之路&#xff0c;2022年度博客之星全国TOP3&#xff0c;专注于后端、中间件、计算机底层、架构设计演进与稳定性建工设优化。文章内容兼具广度深度、大厂技术方案&#xff0c;对待技术喜欢推理加验证&#xff0c;就职于知名金融公…

【Unity VR开发】结合VRTK4.0:创建一个门

语录&#xff1a; 独有英雄驱虎豹&#xff0c;更无豪杰怕熊罴 前言&#xff1a; 在我们做项目时&#xff0c;会遇到需要打开门&#xff0c;或者柜子的门&#xff0c;今天&#xff0c;我们就来学习一下关于门的控件。以模拟可以打开和关闭的门。我们将使用角度驱动器来创建此门…

大火的ChatGPT能为自动驾驶带来什么?

/导读/最近的科技圈&#xff0c;大家都被微软推出的ChatGPT刷屏&#xff0c;作为工智能公司OpenAI于2022年11月推出的聊天机器人&#xff0c;其能够通过学习和理解人类的语言来进行对话&#xff0c;还能根据聊天的上下文进行互动&#xff0c;甚至能完成撰写邮件、视频脚本、文案…

MySql8.0 安全卸载

1. 停止MySQL服务 winR 打开运行&#xff0c;输入 services.msc 点击 “确定” 调出系统服务。 2. 卸载MySQL相关组件 打开控制面板 —> 卸载程序 —> 卸载MySQL相关所有组件 3. 删除MySQL安装目录 4. 删除MySQL数据目录 数据存放目录是在 C:\ProgramData\MySQL&#…