JavaWeb知识点笔记总结

本文详细介绍了JavaWeb开发中的servlet概念,包括servlet的生命周期、ServletConfig和ServletContext接口的使用,以及url-pattern的配置和匹配规则。讲解了创建servlet的三种方式,重点分析了HttpServlet类的模板方法设计模式,以及HttpServletRequest和HttpServletResponse接口在处理请求和响应时的角色。此外,还探讨了servlet中的乱码问题及其解决方案。
摘要由CSDN通过智能技术生成

servlet简介

创建javaee的web项目

在使用servlet之前我们需要先创建一个javaee的web项目,一个web项目通常包含下面一些文件:

请添加图片描述

  • src:存放java源代码
  • web:存放静态资源和动态资源
  • WEB-INF:该目录下的所有文件无法从浏览器中直接访问
  • lib:存放相关的jar包
  • classes:存放编译后的class文件
  • index.jsp:web项目中默认访问的首页

application context(项目上下文),通过配置项目上下文可以在tomcat部署多个项目。

什么是servlet

servlet是一门用于开发动态web资源的技术,可以运行在Web服务器中的小型Java程序,有时也叫做服务器端的小应用程序,servlet是server applet两个单词的组合而成。servlet 可以通过 HTTP协议接收和响应来自 Web 客户端的请求。

servlet的语法跟JavaSE是一样的并且能够使用JavaSE中的API,要想创建一个servlet并使用的话可以分为以下几个步骤:

  1. 创建一个javaee的web项目
  2. 编写一个Java类,实现javax.servlet.Servlet接口,并重写该接口中的抽象方法
  3. 在web.xml文件中配置该servlet(如果使用注解方式的话,无需配置web.xml)
  4. 将该web项目部署到tomcat中并启动

web访问流程图
在这里插入图片描述
如上图所示,服务器端程序其实就是实现了servlet接口的程序,servlet的主要作用其实就是处理和响应客户端的请求。

编写第一个servlet

创建一个web项目可以在创建项目时关联tomcat,这样eclipse会把相关的servlet-api.jar包拷贝到项目中,在项目创建一个Java类实现servlet接口并重写里面的方法。

import java.io.IOException;

import javax.servlet.Servlet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;

public class FirstServlet implements Servlet {
   

    @Override
    public void service(ServletRequest arg0, ServletResponse arg1) throws ServletException, IOException {
   
        System.out.println("Hello Servlet");
    }

    @Override
    public void destroy() {
   

    }

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

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

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

    }



}

servlet创建好之后,需要在web.xml文件中进行配置,给servlet一个可以访问的URI地址:

<?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_4_0.xsd"
         version="4.0">
    <!-- 创建一个servlet实例 -->
    <servlet>
        <!-- 给servlet取一个名字,该名字需与servlet-mapping中的servlet-name一致 -->
        <servlet-name>OneServlet</servlet-name>
        <!-- servlet的包名+类名 -->
        <servlet-class>Web.OneServlet</servlet-class>
    </servlet>
    <!-- 创建一个servlet实例 -->
    <servlet>
        <!-- 给servlet取一个名字,该名字需与servlet-mapping中的servlet-name一致 -->
        <servlet-name>TwoServlet</servlet-name>
        <!-- servlet的包名+类名 -->
        <servlet-class>Web.TwoServlet</servlet-class>
        <!--通知tomcat在启动时负责创建Two实例对象-->
        <load-on-startup>9</load-on-startup>
    </servlet>
    <!-- 给servlet一个可以访问的URI地址 -->
    <servlet-mapping>
        <!-- servlet的名字,与 servlet中的servlet-name一致-->
        <servlet-name>TwoServlet</servlet-name>
        <!-- URI地址:http://locahost:8080/xq/two -->
        <url-pattern>/two</url-pattern>
    </servlet-mapping>
    <!-- 给servlet一个可以访问的URI地址 -->
    <servlet-mapping>
        <!-- servlet的名字,与 servlet中的servlet-name一致-->
        <servlet-name>OneServlet</servlet-name>
        <!-- URI地址:http://locahost:8080/xq/one -->
        <url-pattern>/one</url-pattern>
    </servlet-mapping>
</web-app>

之后将该web项目部署到tomcat中,启动成功后访问:http://locahost:8080/07-01-servlet/hello
可以看到eclipse控制台中打印出了Hello Servlet
通过上面示例可以看出,servlet的需要部署在tomcat中才能运行,有时tomcat也被称为是servlet的容器。

servlet执行流程

servlet执行流程序列图:
在这里插入图片描述

  1. 客户端向tomcat发送请求,http://localhost:8080/07-01-servlet/hello
  2. tomcat根据请求的URL找到名称为07-01-servlet的应用
  3. tomcat根据请求的URI"/hello"找到web.xml文件中url-pattern与之对应的标签
  4. tomcat根据url-pattern标签中的servlet-name定位到com.monkey1024.servlet.FirstServlet类。
  5. tomcat实例化FirstServlet类
  6. 调用FirstServlet类中的init方法
  7. 调用FirstServlet类中的service方法
  8. FirstServlet将数据响应给客户端
  9. 调用distroy方法销毁FirstServlet

servlet的生命周期

servlet的生命周期

Servlet 生命周期指的是,Servlet 对象的创建、Servlet 对象的初始化、Servlet 对象服
务的执行,及最终 Servlet 对象被销毁的整个过程。
servlet生命周期图:
在这里插入图片描述
Servlet 的整个生命周期过程的执行,均由 Web 服务器负责管理,程序员无法控制其
执行流程。但程序员可以获取到 Servlet 的生命周期时间点,并可以指定让 Servlet 做一些业务相关的事情。
示例代码:

import java.io.IOException;

import javax.servlet.Servlet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;

public class LifeServlet implements Servlet {

    public LifeServlet(){
        System.out.println("无参构造方法执行");
    }

    @Override
    public void destroy() {
        System.out.println("执行destroy方法");
    }

    @Override
    public void init(ServletConfig arg0) throws ServletException {
        System.out.println("执行init方法");
    }

    @Override
    public void service(ServletRequest arg0, ServletResponse arg1) throws ServletException, IOException {
        System.out.println("执行service方法");
    }

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

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

上面代码的运行需要注意下面几个时间点:

  1. 项目部署后启动服务器,并没有执行 Servlet 的无参构造器方法,说明在 Web 容器启动时并没有创建 Servlet 对象。
  2. 用户提交请求URL后,马上可以看到无参构造方法、init()方法、service()方法均执行。
  3. 刷新页面,发现只会执行 service()方法,每刷新一次,即每提交一次请求,就会执行一次 service()方法。
  4. 让另外一个浏览器也发出同样的请求,会发现只执行 service()方法,而无参构造方法、 init() 方法均未执行。
  5. 正常关闭 Tomcat(使用 stop server 关闭,不能使用 Terminate 关闭),发现 destroy()方
    法也会执行。

servlet的特征

  • Servlet是单例多线程的,只创建一个servlet对象,但是每次请求都会起一个线程并在自己线程栈内存中执行service方法。
  • 一个 Servlet 实例只会执行一次无参构造器与 init()方法,并且是在第一次访问时执行。
  • 用户每提交一次对当前 Servlet 的请求,就会执行一次 service()方法。
  • 一个 Servlet 实例只会执行一次 destroy()方法,在应用停止时执行。
  • 由于 Servlet 是单例多线程的,所以为了保证其线程安全性,一般情况下是不建议在 Servlet类中定义可修改的成员变量,因为每个线程均可修改这个成员变量,会出现线程安全问题。
  • 默认情况下,Servlet 在 Web 容器启动时是不会被实例化的。

tomcat启动时创建servlet实例

在tomcat启动时,默认不会创建servlet实例,如果想要让tomcat在启动时创建servlet实例的话,只需要在web.xml中添加load-on-startup标签即可

   通知tomcat在启动时负责创建Two实例对象 
   <load-on-startup>9</load-on-startup>
<?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_4_0.xsd"
         version="4.0">
    <!-- 创建一个servlet实例 -->
    <servlet>
        <!-- 给servlet取一个名字,该名字需与servlet-mapping中的servlet-name一致 -->
        <servlet-name>OneServlet</servlet-name>
        <!-- servlet的包名+类名 -->
        <servlet-class>Web.OneServlet</servlet-class>
    </servlet>
    <!-- 创建一个servlet实例 -->
    <servlet>
        <!-- 给servlet取一个名字,该名字需与servlet-mapping中的servlet-name一致 -->
        <servlet-name>TwoServlet</servlet-name>
        <!-- servlet的包名+类名 -->
        <servlet-class>Web.TwoServlet</servlet-class>
        <!--通知tomcat在启动时负责创建Two实例对象-->
        <load-on-startup>9</load-on-startup>
    </servlet>
    <!-- 给servlet一个可以访问的URI地址 -->
    <servlet-mapping>
        <!-- servlet的名字,与 servlet中的servlet-name一致-->
        <servlet-name>TwoServlet</servlet-name>
        <!-- URI地址:http://locahost:8080/xq/two -->
        <url-pattern>/two</url-pattern>
    </servlet-mapping>
    <!-- 给servlet一个可以访问的URI地址 -->
    <servlet-mapping>
        <!-- servlet的名字,与 servlet中的servlet-name一致-->
        <servlet-name>OneServlet</servlet-name>
        <!-- URI地址:http://locahost:8080/xq/one -->
        <url-pattern>/one</url-pattern>
    </servlet-mapping>
</web-app>

添加load-on-startup的作用是,标记是否在 Tomcat启动时创建并初始化这个 Servlet实例。它的值必须是一个整数。

  • 当值大于等于 0 时,表示容器在启动时就加载并初始化这个 Servlet,数值越小,该 Servlet的优先级就越高,其被创建的也就越早;
  • 当值相同时,容器会自己选择创建顺序。

ServletConfig接口

ServletConfig接口简介

在 Servlet 接口的 init()方法中有一个参数 ServletConfig,这个参数类型是个接口,里面是一些 在 web.xml 中对当前 Servlet类的配置信息。Servlet 规范将Servlet 的配置信息全部封装到了 ServletConfig 接口对象中。在tomcat调用 init()方法时,首先会将 web.xml 中当前 Servlet 类的配置信息封装为一个对象。这个对象的类型实现了 ServletConfig 接口, Web 容器会将这个对象传递给init()方法中的 ServletConfig 参数。

ServletConfig中的方法

  • getInitParameter(): 获取指定名称的初始化参数值。例如从下面的servlet中调用 * * getInitParameter(“userName”);方法会返回字符串"monkey1024"。
  • getInitParameterNames():获取当前 Servlet 所有的初始化参数名称。其返回值为枚举类型 Enumeration。
  • getServletName():获取当前 Servlet 的中指定的 Servlet名称。如下面中的 * ServletName 为"configServlet"。
  • getServletContext():获取到当前 Servlet 的上下文对象 ServletContext,这是个非常重要的对象,将在下一节中详细介绍。

示例:

在配置web.xml时,可以为servlet指定多个初始化参数:

<servlet>
      <servlet-name>configServlet01</servlet-name>
      
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值