servlet


Tomcat服务器

下载 - https://tomcat.apache.org/download-80.cgi

tomcat的版本需要和jdk的版本保持一致即可.

Apache 软件基金会(Apache Software Foundation)的Jakarta 项目中的一个核心项目

轻量级的服务器,免费并且开源,支持静态资源和java后端资源的部署的.

属于web容器/服务器,别称servlet容器,jsp容器

目录结构

  1. webapps - 部署后端项目的目录

  2. bin - 可执行文件

    1. startup.bat - 启动服务器
    2. shutdown.bat - 停止服务器
    
  3. conf - 配置文件

    3-1. server.xml - 端口号

    3-2. tomcat-users.xml

  4. lib - tomcat运行依赖的jar - tomcat支持servlet程序以及jsp程序的执行.

    4-1. servler-api.jar

    4-2. jsp相关jar jsp-api.jar

  5. logs - tomcat运行时记录日志

  6. temp - 临时目录 - 随时清空的

  7. work - 工作目录

配置端口号

默认的端口号是8080,需要conf/server.xml中进行配置

<Connector port="8081" protocol="HTTP/1.1"
         connectionTimeout="20000"
         redirectPort="8443" />

环境变量配置

Tomcat是采用java语言开发的,前提是计算机成功配置jdk

系统变量

新建 - 变量名:CATALINA_HOME 变量值:tomcat解压之后的根目录

Path - 编辑 - %CATALINA_HOME%\bin

关闭所有的窗口[包括终端]

启动运行

  1. 打开终端 - startup
  2. 打开浏览器 - localhost:8081

idea中配置tomcat

  1. 新建一个非maven的web工程

  1. 修改上下文路径

Servlet程序

servlet - server applet - 运行在服务器端的java程序.

在mvc框架[本身不是一门具体的技术,一套思想] - servlet担任的角色 - C - 控制器

三种具体的实现

  1. 写一个类去实现javax.servlet.Servlet[I]

  2. 写一个类去继承了.javax.servlet.GenericServlet[C] - 支持通用协议的servlet

    GenericServlet[C] 实现了 Servlet[I]

  3. 写一个类去继承javax.servlet.http.HttpServlet[C] - 专门支持http协议的servlet

    HttpServlet 继承了 GenericServlet

Servlet配置

xml配置

web.xml中进行配置,每个servlet的实例都是由tomcat来实例化的.

<?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">
 
<!--    配置servlet-->
 <servlet>
<!--        servlet-name必须要保证唯一性.-->
     <servlet-name>FirstServlet</servlet-name>
     <servlet-class>tech.aistar.controller.day01.FirstServlet</servlet-class>
 </servlet>
 
<!--    配置映射路径-->
 <servlet-mapping>
     <servlet-name>FirstServlet</servlet-name>
     <url-pattern>/day01/first</url-pattern>
 </servlet-mapping>
</web-app>

浏览器url:http://localhost:8081/servlet-j03s/day01/first

url - 统一资源定位器,服务器上的每个资源都应拥有唯一的url,组成部分

  1. 当启动tomcat服务器的时候,它会加载web.xml文件 - web.xml文件已经在内存中.
  1. http协议 - 无状态的协议.server是不能够识别出俩次请求来自于同一个客户端的.
  2. localhost - 服务器所在主机的ip地址.
  3. 8081 - 端口号,一个端口号对应一个服务器[软件]
  4. servlet-j03s - 项目的上下文路径[同一个服务器上的项目的上下文路径应该是唯一的]
  5. /day01/first - 资源的映射路径

精确匹配的过程

  1. /day01/first到web.xml文件中去找url-pattern是/day01/first的,如果找不到,报错一个HTTP状态404.
  2. 如果找到了,继续取出url-pattern标签的上一个兄弟标签servlet-name标签体中的值 - FirstServlet
  3. 到所有的servlet标签中去寻找是否存在servlet-name是否为FirstServlet
  4. 如果存在,继续取出servlet-class - [servlet程序对应的类的全限定名]
  5. 底层反射构造出该servlet程序的实例

注解配置

package tech.aistar.controller.day01;

import javax.servlet.GenericServlet;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebServlet;
import java.io.IOException;

/**
 * 本类用来演示:
 * GenericServlet 实现了 Servlet接口
 *
 * 1. GenericServlet - 已经实现了除了service方法的其余的四个方法
 * 2. GenericServlet必然会存在抽象的service方法
 * 3. GenericServlet抽象类
 *
 * @author: success
 * @date: 2021/10/12 3:16 下午
 */
@WebServlet(urlPatterns = "/day01/two")
public class TwoServlet extends GenericServlet {

    /**
     * service方法才是真正来接受来自于客户端的请求
     * 已经响应客户端请求的业务方法
     * @param servletRequest
     * @param servletResponse
     * @throws ServletException
     * @throws IOException
     */
    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        System.out.println("service...");
    }
}

Servlet生命周期

init,service[doGet,doPost],destroy方法

第一阶段 - Servlet何时被实例化

1. 如果配置了<load-on-startup>0</load-on-startup>

   如果配置了0或者正数,意味着启动tomcat的时候,就会立即初始化该servlet实例,并且利用该实例立即去调用init方法.

   如果值一样,根据上下的配置顺序.如果值不一样.数值越小,优先级越高.

2. 如果没有配置

   当请求第一次到达的时候,tomcat容器会初始化该servlet的实例.然后利用该实例立即去调用init方法

init方法仅仅只会执行1.

第二阶段

来自于client端的请求永远是永远是先到达service方法.如果本servlet中没有重写service方法

那么会自动进入到父类HttpServlet中的service方法,根据请求的方式来决定调用doGet方法还是doPost方法.

再在重写之后的doGet方法或者doPost方法中来处理请求和响应.

第三阶段

当我们关闭tomcat的时候,会调用destroy方法.

get请求和post请求区别

(1).get请求一般用于获取数据,post请求一般用于需要发数据到后台时使用

(2).get请求的参数,会放在url上,所以安全性,隐私性会比较差,post请求的参数会放在request.body中,比较的安全

(3).get请求不受到刷新,回退的影响,post请求则会在网页回退或者刷新后,重新进行发送

(4).get请求会被缓存,post请求不会被缓存

(5).get请求会被记录在浏览器的历史记录中,post请求则不会被记录

(6).get请求可以被收藏为标签,post不能被收藏为标签

(7).get请求只能进行url编码,post请求则支持多种编码

(8).get请求通常通过url地址栏请求,post通常通过表单发送数据请求

(9). post请求url长度理论上没有限制,get请求有限制[不同的浏览器不一样]

中文乱码的处理

post请求乱码问题怎么解决

//post请求处理中文乱码问题 - 接受参数之前
req.setCharacterEncoding("utf-8");

转发和重定向

  1. 转发发生在服务器端的跳转
  2. 共享request作用域中的数据
  3. 地址栏不变
  1. 重定向发生在客户端的跳转
  2. 至少2次请求,不能获取request作用域中的数据
  3. 地址栏是会发生变化的
  4. 可以重定向到其他站点

三大作用域

  1. request作用域 - HttpServletRequest,一次请求,一次响应.
  2. session作用域 - HttpSession - 一次会话期间,浏览器开启,浏览器关闭
  3. application作用域 - ServletContext - 服务器开启 - 服务器关闭 - 整个应用期间

映射路径的匹配方式

  1. 精确匹配

  2. 模糊匹配

    @WebServlet(urlPatterns = "/day02/*")
    
  3. 后缀匹配

结论: 精确匹配>模糊匹配>后缀

HttpServletRequest

  1. extends javax.servlet. ServletRequest[I]
  2. 所有的请求的信息都被封装到了HttpServletRequest对象中

HttpServletResponse

  1. extends javax.servlet. ServletResponse[I]
  2. 所有的响应给客户端的信息全部封装到这个对象中了.

URL和URI

  1. URI:Uniform Resource Identifier,统一资源标识符 上下文路径+映射路径[唯一的,对应唯一一个资源,标识资源的]
  2. URL:Uniform Resource Location 统一资源定位符

URI是包含URL

URI,是统一资源标识符,用来唯一的标识一个资源。而URL是统一资源定位器,它是一种具体的URI,即URL可以用来标识一个资源

Cookie

api: javax.servlet.http.Cookie[C]

  1. 可以用来存放少量的信息,每个cookie存储的量不能超过4kb

  2. Cookie可以在server端创建并且发送给客户端[浏览器]

  3. 保存在客户端

  4. Cookie的value可以用来唯一标识一个客户端,所以cookie通常可以用来作为session的跟踪机制

    4-1. cookie是如何管理session

    4-2. 会话跟踪的技术有哪些?

  5. cookie对象拥有name和value[单个]和一些可操作的选项[比如设置cookie的过期时间]

  6. The servlet sends cookies to the browser by using the HttpServletResponse.addCookie(javax.servlet.http.Cookie) method,通过响应头信息将cookie发送给client[brower]

  7. 每个浏览器为每个web server最多只能保存20个cookie

  8. 每个浏览器最多支持保存300个cookie

  9. 客户端是通过请求头信息将cookie再次发送给server端,由server端进行解析 - HttpServletRequest.getCookies() method.

Session会话跟踪机制

诞生背景:session为什么要进行管理?

原因:通过http协议发送的请求,http协议无状态的协议 - server不能够判断后续的多次请求是来自于同一个客户端[server本身不标识客户端.]

  1. 何时才会创建session空间

    1-1. 当后端代码中第一次出现req.getSession();

    1-2. 第一次访问jsp文件,只要设置成false,就不会创建session空间.

    <%@ page contentType="text/html;charset=UTF-8" language="java" session="true" %>
    
  2. 当第一次请求到达req.getSession();的时候,tomcat服务器会创建一个Session空间,并且给这个空间分配一个唯一的id

    接着创建了cookie,这个cookie中存放了这个空间的id,并且通过响应头信息将这个cookie发送到client端,并且保存在client

  3. 后续的请求会带上存储sessionid的cookie一起发送到server端.由tomcat解析cookie中的session空间的id,然后将这个client联系到这个client对应的session空间


文章作者: 码农耕地人
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 码农耕地人 !
  目录