JavaWeb之初识Tomcat

Tomcat

轻量级应用服务器、JSP、Servlet

Tomcat目录结构

在IDEA中创建web项目

在这里不使用maven构建项目,这种方式后面会更新

  1. 新建一个java项目
  2. File -> Project Settings -> Facets -> + -> Web -> OK ( 此时src目录下有一个web目录 )
  3. Edit -> Configurations... -> Add New Configuration -> + -> Tomcat Server -> Local -> 配置
  4. 将 tomcat 的 lib 包下的 servlet-api.jar 包添加到项目中

web目录结构

第一个请求案例

  1. 新建一个注册界面register.html

  2. 在src目录下的包中写一个servlet类继承于HttpServlet,重写service方法

  3. 在WEB-INF下的web.xml中配置路径的映射信息

  4. 测试

Servlet生命周期

三个步骤即:初始化------>处理请求------>销毁

创建Servlet对象后---------->初始化(调用 init () 方法)------>处理/响应客户端的请求(调用 service() 方法)------->销毁(调用 destroy() 方法,最后由 JVM 的垃圾回收器进行垃圾回收

Servlet底层原理

Servlet的线程安全问题

Servlet容器采用多线程模型来处理请求。

每个请求都由一个独立的线程处理,这意味着多个请求可以同时执行。

当一个请求到达Servlet时,Servlet容器会创建一个新的线程来处理该请求,并且该线程仅在请求处理完毕后才会被销毁。

这意味着对于同一个Servlet,不同的请求可以在不同的线程上执行,每个线程都有自己的执行路径和数据副本。

解决方法:

  1. 避免使用共享变量(成员变量)
  2. 使用局部变量
  3. 使用同步代码块
  4. 避免使用静态变量和类变量
  5. 使用ThreadLocal,可以在每个线程中存储和访问私有变量

Tomcat页面跳转

页面跳转页面\Servlet

页面之间、页面跳转Servlet 的跳转可以通过三种方式实现

  • 超链接

    html 复制代码
    <a href="page1.html">跳转到page01</a>
  • window.localtion

    html 复制代码
    <button onclick="fun01()">跳转到page01</button>
    <script>
    	function fun01(){
            windoe.location.href = "/page01"
        }
    </script>
  • 表单

    html 复制代码
    <form action="page01" method="post">
        ...
        <input type="submit"/>
    </form>

Servlet跳转Servlet\页面

Servlet可以通过转发和重定向两种方式实现

  • 转发

    java 复制代码
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        req.setCharacterEncoding("utf-8");
        resp.setContentType("text/html;charset=utf-8");
        req.getRequestDispatcher("servlet3").forward(req, resp);
        //req.getRequestDispatcher("page01.html").forward(req, resp);
    }
  • 重定向

    java 复制代码
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        req.setCharacterEncoding("utf-8");
        resp.setContentType("text/html;charset=utf-8");
        resp.sendRedirect("servlet5");
        //resp.sendRedirect("page01.html");
    }

重定向与转发

重定向与转发是Tomcat实现跳转的两种方式,但是两者之间有区别

  • 区别一:转发只请求一次,重定向请求两次
  • 区别二:转发是服务器内部的页面跳转,重定向是《告诉客户端应该从哪里请求,客户端再次向服务器请求》,所以服务器内不存在的资源转发不能响应
  • 区别三:转发可以让客户端访问受保护的资源(比如WEB-INF文件夹下的资源),重定向不可以
  • 区别四:转发可以转发服务器中中文名的资源(比如 " 页面.html"),而重定向不可以

编码问题

Tomcat的Servlet中的doget(req, resp) 和 doPost(req, resp)方法的req、resp都需要设置编码格式

java 复制代码
req.setCharacterEncoding("utf-8");
resp.setContentType("text/html;charset=utf-8");
相关推荐
wrx繁星点点1 分钟前
事务的四大特性(ACID)
java·开发语言·数据库
IT学长编程8 分钟前
计算机毕业设计 Java酷听音乐系统的设计与实现 Java实战项目 附源码+文档+视频讲解
java·spring boot·毕业设计·课程设计·毕业论文·音乐系统·计算机毕业设计选题
IT学长编程26 分钟前
计算机毕业设计 基于协同过滤算法的个性化音乐推荐系统的设计与实现 Java实战项目 附源码+文档+视频讲解
java·spring boot·毕业设计·毕业论文·协同过滤算法·计算机毕业设计选题·个性化音乐推荐系统
小小娥子30 分钟前
Redis的基础认识与在ubuntu上的安装教程
java·数据库·redis·缓存
几何心凉38 分钟前
已解决:org.springframework.web.HttpMediaTypeNotAcceptableException
java
华农第一蒟蒻40 分钟前
Java中JWT(JSON Web Token)的运用
java·前端·spring boot·json·token
两点王爷42 分钟前
使用WebClient 快速发起请求(不使用WebClientUtils工具类)
java·网络
计算机学姐1 小时前
基于SpringBoot+Vue的高校运动会管理系统
java·vue.js·spring boot·后端·mysql·intellij-idea·mybatis
平凡的小码农1 小时前
JAVA实现大写金额转小写金额
java·开发语言
一直在进步的派大星1 小时前
Docker 从安装到实战
java·运维·docker·微服务·容器