JavaEE(JavaWeb)——Servlet

关于组件:其实就是类(组件是一些可以实现特殊功能的类)

一、servlet介绍

1、概念

Servlet:(server applet)概念:运行在服务器端的小程序,Servlet其实就是一个接口,定义了Java类被浏览器访问到(tomcat识别)的规则

注:Servlet组件:专门用来处理用户请求的组件,使用需要先导jar包

2、servlet体系结构

servlet组件是一个接口,该体系结构中有两个类 :GenericServlet(抽象类)  和  HttpServlet(抽象类)

  • 注:GenericServlet类将servlet接口中其他的方法做了默认空实现,只将service()方法作为抽象,但是工作中不常用,工作中常用HttpServlet

(1)HttpServlet

HttpServlet是Servlet接口的一个实现类,并且它是一个抽象类,servlet.http包中定义了采用HTTP通信协议(一个无状态协议)的HttpServlet类。(对Http协议的一种封装,可以用来简化操作)

响应流程:

  • 1.Web客户向Servlet容器发出Http请求
  • 2.Servlet容器解析Web客户的Http请求
  • 3.Servlet容器创建一个HttpRequest对象,在这个对象中封装Http请求信息
  • 4.Servlet容器创建一个HttpResponse对象
  • 5.Servlet容器调用HttpServlet的service方法,把HttpRequest和HttpResponse对象作为service方法的参数传给HttpServlet对象
  • 6.HttpServlet调用HttpRequest的有关方法,获取HTTP请求信息
  • 7.HttpServlet调用HttpResponse的有关方法,生成响应数据
  • 8.Servlet容器把HttpServlet的响应结果传给Web客户
  • 其中HttpServlet首先必须读取Http请求的内容,Servlet容器负责创建HttpServlet对象,并把Http请求直接封装到HttpServlet对象中。

<1> HttpServlet中的service方法中做了请求方式判断操作,判断操作是何种类型,使用method.equals("GET")

3、servlet快速入门

(1)创建javaweb(javaEE)项目

(2)创建一个类,实现servlet接口

(3)实现接口中的抽象方法

package com.test.web;

import javax.servlet.*;
import java.io.IOException;

public class ServletDemo implements Servlet {
    @Override
    public void init(ServletConfig servletConfig) throws ServletException {

    }

    @Override
    public ServletConfig getServletConfig() {
        return null;
    }
    
    //提供服务的方法
    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {

    }

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

    @Override
    public void destroy() {

    }
}

(4)配置servlet

方法1:在web.xml中配置  <实现servle的第一种方法>

当引入别人写的servlet时,使用web.xml方式进行配置

<?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-name>demo1</servlet-name>
        <!-- 必须写完全限定名 -->
        <servlet-class>com.test.web.ServletDemo</servlet-class>
    </servlet>

<!--    配置servlet映射-->
    <servlet-mapping>
        <servlet-name>demo1</servlet-name>
        <url-pattern>/demo1</url-pattern>
    </servlet-mapping>
</web-app>

方法2:注解配置

扫描二维码关注公众号,回复: 12656122 查看本文章

servlet是自己写的,用注解

@WebServlet("/demo1")

4、servlet执行原理

当服务器接收到浏览器客户的请求之后,会

  • (1)解析请求的URL路径,获取访问的servlet的资源路径,找到项目;
  • (2)查找web.xml文件,是否有对应的标签体内容,如果有,则找到对应的标签内的全类名
  • (3)tomcat会将字节码文件加载进内存,并且创建其对象(cls.newInstance())
  • (4)调用其方法(service)。

5、servlet生命周期

注:创建对象之前,需要进行类的加载

  • 被创建: 执行servlet的 init()方法 , 只执行一次,说明servlet在内存中是单例的(多用户同时访问,可能存在线程安全问题,尽量不要在servlet中定义成员变量,即使定义了成员变量,也不要对其修改值),默认情况下,第一次被访问时被创建(可配置servlet的创建时期:值为负整数,第一次被访问时创建/值为0或者为正整数,则在服务器启动时创建
  • 提供服务:执行 service()方法,每次访问servlet时service()方法都会被调用一次(多次调用)
  • 被销毁:destory()方法在servlet被销毁之前只执行一次,用于释放资源。服务器关闭时,servlet被销毁。只有服服务器正常关闭时,才会执行destory()方法。
package com.test.web;

import javax.servlet.*;
import java.io.IOException;

public class ServletDemo implements Servlet {
    /**
     * 初始化方法
     * 在servlet被创建时执行,只会执行一次
     * @param servletConfig
     * @throws ServletException
     */
    @Override
    public void init(ServletConfig servletConfig) throws ServletException {
        System.out.println("-------init-------");
    }

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

    /**
     * 提供服务的方法
     *每次servlet被访问时都会被执行,执行多次
     * @param servletRequest
     * @param servletResponse
     * @throws ServletException
     * @throws IOException
     */
    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        System.out.println("-------service-------");
    }

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


    /**
     * 销毁方法
     * 在服务器正常关闭时执行,只会执行一次
     */
    @Override
    public void destroy() {
        System.out.println("-------destory-------");
    }
}

二、servlet3.0

1、创建servlet3.0项目步骤

  1. 创建JavaEE项目,选择servlet的版本3.0y以上,可以不创建web.xml
  2. 定义一个类,实现servlet接口
  3. 重写方法
  4. 在类上使用 @WebServlet 注解,进行配置

2、servlet3.0好处

支持注解配置,可以不用配置 web.xml(JavaEE6以后支持3.0)

3、servlet3.0新增特性

  • 注解支持;Servlet、Filter、Listener无需在web.xml中进行配置,可以通过对应注解进行配置;
  • 支持Web模块;
  • Servlet异步处理;
  • 文件上传API简化;

4、servlet使用

让一个类成为servlet的步骤:

  1. 继承 HttpServlet类
  2. 加入 @WebServlet注解,配置路径信息
  3. 实现service方法(麻烦,get和post各需要一个servlet)

5、doGet() 和 doPost()的使用

真正在开发中,是禁止直接实现service方法来提供服务的,转而重写doGet和doPost方法来提供服务

  • 好处:一个servlet解决多个操作,简化了操作
  • 注:既重写service,又重写了doGet()和doPost()时,调用service方法,因为子类实现了service方法,所以不会调用父类的service方法。
  • 只有doGet和doPost时,会调用父类的service,父类的service中邪了判断请求方式的代码

package com.test.web;

import com.test.pojo.Book;
import com.test.utils.JDBCUtils;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.math.BigDecimal;

@WebServlet("/book/update")
public class BookUpdateServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String id = request.getParameter("id");
        Book book =  JDBCUtils.getOne("select bookISBN,name,author,price,press from book where bookISBN = ?", Book.class ,id);
        request.setAttribute("book", book);
        request.getRequestDispatcher("/WEB-INF/webPages/book/update.jsp").forward(request,response);
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String id = request.getParameter("id");
        String name = request.getParameter("name");
        String author = request.getParameter("author");
        BigDecimal price = new BigDecimal(request.getParameter("price"));
        String press = request.getParameter("press");

        JDBCUtils.executeUpdate("update book set name=?,author=?,price=?,press=? where bookISBN = ?", name, author, price,press,id);
        response.sendRedirect("list");
    }
}

6、页面跳转操作

  • 转发:request.getRequestDispatcher('路径'),forward(request, response);
  • 重定向:response.sendRedirect("list");

7、servlet urlpartten配置

使用注解进行配置:@WebServlet("/path")  或者  @WebServlet({"/path","/path1"})

(1)路径配置规则

  1. /xxx
  2. /xxx/xxx     多层路径,目录结构
  3. *.后缀名

注:通配符 * 的方式优先级最低,其他的都匹配不到时,才走这条配置

猜你喜欢

转载自blog.csdn.net/weixin_42067873/article/details/114130928
今日推荐