Servlet基本使用

Servlet简介

  • Servlet 是Java Server Applet的简称,称为小服务器程序,用Java编写的服务器端程序,主要功能交互式地浏览和修改数据,生成动态Web内容。
  • Java Servlet 是运行在支持Java的Web 服务器或应用服务器上的程序,它是作为来自 Web 浏览器或其他 HTTP 客户端的请求和 HTTP 服务器上的数据库或应用程序之间的中间层。
  • 使用 Servlet,您可以收集来自网页表单的用户输入,呈现来自数据库或者其他源的记录,还可以动态创建网页。
  • Servlet编程需要使用到javax.servletjavax.servlet.http两个包下面的类和接口,在所有的类和接口中,javax.servlet.Servlet 接口最为重要。所有的servlet程序都必须实现该接口或者继承实现了该接口的类。
    • javax.servlet.ServletConfig;
    • javax.servlet.ServletException;
    • javax.servlet.http.HttpServlet;
    • javax.servlet.http.HttpServletRequest;
    • javax.servlet.http.HttpServletResponse;
    • javax.servlet.http.HttpSession;
    • javax.servlet.http.Cookie;

Servlet接口和类

  • GenericServlet抽象类
    • GenericServlet 使编写 servlet 变得更容易。它提供生命周期方法 init 和 destroy 的简单实现,要编写一般的 servlet,只需重写抽象 service 方法即可。
  • HttpServlet
    • 是继承GenericServlet的基础上进一步的扩展。
    • 提供将要被子类化以创建适用于 Web 站点的 HTTP servlet 的抽象类。
    • HttpServlet 的子类至少必须重写一个方法,该方法通常是以下这些方法之一:
      • doGet,如果 servlet 支持 HTTP GET 请求
      • doPost,用于 HTTP POST 请求
      • doPut,用于 HTTP PUT 请求
      • doDelete,用于 HTTP DELETE 请求
      • init 和 destroy,用于管理 servlet 的生命周期内保存的资源
      • getServletInfo,servlet 使用它提供有关其自身的信息
  • Servlet接口类
    • 在ServletAPI中最重要的是Servlet接口,所有Servlet都会直接或间接的与该接口发生联系,或是直接实现该接口,或间接继承自实现了该接口的类。
    • 该接口包括以下五个方法:
      1. init(ServletConfig config)
      2. ServletConfig getServletConfig()
      3. service(ServletRequest req,ServletResponse res)
      4. String getServletInfo()
      5. destroy()
    • 处理方式:
      • (1)第一次访问Servlet时,服务器会创建Servlet对象,并调用init方法,再调用service方法
      • (2)第二次再访问时,Servlet对象已经存在,不再创建,执行service方法
      • (3)当服务器停止,会释放Servlet,调用destroy方法。

Servlet线程安全问题

安全问题

  • 因为每次请求都会创建一个线程,如果多人同时请求,那么就会存在多个线程操作同一个Servlet对象,那么如果在对应的方法中操作了成员变量,就有可能产生线程安全的问题。

如何保证线程安全

  • synchronized
    • 将存在线程安全问题的代码放到同步代码块中
  • 实现SingleThreadModel接口
    • servlet实现SingleThreadModel接口后,每个线程都会创建servlet实例,这样每个客户端请求就不存在共享资源的问题
    • 但是servlet响应客户端请求的效率太低,所以已经淘汰。
  • 尽可能只使用局部变量

Servlet基本使用

创建package

  • 项目中为Servlet类创建独立的servlet包

两种创建方式

  • 第一种:继承HttpServlet
  • 代码示例:
@WebServlet("/helloServlet")
public class HelloServlet extends HttpServlet {
   @Override
   protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
   }
   @Override
   protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
       doPost(request,response);
   }
  • 第二种:实现Servlet接口
  • 代码示例:
@WebServlet("/servletDemo")
public class ServletDemo implements Servlet {

   @Override
   public void init(ServletConfig servletConfig) throws ServletException {
       System.out.println("init初始化");
   }

   @Override
   public ServletConfig getServletConfig() {
       System.out.println("getServletConfig");
       return null;
   }

   @Override
   public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
       System.out.println("service");
   }

   @Override
   public String getServletInfo() {
       System.out.println("getServletInfo");
       return null;
   }

   @Override
   public void destroy() {
       System.out.println("销毁了destroy");
   }
}

两种配置方式

  • 第一种:使用注解的方式,上面示例已使用
    • 注解的其他参数:
    • name:serlvet名字(可选)
    • value:配置url路径
    • urlPatterns:配置url路径,和value作用一样,不能同时使用
    • loadOnStartup:配置Servlet的创建的时机,如果是0或者正数 启动程序时创建,如果是负数,则访问时创建。数子越小优先级越高。
    • initParams:配置Servlet的初始化参数
  • 代码示例:
@WebServlet(name = "ServletDemo",loadOnStartup = 0,urlPatterns = "/servletDemo",initParams = {@WebInitParam(name="sdh",value = "sdh")})
//在doPost方法里面,使用下面方法获取注解中创建的初始参数
String config = getInitParameter("sdh")
  • 第二种:在web.xml文件中配置
  • 代码示例:
  <!--  使用xml形式访问servlet  -->
  <servlet>
      <!--名称-->
      <servlet-name>ServletDemo</servlet-name>
      <!--Servlet的全称类名-->
      <servlet-class>com.sdh.servlet.ServletDemo</servlet-class>
      <!--配置参数,也是通过getInitParameter()获取-->
      <init-param>
          <param-name>email</param-name>
          <param-value>xxx@qq.com</param-value>
      </init-param>
      <init-param>
          <param-name>address</param-name>
          <param-value>北京</param-value>
      </init-param>

      <!--配置启动时机-->
      <load-on-startup>1</load-on-startup>
  </servlet>
   
  <servlet-mapping>
      <servlet-name>ServletDemo</servlet-name>
      <!--访问地址-->
      <url-pattern>/servletDemo</url-pattern>
  </servlet-mapping>
  • 容器在进行url-pattern配置的时候是遵循一定的匹配原则
    • url-pattern定义匹配规则,取值说明:
    • 精确匹配  /xxx(具体的名称) 只有url路径是具体的名称的时候才会触发Servlet
    • 后缀匹配  *.xxx 只要是以xxx结尾的就匹配触发Servlet
    • 通配符匹配 /*  匹配所有请求,包含服务器的所有资源
    • 通配符匹配 /  匹配所有请求,包含服务器的所有资源,不包括.jsp
  • load-on-startup
    1. 元素标记容器是否应该在web应用程序启动的时候就加载这个servlet。
    2. 它的值必须是一个整数,表示servlet被加载的先后顺序。
    3. 如果该元素的值为负数或者没有设置,则容器会当Servlet被请求时再加载。
    4. 如果值为正整数或者0时,表示容器在应用启动时就加载并初始化这个servlet,值越小,servlet的优先级越高,就越先被加载。值相同时,容器就会自己选择顺序来加载。


转载请注明:Memory的博客 » 点击阅读原文

打赏一个呗

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦