Javaweb-Servlet总结(概述接口使用配置获取请求方式路径操作Request对象Response对象)

Posted Ocean:)

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Javaweb-Servlet总结(概述接口使用配置获取请求方式路径操作Request对象Response对象)相关的知识,希望对你有一定的参考价值。

Servlet概述

  • 即Server Applet

  • Servlet 是 JavaWEB 服务端的一个小程序,主要用户用户数据的交互,WEB 数据展示和数据传递,是一个动态的资源

  • Servlet 程序可以应对搜友类型的请求和响应,Servlet 主要用于 HTTP 协议的 WEB 服务器程序实现

  • Servlet 开发需要用到两个包

    javax.servlet

    javax.servlet.http

  • 开发中可能会涉及到的接口和类

    javax.servlet.http.Servlet

    javax.servlet.http.GServlet --abstract修饰的类

    javax.servlet.http.HttpServlet

    javax.servlet.http.HttpServletRequest

    javax.servlet.http.HttpServletResponse

    javax.servlet.http.HttpSession

    javax.servlet.http.Cookie

demo

以一个实例来说明 get 请求和 post 请求,前端有两个按钮分别是以 get 方式提交数据和以 post 方式提交数据

前端html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>test</title>
</head>
<body>
<form action="ServletDemo" method="get">
    <input type="submit" value="GET请求"><br>
</form>

<form action="ServletDemo" method="post">
    <input type="submit" value="POST请求"><br>
</form>
</body>
</html>

后端代码ServletDemo

package cn.ocean888.demo1;

import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;

import java.io.IOException;

/**
 * 1.继承HttpServlet interface
 * 2.重写doget、dopost
 * 3.使用注解方式告知tomcat服务器当前Servlet的路由
 */
@WebServlet("/test")
public class ServletDemo extends HttpServlet {

    /**
     * 处理GET请求
     * @param req HttpServletRequest对象,对应当前浏览器请求数据内容对应的对象
     * @param resp HttpServletResponse对象,对应是当前浏览器对于浏览器请求的响应
     * @throws ServletException Servlet异常
     * @throws IOException IO异常
     */
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        super.doGet(req, resp);
    }

    /**
     * 处理post请求
     */
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        /*
        通常情况下,浏览器或者客户端发送数据的请求方式只有一种,对应GET请求和POST请求,在实现Servlet代码时,
        针对GET和POST完成对应的方法,此处使用doget,实现所有的业务逻辑
         */
        //super.doPost(req, resp);
        System.out.println("post请求方式");
        doGet(req, resp);
    }
}

Servlet核心接口和类

interface.javax.servlet.Servlet【核心接口】

Defines methods that all servlets must implement.
	当前接口中所有的Servlet程序必须实现
A servlet is a small Java program that runs within a Web server
	Servlet是一个小的Java程序,需要运行在WEB服务器当中。
	
Servlet接口中定义了5个方法
	public void init(ServletConfig config) throws ServletException;
		初始化当前Servlet程序,这里需要的参数是ServletConfig,ServletConfig
		是当前Servlet的配置,该配置可以从注解方式或者从当前项目中的web.xml加载
		获取
		
	public ServletConfig getServletConfig();
		获取ServletConfig对象,当前对象中保护Servlet配置内容。
		
	public void service(ServletRequest req, ServletResponse res)
            throws ServletException, IOException;
    	【核心方法】Servlet提供服务的方法,浏览器访问当前Servlet程序,service
    	方法是起作用,ServletRequest对应的是请求,ServletResponse对应的是响
    	应
    
    public String getServletInfo();
    	获取当时Servlet程序信息对应字符串
    	
    public void destroy();
    	销毁当前Servlet程序,可以由Tomcat服务器执行,也可也通过servlet程序自己
    	调用

abstract javax.servlet.GenericServlet【Servlet中间商】

	功能是完成了Servlet接口和ServletConfig接口的一部分方法,简化了之后代码的逻辑,主要需要了解的方法:
	public String getInitParameter(String name);
		根据初始化参数名字获取对应的值,而且参数值为String
	public Enumeration<String> getInitParameterNames();
	 	获取所有参数的名字。枚举类型的List
	public ServletConfig getServletConfig();
		获取ServletConfig对象
	public ServletContext getServletContext();
		获取ServletContext对象,一个Servlet Application有且只有一个
		ServletContext对应,这是Servlet上下文对象
	这里同时实现了Servlet接口中的 init 初始化方法

abstract javax.servlet.http.HttpServlet 【Servlet程序基类】

    abstract javax.servlet.http.HttpServlet 这是一个Java中符合Http协议的Servlet程序,继承GenericServlet,同时是Servlet接口和ServletConfig间接实现类。    
    HttpServlet中首先实现service核心方法,并且将service核心方法的请求方式,响应方式强转为符合Http协议的请求和响应    所有和Servlet业务逻辑无关的初始化方法,设置方法,销毁方法,HttpServlet中全部不需要考虑,只考虑符合Http协议请求方式和响应方式

核心方法:
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException
    符合HTTP GET请求的处理方式
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException     
    符合HTTP POST请求的处理方式
    
【注意】
	以上方法不重写,或者执行还是对应的方法,例如super.doGet(req,resp), 响应方式会提示报错 SC_METHOD_NOT_ALLOWED

三种自定义Servlet接口的方法

1.实现Servlet接口

package com.qfedu.b_threeFunction;

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

/**
 * 遵从Servlet接口实现Servlet程序
 * 代码中存在太多和业务逻辑无关的代码,增加了程序员的压力!!!
 * 不可取!!!
 */
@WebServlet("/ServletImpl")
public class ServletImpl implements Servlet {

    /**
     * 构造方法
     */
    public ServletImpl() {
        System.out.println("ServletImpl Constructor called");
    }

    /**
     * 初始化方法
     *
     * @param config 需要使用ServletConfig类对象,也就是Servlet配置来完成初始化操作
     * @throws ServletException Servlet异常
     */
    @Override
    public void init(ServletConfig config) throws ServletException {
        System.out.println("init method called");
    }

    /**
     * 获取ServletConfig对象
     *
     * @return 获取ServletConfig对象
     */
    @Override
    public ServletConfig getServletConfig() {
        return null;
    }

    /**
     * 提供服务核心方法
     *
     * @param req ServletRequest对象
     * @param res ServletResponse对象
     * @throws ServletException Servlet异常
     * @throws IOException      IO异常
     */
    @Override
    public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
        System.out.println("service method called");
    }

    /**
     * 获取Servlet信息
     * @return
     */
    @Override
    public String getServletInfo() {
        return null;
    }

    /**
     * 销毁Servlet
     */
    @Override
    public void destroy() {
        System.out.println("destroy method called");
    }
}

2.继承GenericServlet抽象类

package com.qfedu.b_threeFunction;

import javax.servlet.GenericServlet;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebServlet;
import java.io.IOException;

/**
 * 继承GenericServlet 抽象类实现Servlet程序
 * 对应Servlet接口,在继承GenericServlet情况下,我们需要完成的方法有且
 * 只有service核心方法。
 *
 * 代码量明显减少,同时和业务逻辑无关的代码不需要考虑,但是没有针对性,
 * 没有对应Http协议请求方式的对应处理方法
 * 
 * @author MI 2020/3/30 11:30
 */
@WebServlet("/GenericServletExtends")
public class GenericServletExtends extends GenericServlet {
    @Override
    public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
        System.out.println("GenericServletExtends service method called");
    }
}

3.继承HttpServlet抽象类

package com.qfedu.b_threeFunction;

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;

/**
 * 继承HttpServlet实现符合HTTP协议的Servlet程序
 * 并且可以自定义实现请求方式的对应处理方法
 *
 * @author MI 2020/3/30 11:34
 */
@WebServlet("/HttpServletExtends")
public class HttpServletExtends extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("HttpServletExtends doGet or doPost method called");
        resp.getWriter().append("Hello Servlet");
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}
【注意】
	继承HttpServlet重写HttpServlet对应HTTP协议的处理方法,一定要完成,如果未完成或者说依然执行调用的是HttpServlet中的方法,
	会有错误出现 405 Method Not Allow

平时主要用的就是这种方式

生命周期

tomcat管理Servlet程序的声明周期,主要涉及4个方法

  • Constructor方法
  • init初始化方法
  • service方法
  • destory销毁方法

概述

  • 阶段一

    Constructor方法执行,实例化过程。Tomcat中的Servlet容器调用Servlet程序对应的构造方法创建Servlet类对象

    前提条件:

    1. 当前Servlet程序需要被执行
    2. 当前Servlet程序配置了开机启动

    而且Constructor有且只执行一次

  • 阶段二:

    init(ServletConfig config) 初始化方法,当Servlet程序创建之后一定要对当前Servlet程序进行初始化过程,需要使用ServletConfig对象完成初始化操作,ServletConfig对象中是从注解或者web.xml中获取对应的配置信息,完成初始化操作,而且只执行一次

  • 阶段三:

    service方法提供服务
    当前Servlet程序准备完毕,Servlet程序是在被请求时执行service方法,完成对应请求和响应的执行过程。到HttpServlet抽象类中对于service方法实现,并且按照HTTP请求方式完成划分工作。比如doGet doPost

  • 阶段四:

    Tomcat服务器中Servlet容量对于Servlet进行销毁过程,有几种情况下会执行destroy方法

    1. Tomcat服务器关闭,Servlet容器会执行每一个Servlet程序的destroy方法
    2. 当前Servlet程序执行过程中,存在特定条件选择关闭
    3. 通常情况下Servlet容器对于Servlet程序的管理是自动完成的,不需要人为干预

配置方式

Servlet3.0之后允许使用注解方式配置

属性名概述
nameServlet名字,可以自定义
valueurl资源匹配方式,和urlPatterns互斥
urlPatterns允许当前Servlet有多个匹配方式,和value互斥
loadOnStartup是否启动服务时加载当前Servlet,默认 -1,选择加载 1
initParamsWebInitParam 注解类型 name和value 当前Servlet配置初始化配置
@WebServlet(name = "AnnotationServlet",
        urlPatterns = {"/AnnotationServlet", "/as", "/saolei"},//允许多个匹配规则
        loadOnStartup = 1,
        initParams = {@WebInitParam(name = "aa", value = "ocean"), @WebInitParam(name = "bb", value = "46号技师")})//初始化参数
public class AnnotationServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("Annotation Config Servlet");
        String aa = this.getServletConfig().getInitParameter("aa");//获取初始化参数
        String bb = this.getServletConfig().getInitParameter("bb");

        System.out.println(aa);
        System.out.println(bb);

        resp.getWriter().append("Annotation Config Servlet");
    }
}

任何一个版本都允许使用web.xml配置

<!-- 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_3_1.xsd"
         version="3.1">
    <!-- Servlet 程序声明,告知Servlet程序对应的名字和Servlet程序对应的class -->
    <servlet>

        <!-- ServletName -->
        <servlet-name>WebXmlServlet</servlet-name>

        <!-- Servlet对应的class,该名字必须是完整的包名.类名 -->
        <servlet-class>cn.ocean.WebXmlServlet</servlet-class>
        <!-- 当前Servlet程序初始化操作,需要放在servlet-class之后 -->
        <init-param>
            <param-name>param1</param-name>
            <param-value>ocean</param-value>
        </init-param>
        <init-param>
            <param-name>param2</param-name>
            <param-value>ocean</param-value>
        </init-param>
        <!-- 当前Servlet随着Tomcat服务器启动加载 -->
        <load-on-startup>1</load-on-startup>

    </servlet>
    <!-- Servlet映射关系 -->
    <servlet-mapping>
        <!-- 告知Tomcat服务器,当前url-pattern映射的是哪一个Servlet -->
        <servlet-name>WebXmlServlet</servlet-name>
        <!-- URL匹配原则 -->
        <url-pattern>/WebXmlServlet</url-pattern>
    </servlet-mapping>
    <!-- Servlet映射关系 -->
    <servlet-mapping>
        <!-- 告知Tomcat服务器,当前url-pattern映射的是哪一个Servlet -->
        <servlet-name>WebXmlServlet</servlet-name>
        <!-- URL匹配原则 -->
        <url-pattern>/wxs</url-pattern>
    </servlet-mapping>
</web-app>

两种方式对比

注解
	配置简单,直观,高效
	url-pattern 冲突问题,并且是在Tomcat启动时发现,需要注意细节
	
web.xml
	繁琐,麻烦,步骤繁多
	url-pattern 一旦写错或者冲突,web.xml文件会提示错误!!!

Servlet获取请求数据

【注意】
	1. 要求前端提交数据的name属性和后台获取getParameter参数一致
	2. 在后台通过HttpServletRequest获取数据使用getParameter方法,返回值是String类型

前端代码

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>02-ParameterUpload</title>
</head>
<body>
<form action="GetParameterServlet" method="get">
    <span>姓名:</span><input type="text" name="userName"> <br>
    <span>密码:</span><input type="password" name="password"> <br>
    <input type="submit" value="提交">
</form>
<hr>
<form action="GetParameterServlet" method="post">
    <span>姓名:</span><input type="text" name="userName"> <br>
    <span>密码:</span><input type="password" name="password"> <br>
    <input type="submit" value="提交">
</form>
</body>
</html>

后端代码

/**
 * 获取前端通过HTTP请求方式发送过来的数据
 *
 * @author MI 2020/3/30 16:02
 */
@WebServlet("/GetParameterServlet")
public class GetParameterServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 浏览器通过form表单提交的数据都在HttpServletRequest对象中

        // 通过getParameter获取对应的参数名数据,参数名和form表单中的name属性一致
        String userName = req.getParameter("userName");
        String password = req.getParameter("password");

        System.out.println(userName + ":" + password);

    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException

以上是关于Javaweb-Servlet总结(概述接口使用配置获取请求方式路径操作Request对象Response对象)的主要内容,如果未能解决你的问题,请参考以下文章

JavaWeb-Servlet笔记--- 监听器接口;应用监听器接口 优化在线考试管理系统

JavaWeb-Servlet

JavaWeb-Servlet笔记--- Servlet规范;Servlet接口实现类;Servlet对象生命周期;HttpServletResponse/HttpServletRequest;请求对

[JavaWeb-Servlet]Servlet的体系结构

JavaWeb-servlet

记一次JavaWeb-Servlet排错过程