JavaEE--JavaWeb核⼼之Servlet(笔记)

1.Servlet简介

1.1 什么是Servlet

Servlet 运⾏在服务端的Java⼩程序,是sun公司提供⼀套规范(接⼝),⽤来处理客户端请求、响应给浏览器的动态资源。但servlet的实质就是java代码,通过java的API动态的向客户端输出内容。
servlet规范:包含三个技术点

  1. servlet技术
  2. filter技术—过滤器
  3. listener技术—监听器

1.2 Servlet快速入门

在这里插入图片描述
1.Http请求 request
请求行: GET /day02_war_exploded/index.html HTTP/1.1
GET: 请求方式[method] GET POST PUT DELETE
POST: 只有在Form表单method=post时候
特点: 参数隐藏, 请求体中
参数大小没有限制, 可以是文件
GET: 直接访问, 超链接, method=get等
特点: 参数是添加在url后面 ? 连接
参数大小有限制
/day02_war_exploded/index.html: 资源地址URI
HTTP/1.1: 协议和版本
请求头: map, 客户端的基本信息
请求体: post请求方式提交的参数
Http响应 response
响应行: HTTP/1.1 200
HTTP/1.1: 协议和版本
200: 状态码 正常 [status]
304: 访问缓存
404: 资源未找到
500: 服务器端代码(java代码)异常
302: 重定向
响应头: map, 服务器端封装的数据
响应体: 服务器响应内容
一个页面[html代码]
一个文件
一些数据…
在这里插入图片描述
描述整一个过程
在这里插入图片描述

2.Servlet的API(⽣命周期)

2.1 servlet接口中的3个方法

  1. init(ServletConfig servletConfig)
    何时执⾏:servlet对象创建的时候执行,即在第一次访问时执行
    ServletConfig : 代表的是该servlet对象的配置信息
  2. service(ServletRequest servletRequest, ServletResponse servletResponse)
    何时执⾏:每次请求都会执⾏
    ServletRequest :代表请求,认为ServletRequest 内部封装的是http请求的信息
    ServletResponse :代表响应,认为要封装的是响应的信息
  3. destroy()
    何时执⾏:servlet销毁的时候执⾏

2.2 servlet问题

  1. 问题:对XXXServlet进⾏了10次访问,init(),destory(),service(),doGet(),doPost()⼀共执⾏了多少次?request对象创建⼏个?response创建⼏个?
  2. 答:1;0;1;get和post共10次;10;10

3.Servlet的配置

3.1 Servlet规范

  1. 自定义类, 实现Servlet接口
  2. 着重实现3个方法
  3. 注册Servlet 应用的web.xml
  <servlet>
        <servlet-name>自定义名字
        <servlet-class>全限定类名
    </servlet>
    <servlet-mapping>
        <servlet-name>上面的名字[自定义名字]
        <url-pattern>/地址[自定义地址]
    </servlet-mapping>
  1. 访问: http://localhost:8080/day02_war_exploded/hello
<!-- 1.精确匹配: 只能通过 /hello 访问  -->
    <servlet>
        <servlet-name>Talon</servlet-name>
        <servlet-class>a_servlet01.HelloTalon</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>Talon</servlet-name>
        <url-pattern>/hello</url-pattern>
    </servlet-mapping>
    
<!-- 一个servlet资源可以对应多个url链接地址 -->
    <servlet>
        <servlet-name>Demo01</servlet-name>
        <servlet-class>a_servlet01.HelloDemo01</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>Demo01</servlet-name>
        <url-pattern>/demo01</url-pattern>
        <url-pattern>/DEMO01</url-pattern>
        <url-pattern>/hello/demo01</url-pattern>
    </servlet-mapping>

<!-- 2.使用通配符匹配(目录匹配) 可以通过 /hello/任意地址 来访问 -->
    <servlet>
        <servlet-name>Demo02</servlet-name>
        <servlet-class>a_servlet01.HelloDemo02</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>Demo02</servlet-name>
        <url-pattern>/hello/*</url-pattern>
    </servlet-mapping>

<!-- 3.后缀匹配 可以通过 任意名字.user 来访问 -->
    <servlet>
        <servlet-name>Demo03</servlet-name>
        <servlet-class>a_servlet01.HelloDemo03</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>Demo03</servlet-name>
        <url-pattern>*.user</url-pattern>
    </servlet-mapping>

3.2 路径

  • URL: http://localhost:8080/… 绝对路径
  • URI: 以 / 开始的就是绝对路径
    URI -> URL 协议://ip:port/URI/应用名/xx资源

3.3 注解取代xml文件

注解: @xx @interface
注解属性: 类型 属性名() [default]
1.属性没有设定默认值时, 必须传参
2.只有当传入的属性只有一个, 并且属性名是value的时候, 属性名可以省略
3.属性类型是数组时, 又只有一个值, 可以不用{}
注解不是可以加在任意位置的, 注解是可以解析的 -> 反射
注解作用: 可以取代xml配置文件
JavaEE 从 3.0 开始支持注解
在这里插入图片描述

  • init方法来初始化
public class ServletDemo01 implements Servlet {
    @Override
    public void init(ServletConfig servletConfig) throws ServletException {
        //1.获得当前这个Servlet名字  servlet-name
        String servletName = servletConfig.getServletName();
        System.out.println(servletName);
        //2.获得servlet的初始化参数
        String initParameter = servletConfig.getInitParameter("encoding");
        System.out.println(initParameter);
        //获得所有初始化的名字
        Enumeration<String> names = servletConfig.getInitParameterNames();
        while (names.hasMoreElements()){
            String s = names.nextElement();
            String initParameter1 = servletConfig.getInitParameter(s);
            System.out.println(initParameter1);
        }

        //3.获得servletContext对象
        ServletContext servletContext = servletConfig.getServletContext();
        System.out.println(servletContext);
    }

4.ServletContext对象

4.1 什么是ServletContext对象

ServletContext代表是⼀个web应⽤的环境(上下⽂)对象ServletContext对象内部封装是该web应⽤的信息,ServletContext对象⼀个web应⽤只有⼀个。

  • 问题:⼀个web应⽤有⼏个servlet对象?---- 多个

ServletContext对象的⽣命周期?

  • 创建:该web应⽤被加载(服务器启动或发布web应⽤(前提,服务器启动状态))
  • 销毁:web应⽤被卸载(服务器关闭,移除该web应⽤)

4.2 ServletContext的作⽤

  • web.xml中配置初始化参数
<!-- 配置全局的初始化参数 -->
<context-param> 
	<param-name>driver</param-name> 
	<param-value>com.mysql.cj.jdbc.Driver</param-value>
</context-param>
  • 通过context对象获得参数
ServletContext application = servletRequest.getServletContext();

//1.获得应用的路径(名字)
String path = application.getContextPath();
System.out.println(path);

//2.获得应用的初始化参数 - web.xml
String configPath = application.getInitParameter("driver");
System.out.println(configPath);
  • 获得web应⽤中任何资源的绝对路径(重要 重要 重要
 //3.获得应用中资源的绝对路径 必须掌握
        // src/a.txt
        String aPath = application.getRealPath("WEB-INF/classes/a.txt");
        // web/b.txt
        String bPath = application.getRealPath("b.txt");
        // web/WEB-INF/c.txt
        String cPath = application.getRealPath("WEB-INF/c.txt");
        // day02工程/d.txt
        System.out.println(aPath);
        System.out.println(bPath);
        System.out.println(cPath);

3.3 ServletContext是⼀个域对象

  • 什么是域对象?什么是域?
    ⼀个有作⽤范围的对象,可以在范围内共享数据
  • ServletContext域对象的作⽤范围
    整个web应(所有的web资源都可以随意向ServletContext域中存取数据,数据可以共享)。
  • 域对象的通⽤的⽅法
    setAtrribute(String name,Object obj);
    getAttribute(String name);
    removeAttribute(String name);

3.4 案例:通过两个页面来完成点击+1访问量

这个是获取页面

package c_servletContext;

import javax.servlet.*;
import javax.servlet.annotation.WebServlet;
import java.io.IOException;
import java.util.Date;

@WebServlet("/servletContext/demo02")
public class servletContextDemo02 implements Servlet {
    @Override
    public void init(ServletConfig servletConfig) throws ServletException {

    }

    @Override
    public ServletConfig getServletConfig() {
        return null;
    }

    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        ServletContext context = servletRequest.getServletContext();
        context.setAttribute("date",new Date());
        Object num = context.getAttribute("read");
        if (num== null){
            context.setAttribute("read",1);
        }else {

            Integer n = (Integer)num;
            context.setAttribute("read",n+1);
        }

    }

    @Override
    public String getServletInfo() {
        return null;
    }

    @Override
    public void destroy() {

    }
}

这个是响应情况页面

package c_servletContext;

import javax.servlet.*;
import javax.servlet.annotation.WebServlet;
import java.io.IOException;
import java.util.Date;

@WebServlet(value = "/servletContext/demo03")
public class servletContextDemo03 implements Servlet {
    @Override
    public void init(ServletConfig servletConfig) throws ServletException {

    }

    @Override
    public ServletConfig getServletConfig() {
        return null;
    }

    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        ServletContext context = servletRequest.getServletContext();
        Object date = context.getAttribute("date");
        System.out.println(date);
        System.out.println(context.getAttribute("read"));
    }

    @Override
    public String getServletInfo() {
        return null;
    }

    @Override
    public void destroy() {

    }
}

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值