转载

Servlet总结--补一补基础

Servlet会在服务器启动或第一次请求该Servlet的时候开始生命周期,在服务器结束的时候结束生命周期。无论请求多少次Servlet,最多只有一个Servlet实例。多个客户端并发请求Servlet时,服务器会启动多个线程分别执行该Servlet的service方法

概述

工作流程

  • Tomcat将浏览器提交的请求封装成HttpServletRequest对象,同时将输出流封装成HttpServletResponse对象
  • Tomcat把request、response作为参数,调用Servlet的相应方法,例如doGet(request, response)等
  • Servlet中主要处理业务逻辑

接口

实现javax.servlet.Servlet接口类,规定了特定的方法来处理特定的请求。开发者只需要实现Servlet的相关方法,用户访问Web程序的时候,Tomcat会调用这些方法完成业务处理

Java Web目录结构

文件夹 描述
/ Web应用根目录
/WEB-INF/ Tomcat会隐藏该文件夹下的所有文件及文件夹,保护它们不能通过浏览器直接访问
/WEB-INF/web.xml 主要的配置文件
/WEB-INF/classes/ 类文件,包括Servlet类
/WEB-INF/lib/ jar文件位置

配置

servlet

<servlet>
  <servlet-name>[唯一的名称]</servlet-name>
  <servlet-class>[包含包名的路径]</servlet-class>
  <init-param>
    <param-name>[配置名称]</param-name>
    <param-value>[配置值]</param-value>
  </init-param>
  <load-on-startup>1[0:请求时加载;1:启动时加载]</load-on-startup>
</servlet>
复制代码

访问路径配置 servlet-mapping

<servlet-mapping>
  <servlet-name>[同servlet配置中的名称对应]</servlet-name>
  <url-pattern>[访问路径]</url-pattern>
</servlet-mapping>
复制代码

上下文参数 context-param

全局共享,能够被所有的servlet读取

<context-param>
  <param-name>[配置名称]</param-name>
  <param-value>[配置值]</param-value>
</context-param>
复制代码

在Servlet类中,通过 getServletConfig.getServletContext 获取ServletContext,然后通过其方法获取相应上下文参数

Servlet生命周期

  • init
  • doGet
  • doPost
  • ...
  • Destroy

Servlet注解

  • @PostContructor
    • 在构造函数执行之后,init函数执行之前被调用
  • @PreDestroy
    • 在destroy方法之后,Servlet被彻底卸载之前被调用
  • 注解会影响服务器的启动速度
    • 服务器在启动时会遍历Web应用的WEB-INF/classes下的所有class文件与WEB-INF/lib下的jar文件以检查哪些类使用了注解

线程安全性

隐患原因

由于Servlet只会有一个实例,多个用户同时请求同一个Servlet时,Tomcat会派生出多条线程执行Servlet的代码,因此Servlet有线程不安全的隐患。

重定向

服务端重定向

通过RequestDispatcher对象的 forward(HttpServletRequest, HttpServletResponse) 来实现; 浏览器地址栏显示跳转前的Servlet访问地址

浏览器端重定向

  • 301 永久性重定向
    • 原有地址被搜索引擎移除
  • 302 临时性重定向
    • 有可能网页端地址不变,产生网址劫持隐患
    • Page Rank相关会受影响
原文  https://juejin.im/post/5efbc75ce51d4534a2086f3b
正文到此结束
Loading...