day08【Servlet入门】创建web项目、配置web.xml、部署web项目、生命周期相关、HttpServlet、响应状态码、@WebServlet注解

本文详细介绍Servlet的基础概念,包括其架构、生命周期、体系结构及3.0版本的注解配置。涵盖快速入门示例、请求与响应处理、配置详解及路径匹配技巧。

回顾

1. 软件的架构有哪两种
	B/S架构
	C/S架构

2. WEB资源分成哪两种
	静态资源:html、js、css
	动态资源:java代码(servlet、jsp)

3. Tomcat项目发布的三种方式
	放置到webapps目录下
	修改server.xml
	自定义xml文件【推荐】

4. Idea配置Tomcat,创建web项目,部署web项目
	javaEE7版本

5. 浏览器开发工具查看HTTP协议请求和响应内容

6. 请求内容
	请求行
		get
		post
	请求头
	请求体

7. 响应内容
	响应行
		200
		304
		404
	响应头
	响应体

Servlet入门

今日目标

1. 创建servlet
	xml
	anno(注解)
	
2. servlet执行原理

3. servlet生命周期

4. servlet体系结构

一 Servlet概述

  • servlet= server+applet 运行在服务器端的java程序。
  • Servlet是一个接口,一个类要想通过浏览器被访问到,那么这个类就必须直接或间接的实现Servlet接口

作用

接收请求,处理逻辑,响应结果

在这里插入图片描述

二 Servlet快速入门

目标:编写一个普通的java类,通过浏览器可以访问

2.1 代码编写

① 创建web项目

在这里插入图片描述

② 编写普通java类,实现servlet接口

冲写抽象方法(service方法)

public class QuickServlet implements Servlet {


    @Override
    public void init(ServletConfig servletConfig) throws ServletException {

    }

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

    // 对外提供服务
    /*
        request:代表请求
        response:代表响应
     */
    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        // 向浏览器响应一句话
        servletResponse.getWriter().write("QuickServlet");
    }

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

    @Override
    public void destroy() {

    }
}
③ 配置web.xml

配置servlet网络访问路径

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
         version="3.1">

    <!--
        把QuickServlet交给tomcat管理
            servlet-name:当前servlet的别名(使用类名即可)
            servlet-class:全限定类名
    -->
    <servlet>
        <servlet-name>QuickServlet</servlet-name>
        <servlet-class>cn.itcast.a_quick.QuickServlet</servlet-class>
    </servlet>
    <!--
        给servlet设置一个网络的访问地址(路径)
            servlet-name:给指定别名的servlet配置映射
            url-pattern:网络访问地址(注意:必须以/开头)
    -->
    <servlet-mapping>
        <servlet-name>QuickServlet</servlet-name>
        <url-pattern>/quickServlet</url-pattern>
    </servlet-mapping>
</web-app>
④ 部署web项目

在这里插入图片描述

⑤ 启动测试

在这里插入图片描述

2.2 执行原理【课下作业】

在这里插入图片描述

三 Servlet相关API

3.1 生命周期相关

3.1.1 思想介绍

  • 生命周期:指的是一个对象从生(创建)到死(销毁)的一个过程
// 1. servlet对象创建时,调用此方法
public void init(ServletConfig servletConfig);

// 2. 用户访问servlet时,调用此方法
public void service(ServletRequest servletRequest, ServletResponse servletResponse);

// 3. servlet对象销毁时,调用此方法
public void destroy();

在这里插入图片描述

* 创建
	1)默认情况下
		用户第一次访问时,创建servlet,执行init方法
	2)修改创建时机
		<load-on-startup></load-onstartup>
			正数:4-N  【服务器启动时,创建】
				补充:Tomcat的web.xml里有1,3 所以推荐4-n 
			负数(默认值):-1 【用户第一次访问时,创建】
	
* 运行(提供服务)
		用户每次访问时,都执行service方法

* 销毁
		服务器正常关闭时,销毁servlet,执行destroy方法

3.1.2 代码演示

① LifeServlet
public class LifeServlet implements Servlet {


    @Override
    public void init(ServletConfig servletConfig) throws ServletException {
        System.out.println("LifeServlet创建了....");
    }

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

    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        System.out.println("LifeServlet的service方法执行了");
    }

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

    @Override
    public void destroy() {
        System.out.println("LifeServlet销毁了...");
    }
}
② 配置web.xml
<!--servlet的生命周期-->
<servlet>
    <servlet-name>LifeServlet</servlet-name>
    <servlet-class>cn.itcast.b_api.LifeServlet</servlet-class>
    <!--tomcat启动时,创建servlet对象,执行init方法 -->
    <load-on-startup>4</load-on-startup>
</servlet>
<servlet-mapping>
    <servlet-name>LifeServlet</servlet-name>
    <url-pattern>/lifeServlet</url-pattern>
</servlet-mapping>

3.2 拓展:ServletConfig

Tomcat在Servlet对象创建时,执行init()方法,并创建一个ServletConfig 配置对象

  • 主要作用:读取web.xml配置文件Servlet中信息,实现参数和代码的解耦

在这里插入图片描述

① EncodeServlet
public class EncodeServlet implements Servlet {

    //  定义全局变量
    private ServletConfig servletConfig;

    @Override
    public void init(ServletConfig servletConfig) throws ServletException {
        this.servletConfig = servletConfig;
    }

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

    // 用户访问,执行service方法
    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        // String encode = "GBK";
        // 读取配置文件的 init-param 参数
        String encode = getServletConfig().getInitParameter("encode");
        servletResponse.getWriter().write(encode); // 输出到浏览器
    }

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

    @Override
    public void destroy() {

    }
}
② 配置web.xml
<!--servlet的配置对象-->
<servlet>
    <servlet-name>EncodeServlet</servlet-name>
    <servlet-class>cn.itcast.b_api.EncodeServlet</servlet-class>
    <init-param>
        <param-name>encode</param-name>
        <param-value>UTF-8</param-value>
    </init-param>
</servlet>
<servlet-mapping>
    <servlet-name>EncodeServlet</servlet-name>
    <url-pattern>/encodeServlet</url-pattern>
</servlet-mapping>

四 Servlet体系结构

在这里插入图片描述
在这里插入图片描述

4.1 GenericServlet

① 编写普通java类,继承GenericServlet抽象类
public class ServletDemo1 extends GenericServlet {

    @Override
    public void init() throws ServletException {
        System.out.println("ServletDemo1 创建了...");
    }

    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        super.getServletConfig();  // 调用父类的配置对象
        servletResponse.getWriter().write("ServletDemo1 extends GenericServlet");
    }

    @Override
    public void destroy() {
        System.out.println("ServletDemo1 销毁了..");
    }
}
② 配置web.xml
<!--servlet继承genericServlet-->
<servlet>
    <servlet-name>ServletDemo1</servlet-name>
    <servlet-class>cn.itcast.c_inherit.ServletDemo1</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>ServletDemo1</servlet-name>
    <url-pattern>/servletDemo1</url-pattern>
</servlet-mapping>

4.2 HttpServlet

在这里插入图片描述

① 编写前端html
<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <title>login</title>

</head>
<body>
<h3>用户登录</h3>
<form action="http://localhost:8080/day08_servlet_xml/servletDemo2" method="get">
    <input type="submit" value="提交表单..">
</form>
</body>
</html>
② 编写普通java类,继承HttpServlet抽象类
public class ServletDemo2 extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.getWriter().write("get....");
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.getWriter().write("post...");
    }
}
③ 配置web.xml
<!--servlet继承httpServlet-->
<servlet>
    <servlet-name>ServletDemo2</servlet-name>
    <servlet-class>cn.itcast.c_inherit.ServletDemo2</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>ServletDemo2</servlet-name>
    <url-pattern>/servletDemo2</url-pattern>
</servlet-mapping>

4.3 经验值分享

① 响应状态码405

请求方法没有重写…

在这里插入图片描述

② 响应状态码500

java代码写错了…

在这里插入图片描述

五 Servlet路径

5.1 url-pattern

作用:将一个请求网络地址和servlet类建立一个映射关系

在这里插入图片描述

5.1.1 Servlet映射多个url

在这里插入图片描述

5.1.2 url映射模式【了解】

配置 url地址取值可以是:

1. 精确匹配(掌握) 
 		/servletDemo3  
2. 目录匹配 
		/aa/*
3. 后缀匹配 
		*.xxx	例如:*.do
<!--

        只要浏览器符合目录匹配规则,都可以访问到这个servlet:
             /aa/abc
            /aa/asadfasdf
-->
<servlet>
    <servlet-name>ServletDemo4</servlet-name>
    <servlet-class>cn.itcast.d_url_pattern.ServletDemo4</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>ServletDemo4</servlet-name>
    <url-pattern>/aa/*</url-pattern>
</servlet-mapping>

<!--
            只要浏览器符合后缀匹配规则,都可以访问到这个servlet
                aa.do
                bb.do
                xx.do
 -->
<servlet>
    <servlet-name>ServletDemo5</servlet-name>
    <servlet-class>cn.itcast.d_url_pattern.ServletDemo5</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>ServletDemo5</servlet-name>
    <url-pattern>*.do</url-pattern>
</servlet-mapping>

5.2 相对/绝对路径

  • 现阶段我们访问资源的方式越来越多,请求路径在编写时难免出现混淆
  1. 浏览器的地址栏
  2. a标签的href属性
  3. form表单的action属性
  4. js的loation.href属性
  5. ajax请求地址

这里我们复习下路径规则:

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <title>path</title>

</head>
<body>
<h3>测试访问路径:http://localhost:8080/day08_servlet_xml/static/path.html</h3>

<h4>绝对路径</h4>
<!--
    在开发时,强烈建议使用绝对路径
    完整:协议://域名:端口/项目名/资源名
    推荐:/项目名/资源名
-->
<a href="http://localhost:8080/day08_servlet_xml/quickServlet">带http协议的绝对路径:quickServlet</a> <br>
<a href="/day08_servlet_xml/quickServlet">不带http协议的绝对路径:quickServlet</a>
<h4>相对路径路径</h4>
<!--
    相对路径语法:
        ./ 当前目录  注:./可以省略不写
        ../ 上级目录
-->
<a href="../quickServlet">相对路径:quickServlet</a>
</body>
</html>

六 Servlet3.0

  • 通过注解配置Servlet,简化web.xml配置Servlet复杂性,提高开发效率,几乎所有的框架都在使用注解
① 创建web工程【注解】

在这里插入图片描述

② 编写普通java类,继承HttpServlet
public class QuickServlet extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.getWriter().write("QuickServlet....3.0");
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.getWriter().write("QuickServlet....3.0");
    }
}
③ 配置@WebServlet

在这里插入图片描述

// @WebServlet(name = "QuickServlet",urlPatterns = "/quickServlet")
// @WebServlet(urlPatterns = "/quickServlet")
// @WebServlet(value = "/quickServlet")
@WebServlet("/quickServlet") // 注解中有且仅有一个属性,名为value时,属性名可以省略...
public class QuickServlet extends HttpServlet {
    
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值