经常写业务代码,是时候补一补基础了😊
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相关会受影响