JavaWeb 基础知识整理

1 HTTP

HTTP 协议知识整理

1.1 HTTP 简介

  • HTTP(超文本传输协议)是一种请求-响应协议,基于TCP协议,用来传递数据。

  • 通常,由HTTP客户端发起一个请求,创建一个到服务器指定端口(默认是80端口)的TCP连接。HTTP服务器则在那个端口监听客户端的请求。一旦收到请求,服务器会向客户端返回一个状态。

  • 特点:

    1. 无连接:每次连接只处理一个请求。处理完请求后断开连接。
    2. 无状态:对于事务处理没有记忆功能。
    3. 媒体独立:只要客户端和服务器知道如何处理数据内容,任何类型的数据都可以通过 HTPP 发送。客户端以及服务器指定使用适合的 MIME-type 内容类型。

1.2 HTTP 版本

  • HTTP/0.9(已过时):只接受GET请求
  • HTTP/1.0:第一个在通讯中指定版本号的HTTP协议版本
  • HTTP/1.1:默认使用流水线方式的持久连接方式
    • 非持久连接:每次传输都要建立TCP连接,传输完成后断开TCP连接。
    • 持久连接:当传输完时,TCP连接会保留一段时间。
      • 非流水线方式:客户在收到前一个相应,才能发出后一个请求。
      • 流水线方式:所有的请求和相应都是连续发送的。
  • HTTPS:HTTP 下加入 SSL 层,使用 SSL 加密传输协议,并非明文传输,端口号为443。
  • SPDY:HTTP 之前做了一层会话层。引入了一个新的二进制分帧数据层。 强制使用 HTTPS。
  • HTTP/2:基于SPDY,但支持明文的HTTP传输。
    1. 使用二进制分帧层
    2. 可以并行发送多个请求(多路复用)
    3. 数据流优先级:因为请求并行发送,要对数据设置优先级
    4. 服务端推送:除了发送客户端需要的请求外,还发送一些请求之外的内容。
    5. 头部压缩

1.3 HTTP 报文

JavaWeb 基础知识整理_第1张图片

  • 开始行(请求行、响应行):用于区分是请求报文还是响应报文。
  • 首部行(请求头、响应头):用于说明浏览器或服务器报文主体的信息。
  • 实体主体(请求体、响应体)

1.4 HTTP 请求类型

方法 说明
GET 获取 Request-URI 所标识的资源
POST Request-URI 所标识的资源后附加新的数据
HEAD 请求获取 Request-URI 标识资源的响应头
DELETE 请求删除 Request-URI 所标识的资源
PUT 请求服务器存储一个资源
OPTIONS 请求服务器性能或查询与资源相关的选项和需求
TRACE 测试或诊断
CONNECT 保留以备后用

1.5 GET 和 POST 区别

GET POST
地址栏显示
安全性
长度限制

1.6 HTTP 响应

  • 1xx 消息(已接受)
  • 2xx 成功:200(请求成功)
  • 3xx 重定向:302
  • 4xx 客户端错误:400(语法错误) 401(未授权) 403(拒绝服务) 404(资源不存在)405(不支持当前请求方式)
  • 5xx 服务器错误:500(不可预期错误) 503(暂时不能处理请求)

1.7 MIME 类型

Content-Type 类型格式是“大类型/小类型”,浏览器通常使用 MIME 类型来确定如何处理URL

MIME 类型文档

2 Servlet 程序

2.1 Servlet 简介

工程路径
JavaWeb 基础知识整理_第2张图片

快速创建
JavaWeb 基础知识整理_第3张图片

  • Servlet = Service + Applet,运行在服务器上的小程序

  • 实现 Servlet 程序步骤

    1. 实现 Servlet 接口(或继承 HTTPServlet)

      public class TestServlet implements Servlet
      
    2. 配置 web.xml

        
        <servlet>
            <servlet-name>testservlet-name>
            <servlet-class>com.wang.servlet.TestServletservlet-class>
        servlet>
        
        <servlet-mapping>
            <servlet-name>testservlet-name>
            <url-pattern>/testurl-pattern>
        servlet-mapping>
      
    3. service(默认调用,一般不用)doGet doPost doXXX…

2.2 生命周期

接收请求 到 Tomcat 关闭

  1. 接收请求 调用构造器方法

    
    <load-on-startup>1load-on-startup>
    
  2. init 方法

  3. service 方法

  4. Tomcat 关闭调用 destroy 方法

2.3 ServletConfig

每个 Servlet 程序都有自己对应的 ServletConfig

重写 init 方法要调用父类的 init 方法

  1. 获取 Servlet 程序的别名
  2. 获取初始化参数
  3. 获取 ServletContext 对象

获取ServletConfig

ServletConfig config = this.getServletConfig();

2.4 ServletContext

一个 web 工程只有一个,由服务器创建,所有用户共享

  1. 获取 web.xml 中位置的上下文参数
  2. 获取当前工程路径
  3. 获取部署在服务器的绝对路径
  4. 存储数据

获取 ServletContext 方式

// 方式1
ServletContext context = this.getServletContext();
// 方式2
ServletContext context = this.getServletConfig().getServletContext();
// 方式3
ServletContext context = request.getSession().getServletContext();

2.5 Request 与 Response

每次只要有请求进入服务器,服务器会把请求过来的HTTP协议信息解析好,封装成对象中,传递到 service 方法。

HTTPServletReques 表示请求过来的信息,请求行、请求头、请求体,也可以在里面放对象

HTTPServletResponse 表示所有响应的信息,响应行、响应头、响应体

2.6 转发(递归)

JavaWeb 基础知识整理_第4张图片

  1. 同时转发了 HttpServletRequest 域
  2. 是一次请求
  3. 可以访问 WEB-INF 目录下的文件
req.getRequestDispatcher("1.jsp").forward(request,response);

2.7 重定向(迭代)

JavaWeb 基础知识整理_第5张图片

  1. 两次请求
  2. 可以访问工作目录以外的文件
//方式1
resp.setStatus(302);
resp.sendRedirect("1.jsp");
//方式2
res.setHeader("Location","http://www.baidu.com");
//方式3:超链接
//方式4:表单提交

2.8 乱码问题

译码与解码不匹配

Tomcat 默认 iso-8859-1

get 请求:改 Tomcat 配置文件

post 请求:设置 Request 的字符编码格式

响应乱码:设置 Response 的字符编码格式

2.9 Servlet 三大域对象

不同域的数据共享

  1. Request:一次请求共享
  2. Session:一次会话共享
  3. ServletContext:整个 servlet 共享

3 Cookie 与 Session

HTTP 是无状态的协议,交互结束后,不会保存任何信息

3.1 Cookie 基本使用

// 1. 创建Cookie
Cookie cookie = new Cookie("hello","world");
// 2. 添加到response
response.addCookie(cookie);

当次请求如果设置 Cookie 则会在响应头出现 Set-Cookie

JavaWeb 基础知识整理_第6张图片

在以后的 所有请求头 中的 Cookie 里都会有已设置 Cookie 的信息

可以为 Cookie 设置路径,使某些路径请求头不带上 Cookie

JavaWeb 基础知识整理_第7张图片

默认存储在客户内存中,浏览器退出则失效;设置过期时间为其持久化

3.2 Session 基本使用

// 获取session
HttpSession session = request.getSession(); 
  1. 默认传 true,session 存在时返回,不存在时创建并返回
  2. 传 false 时,若 session 不存在不会创建

服务器默认存储时长为30分钟,可以设置过期时间

3.3 Session 工作原理

一般每个会话维护一个 Session

  1. 写入 Session 列表:Session 列表以 Map 形式管理,key 为 32 位随机串(称为 JSESSIONID),value 为 Session 对象的引用。当服务端 Servlet 执行到 request.getSession() 后就会形成这样的键值对。
  2. 服务器生成并发送 Cookie:Session 写入列表后,生成一个 key 为 ”JSESSIONID“,value 为32位随机串的 Cookie,发送到客户端。
  3. 客户端接收并发送 Cookie:浏览器接收到 Cookie 并缓存在浏览器中,当第二次请求时,会伴随着请求的头部信息一块发送。
  4. 从 Session 列表中查找:服务器收到的 JSESSIONID 找到对应的 Session 对象。

因为 JSESSIONID 是临时 Cookie,所以关闭浏览器后丢失,所以每次会话都会创建新的 JSESSIONID,所以每次会话请求的 Session 对象不同

JSESSIONID 不能直接从 Cookie 里获取,但是你可以覆盖

HttpSession session = request.getSession();
Cookie jsessionid = new Cookie("JSESSIONID", session.getId());
jsessionid.setMaxAge(3*60*60);
response.addCookie(jsessionid);

3.4 Session VS Cookie

Session Cookie
存储位置 服务器端 客户端
默认时效 30分钟 关闭丢失

3.5 解决 Cookie 禁用后,Session 跟踪问题

//1. 解决重定向
url = response.encodeRedirectURL(url);
//2. 解决非重定向
url = encodeURL(URL);
//会将JssesionID暴露在URL中

4 Filter 过滤器

4.1 过滤器作用

  1. 过滤网站数据
  2. 处理乱码
  3. 登录验证

4.2 处理乱码

  1. 实现 Filter 接口
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) {
	req.setCharacterEnconding("utf-8");
    resp.setCharacterEnconding("utf-8");
    resp.setContentType("text/html;charset=UTF-8");
    chain.doFilter(req,reps); //使请求继续
}
  1. 配置 xml 文件
<filter>
    <filter-name>filterfilter-name>
    <filter-class>com.wang.Filter.CharacterEncodingFilterfilter-class>
filter>
<filter-mapping>
    <filter-name>filterfilter-name>
    <url-pattern>/url-pattern>
filter-mapping>

5 Listener 监听器

某个事件产生前后做点什么

5.1 监听对象

监听对象 监听接口
ServletContext ServletContextListener、ServletContextAttributeListener
HttpSession HttpSessionListener、HttpSessionActivationListener、HttpSessionAttributeListener、HttpSessionBindingListener
ServletRequest ServletRequestListener、ServletRequestAttributeListener

5.2 基本使用

  1. 实现接口
  2. 配置 xml 文件
<listener>
    <listener-class>com.wang.listener.MyListenerlistener-class>
listener>

6 补充

6.1 Base 标签

<base href=""/>

设置页面相对路径工作时参照的地址

6.2 web 中的 /

  1. 浏览器解析:http://ip:port/
  2. 服务器解析:http://ip:port/工程路径/
  3. 特殊情况:response.sendRediect("/"); 解析得到http://ip:port/

不管有多少个/,只要是连续的,都视为一个/

6.3 ANT 风格路径

Servlet、Filter、Listener 映射匹配使用的是 ANT 风格

通配符 说明
? 匹配任何单字符
* 匹配任意多个字符
** 匹配任意目录

最长匹配原则:若有多个映射匹配成功,选择最长最精确的

6.4 注解方式

配置文件的方式比较麻烦,可以为 Servlet、Filter、Listener 添加注解@WebServlet@WebFilter@WebListener

6.5 springboot 中使用

  1. 给 Servlet、Filter、Listener 添加对应的注解@WebServlet@WebFilter@WebListener
@WebServlet(urlPatterns = "/hi")
public class HiServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("hello");
    }
}
  1. 启动类 @ServletComponentScan
@SpringBootApplication
@ServletComponentScan
public class ServletApplication {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}
  1. 注入 IOC 容器
@Configuration
public class ServletConfig {
    @Bean
    public ServletRegistrationBean<HiServlet> getServletRegistrationBean(){
        return new ServletRegistrationBean<>(new HiServlet(),"/hi");
    }
}

你可能感兴趣的:(Java,java,servlet)