JavaWeb = Servlet讲解

1. 创建 servlet  (1)使用xml进行配置  (2)使用anno (注解)进行配置
2. servlet 执行原理
3. servlet 生命周期
4. servlet 体系结构

一.Servlet概述

servlet= server+applet 运行在服务器端的 java 程序。
Servlet 是一个接口,一个类要想通过浏览器被访问到 , 那么这个类就必须直接或间接的实现 Servlet 接口
 
作用
接收请求,处理逻辑,响应结果
 

二。Servlet入门:

编写一个普通的java类,通过浏览器可以访问
 
1.代码编写
(1)创建web项目
 
 
(2)编写普通的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("<h1>quickServlet!</h1>");
    }

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

    @Override
    public void destroy() {

    }
}

(3)配置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.wsl.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>

(4)部署web项目

 
(5)启动测试
 
2.Servlet执行原理
 
 

三。Servlet相关Api

 
1.生命周期相关api
 
生命周期:指的是一个对象从创建到销毁的一个过程
 
// 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方法

2.coding
 
(1)生命周期
 
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销毁了...");
    }
}

(2)配置web.xml

<!--servlet的生命周期-->
<servlet>
    <servlet-name>LifeServlet</servlet-name>
    <servlet-class>cn.wsl.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.ServletConfig

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

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

 
相关Servlet
 
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.wsl.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体系结构

Servlet 在 Web 应用程序中的位置。

Servlet 执行以下主要任务:

  • 读取客户端(浏览器)发送的显式的数据。这包括网页上的 HTML 表单,或者也可以是来自 applet 或自定义的 HTTP 客户端程序的表单。
  • 读取客户端(浏览器)发送的隐式的 HTTP 请求数据。这包括 cookies、媒体类型和浏览器能理解的压缩格式等等。
  • 处理数据并生成结果。这个过程可能需要访问数据库,执行 RMI 或 CORBA 调用,调用 Web 服务,或者直接计算得出对应的响应。
  • 发送显式的数据(即文档)到客户端(浏览器)。该文档的格式可以是多种多样的,包括文本文件(HTML 或 XML)、二进制文件(GIF 图像)、Excel 等。
  • 发送隐式的 HTTP 响应到客户端(浏览器)。这包括告诉浏览器或其他客户端被返回的文档类型(例如 HTML),设置 cookies 和缓存参数,以及其他类似的任务。

通过选中Servlet接口,右键弹出菜单可以查看继承结构

 
继承结构如下图所示:
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.wsl.ServletDemo1</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>ServletDemo1</servlet-name>
    <url-pattern>/servletDemo1</url-pattern>
</servlet-mapping>

 

2.HttpServlet
 
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/servlet/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.wsl.ServletDemo2</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>ServletDemo2</servlet-name>
    <url-pattern>/servletDemo2</url-pattern>
</servlet-mapping>

3.请求状态码问题

(1)响应状态码405
 
请求方法没有重写.....
 
 
 
(2)响应状态码500:程序内部错误
java程序写错了
 
 

五。servlet路径

1。url-pattern
作用:将一个请求网络地址和servlet类建立一个映射关系
 
 
2.Servlet映射多个url
 
 
 
3.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.wsl.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.wsl.ServletDemo5</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>ServletDemo5</servlet-name>
    <url-pattern>*.do</url-pattern>
</servlet-mapping>

4.相对,绝对路径

 
  • 访问资源的方式越来越多,请求路径在编写时难免出现混淆

  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/servlet_xml/static/path.html</h3>

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

六。Servlet 3.0

Servlet3.0可以不用web.xml配置,可以进行注解配置
 
通过注解配置Servlet,简化web.xml配置Servlet复杂性,提高开发效率,几乎所有的框架都在使用注解
 
(1)创建web工程(注解)
注意:创建工程时,选择javaee至少是 javaee 6版本以上才支持 注解配置
 
 
 
(2)编写普通java类,继承自HttpServlet
 
@WebServlet(urlPatterns = "/abcdemo")
public class webServlet30 extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("dopost");
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("doget");
    }
}

 

(3)配置@WebServlet
 
 
 

//webServlet配置的值的几种形式

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

 

学习资料:
 
 
 
 
 
 
 
 
 
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值