JavaWeb与Tomcat知识点总结

一、servlet

1.1 servlet执行原理

  1. 当服务器接受到客户端浏览器的请求后,会解析请求URL路径,获取访问的Servlet的资源路径

  1. 查找web.xml文件,是否有对应的<url-pattern>标签体内容。如果有,则在找到对应的<servlet-class>全类名。以下为web.xml格式:

<!--配置Servlet -->
<servlet>
    <servlet-name>demo1</servlet-name>
    <servlet-class>web.servlet.ServletDemo1</servlet-class>
</servlet>

<servlet-mapping>
    <servlet-name>demo1</servlet-name>
    <url-pattern>/demo1</url-pattern>
</servlet-mapping>
  1. tomcat会将字节码文件加载进内存,并且创建其对象

  1. 调用其方法(init、service、distroy等等)

1.2 servlet生命周期

  1. 被创建:执行init方法,只执行一次

  1. Servlet什么时候被创建?
  1. 默认情况下,第一次被访问时,Servlet被创建

  1. 如何配置执行Servlet的创建时机?
  1. 在<servlet>标签下配置

  1. 第一次被访问时,创建

  • <load-on-startup>的值为负数

  1. 在服务器启动时,创建

  • <load-on-startup>的值为0或正整数

  1. Servlet的init方法,只执行一次,说明一个Servlet在内存中只存在一个对象,Servlet是单例
  • 多个用户同时访问时,可能存在线程安全问题。

  • 解决:尽量不要在Servlet中定义成员变量。即使定义了成员变量,也不要对修改值

  1. 提供服务:执行service方法,执行多次

  • 每次访问Servlet时,Service方法都会被调用一次。

  1. 被销毁:执行destroy方法,只执行一次

  • Servlet被销毁时执行。服务器关闭时,Servlet被销毁

  • 只有服务器正常关闭时,才会执行destroy方法。

  • destroy方法在Servlet被销毁之执行,一般用于释放资源

1.3 servlet3.0的注解配置

  1. 好处

  • 支持注解配置。可以不需要web.xml了。

  1. 步骤

1. 创建JavaEE项目,选择Servlet的版本3.0以上,可以不创建web.xml
2. 定义一个类,实现Servlet接口
3. 复写方法
4. 在类上使用@WebServlet注解,进行配置
* @WebServlet("资源路径")

1.4 servlet体系结构

Servlet -- 接口
|
GenericServlet -- 抽象类
|
HttpServlet -- 抽象类
  1. GenericServlet

  • 将Servlet接口中其他的方法做了默认空实现,只将service()方法作为抽象。将来定义Servlet类时,可以继承GenericServlet,实现service()方法即可

  1. HttpServlet(最主要的用法)

  • 定义:对http协议的一种封装,简化操作

  • 步骤

  1. 定义类继承HttpServlet

  1. 复写doGet/doPost方法


二、HTTP

2.1 数据请求格式

  1. 请求行

请求方式

请求url

请求协议

/版本

GET

/login.html

HTTP

/1.1

  • 请求方式:

  • HTTP协议有7中请求方式,常用的有2种

  1. GET:

  1. 请求参数在请求行中,在url后。

  1. 的url长度有限制的

  1. 不太安全

  1. POST:

  1. 请求参数在请求体

  1. 请求的url长度没有限制的

  1. 相对安全

  1. 请求头:客户端浏览器告诉服务器一些信息

  • 请求头名称: 请求头值

  • 常见的请求头:

  1. User-Agent:浏览器告诉服务器,我访问你使用的浏览器版本信息

  • 可以在服务器端获取该头的信息,解决浏览器的兼容性问题

  1. Referer:http://localhost/login.html

  • 告诉服务器,我(当前请求)从哪里来?

  1. 作用:

  1. 防盗链;

  1. 统计工作;

  1. 请求空行

空行,就是用于分割POST请求的请求头,和请求体的。

  1. 请求体(正文):

封装POST请求消息的请求参数的

2.2 响应消息数据格式

  1. 响应行

  • 组成:协议/版本 响应状态码 状态码描述

  • 响应状态码:服务器告诉客户端浏览器本次请求和响应的一个状态。

  • 状态码都是3位数字

  • 分类:

  1. 1xx:服务器就收客户端消息,但没有接受完成,等待一段时间后,发送1xx多状态码

  1. 2xx:成功。代表:200

  1. 3xx:重定向。代表:302(重定向),304(访问缓存)

  1. 4xx:客户端错误。

  • 代表:

  1. 404(请求路径没有对应的资源)

  1. 405:请求方式没有对应的doXxx方法

  1. 5xx:服务器端错误。代表:500(服务器内部出现异常)

  1. 响应头:

  • 格式:头名称: 值

  • 常见的响应头:

  1. Content-Type:服务器告诉客户端本次响应体数据格式以及编码格式

  1. Content-disposition:服务器告诉客户端以什么格式打开响应体数据

  • 值:

  1. in-line:默认值,在当前页面内打开

  1. attachment;filename=xxx:以附件形式打开响应体。文件下载

  1. 响应空行

  1. 响应体:传输的数据


三、Request和Response

3.1 Request

3.1.1 继承体系结构

ServletRequest -- 接口
| 继承
HttpServletRequest -- 接口
| 实现
org.apache.catalina.connector.RequestFacade 类(tomcat)

3.1.2 功能

  1. 获取请求消息数据
  1. 获取请求行数据

  1. 获取请求方式

String getMethod()  
  1. 获取虚拟目录

String getContextPath()
  1. 获取Servlet路径

String getServletPath()
  1. 获取get方式请求参数

String getQueryString()
  1. 获取请求URI

String getRequestURI()
StringBuffer getRequestURL()                 
  1. 获取协议及版本:HTTP/1.1

String getProtocol()
  1. 获取客户机的IP地址:

String getRemoteAddr()
  1. 获取请求头数据

  1. 通过请求头的名称获取请求头的值

String getHeader(String name)
  1. 获取所有的请求头名称

Enumeration<String> getHeaderNames()
  1. 获取请求体数据

  • 注意:只有POST请求方式,才有请求体,在请求体中封装了POST请求的请求参数

  • 步骤:

1. 获取流对象

BufferedReader getReader()     //获取字符输入流,只能操作字符数据
ServletInputStream getInputStream()     //获取字节输入流,可以操作所有类型数据

2. 再从流对象中拿数据

  1. 其他功能
  1. 获取请求参数通用方式

  • 注意:不论get还是post请求方式都可以使用下列方法来获取请求参数

String getParameter(String name)     //根据参数名称获取参数值    
String[] getParameterValues(String name)     //根据参数名称获取参数值的数组 
Enumeration<String> getParameterNames()     //获取所有请求的参数名称
Map<String,String[]> getParameterMap()     //获取所有参数的map集合
  • 乱码问题:在获取参数前,设置request的编码request.setCharacterEncoding("utf-8");

  1. 请求转发

  1. 步骤:

  1. 通过request对象获取请求转发器对象:

RequestDispatcher getRequestDispatcher(String path)
  1. 使用RequestDispatcher对象来进行转发:

requestDispatcher.forward(ServletRequest request, ServletResponse response) 
  1. 共享数据:

  • request域:代表一次请求的范围,一般用于请求转发的多个资源中共享数据

  • 一些方法:

void setAttribute(String name,Object obj) //存储数据
Object getAttitude(String name) //通过键获取值
void removeAttribute(String name) //通过键移除键值对

3.2 Response

  • 功能

  1. 设置响应行

  • 格式:HTTP/1.1 200 ok

  • 设置状态码:setStatus(int sc)

  1. 设置响应头:setHeader(String name, String value)

  1. 设置响应体:

  • 使用步骤:

  1. 获取输出流

  1. 字符输出流:PrintWriter getWriter()

  1. 字节输出流:ServletOutputStream getOutputStream()

  1. 使用输出流,将数据输出到客户端浏览器

  1. 重定向:

response.sendRedirect("/demo/responseDemo2")

3.3 转发和重定向的区别

这篇博文和详细:

什么是转发和重定向_重定向和转发_涩即是Null的博客-CSDN博客


四、ServletContext对象

4.1 概念

代表整个web应用,可以和程序的容器(服务器)来通信。

4.2 获取

  1. 通过request对象获取

  • request.getServletContext();

  1. 通过HttpServlet获取

  • this.getServletContext();

4.3 功能

  1. 获取MIME类型:

  • MIME类型:在互联网通信过程中定义的一种文件数据类型

  • 格式: 大类型/小类型 text/html image/jpeg

  • 获取:String getMimeType(String file)

  1. 域对象:共享数据

  • setAttribute(String name,Object value)

  • getAttribute(String name)

  • removeAttribute(String name)

  • ServletContext对象范围:所有用户所有请求的数据

  1. 获取文件的真实(服务器)路径

  • 方法:String getRealPath(String path)

String b = context.getRealPath("/b.txt");//web目录下资源访问
System.out.println(b);
String c = context.getRealPath("/WEB-INF/c.txt");//WEB-INF目录下的资源访问
System.out.println(c);
String a = context.getRealPath("/WEB-INF/classes/a.txt");//src目录下的资源访问
System.out.println(a);

五、cookie和session

5.1 cookie

5.1.1 如何使用cookie

  1. 创建Cookie对象,绑定数据

Cookie cookie = new Cookie(String name, String value);
  1. 发送Cookie对象

response.addCookie(Cookie cookie) 
  1. 获取Cookie,拿到数据

Cookie[] cookies = request.getCookies()  

5.1.2 实现原理是什么

基于响应头set-cookie和请求头cookie实现

5.1.3 常见问题解答

  1. 一次可不可以发送多个cookie?
  • 可以创建多个Cookie对象,使用response调用多次addCookie方法发送cookie即可。

  1. cookie在浏览器中保存多长时间?
  1. 默认情况下,当浏览器关闭后,Cookie数据被销毁

  1. 持久化存储:

  • setMaxAge(int seconds)

  1. 正数:将Cookie数据写到硬盘的文件中。持久化存储。并指定cookie存活时间,时间到后,cookie文件自动失效

  1. 负数:默认值

  1. 零:删除cookie信息

  1. cookie能不能存中文?
  • 在tomcat 8 之前 cookie中不能直接存储中文数据。需要将中文数据转码---一般采用URL编码(%E3)

  • 在tomcat 8 之后,cookie支持中文数据。特殊字符还是不支持,建议使用URL编码存储,URL解码解析

  1. cookie共享问题?
  1. 假设在一个tomcat服务器中,部署了多个web项目,那么在这些web项目中cookie能不能共享?

  • 默认情况下cookie不能共享

  • setPath(String path):设置cookie的获取范围。默认情况下,设置当前的虚拟目录。如果要共享,则可以将path设置为"/"

  1. 不同的tomcat服务器间cookie共享问题?

  • setDomain(String path):如果设置一级域名相同,那么多个服务器之间cookie可以共享

  • setDomain(".baidu.com"),那么tieba.baidu.com和news.baidu.com中cookie可以共享

5.1.4 cookie的特点及作用

  1. cookie存储数据在客户端浏览器

  1. 浏览器对于单个cookie 的大小有限制(4kb) 以及 对同一个域名下的总cookie数量也有限制(20个)

  1. 作用:

  1. cookie一般用于存出少量的不太敏感的数据

  1. 在不登录的情况下,完成服务器对客户端的身份识别

5.2 session

5.2.1 如何使用session

  1. 获取HttpSession对象:

HttpSession session = request.getSession();
  1. 使用HttpSession对象:

Object getAttribute(String name)  
void setAttribute(String name, Object value)
void removeAttribute(String name)  

注意:Session的实现是依赖于Cookie的。

5.2.2 常见问题解答

  1. 当客户端关闭后,服务器不关闭,两次获取session是否为同一个?

默认情况下,不是。

如果需要相同,则可以创建Cookie,键为JSESSIONID,设置最大存活时间,让cookie持久化保存。

Cookie c = new Cookie("JSESSIONID",session.getId());
c.setMaxAge(60*60);
response.addCookie(c);
  1. 客户端不关闭,服务器关闭后,两次获取的session是同一个吗?

不是同一个,但是要确保数据不丢失。tomcat自动完成以下工作

  • session的钝化:

  • 在服务器正常关闭之前,将session对象系列化到硬盘上

  • session的活化:

  • 在服务器启动后,将session文件转化为内存中的session对象即可。

  1. session什么时候被销毁?
  1. 服务器关闭

  1. session对象调用invalidate() 。

  1. session默认失效时间 30分钟

<session-config>
<session-timeout>30</session-timeout>
</session-config>

5.2.3 session的特点

  1. session用于存储一次会话的多次请求的数据,存在服务器端

  1. session可以存储任意类型,任意大小的数据

5.3 cookie与session的区别

  1. session存储数据在服务器端,Cookie在客户端。

  1. session没有数据大小限制,Cookie有。

  1. session数据安全,Cookie相对于不安全。


六、过滤器和监听器

6.1 过滤器Filter

6.1.1 如何使用过滤器

  1. 定义一个类,实现接口Filter

  1. 复写方法Filter内的方法

  1. 配置拦截路径(两种方法)

  1. web.xml

<filter>
    <filter-name>demo1</filter-name>
    <filter-class>web.filter.FilterDemo1</filter-class>
</filter>
<filter-mapping>
    <filter-name>demo1</filter-name>
    <!-- 拦截路径 -->
    <url-pattern>/*</url-pattern>
</filter-mapping>
  1. 注解

@WebFilter("/*")
public class FilterDemo1 implements Filter {
}

6.1.2 过滤器的生命周期

  1. init:在服务器启动后,会创建Filter对象,然后调用init方法。只执行一次。用于加载资源。

  1. doFilter:每一次请求被拦截资源时,会执行。执行多次。

  1. destroy:在服务器关闭后,Filter对象被销毁。如果服务器是正常关闭,则会执行destroy方法。只执行一次。用于释放资源。

6.1.3 过滤器如何放行

filterChain.doFilter(servletRequest,servletResponse);

6.1.3 过滤器的的拦截方式有哪些

在@WebFilter中有dispatcherTypes属性,其值有以下这些:

  1. REQUEST:默认值。浏览器直接请求资源

  1. FORWARD:转发访问资源

  1. INCLUDE:包含访问资源

  1. ERROR:错误跳转资源

  1. ASYNC:异步访问资源

6.1.4 多个过滤器的执行顺序问题

例如有过滤器1和过滤器2两个过滤器,则执行顺序为

过滤器1创建
过滤器2创建
资源执行
过滤器2销毁
过滤器1 销毁

但是,也并不总是这样,如下:

  1. 注解配置:按照类名的字符串比较规则比较,值小的先执行

  • 如: AFilter 和 BFilter,AFilter就先执行了。

  1. web.xml配置: <filter-mapping>谁定义在上边,谁先执行

6.2 监听器Listener

6.2.1 事件监听机制的几个概念:

比如说点击按钮,

  1. 事件 :一件事情,比如“点击”事件。

  1. 事件源 :事件发生的地方,比如“按钮”。

  1. 监听器 :一个对象或一段代码

  1. 注册监听:将事件、事件源、监听器绑定在一起。 当事件源上发生某个事件后,执行监听器代码。

6.2.2 配置监听器的步骤

  1. 定义一个类,实现ServletContextListener接口

  1. 复写其中的方法

  1. 配置

  1. web.xml

<listener>
    <listener-class>web.listener.ContextLoaderListener</listener-class>
</listener>
  1. 注解:

直接在类上加 @WebListener

猜你喜欢

转载自blog.csdn.net/weixin_51418964/article/details/129205660