4/14day33_Servlet

2020-04-24  本文已影响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快速入门

目标:编写一个普通的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 配置对象

① 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-pattern> 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

① 创建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 {
    
}
上一篇 下一篇

猜你喜欢

热点阅读