JavaWeb---Servlet

news2024/10/5 5:29:49

1.Srvlet概述

Servlet是运行在java服务器端的程序,用于接收和响应来着客户端基于HTTP协议的请求

如果想实现Servlet的功能,可以通过实现javax。servlet。Servlet接口或者继承它的实现类

核心方法:service(),任何客户端的请求都会经过该方法

2.Servlet快速入门 

1.创建一个WEB项目

2.重写一个类继承GenericServlet

3.重写service方法

4.在web.xml中配置Servlet

5.部署并启动项目

6.通过浏览器测试

例:

package servlet;
import javax.servlet.GenericServlet;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;

import java.io.IOException;

/*
    Servlet快速入门
 */
public class ServletDemo01 extends GenericServlet {

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

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快速入门1的配置-->
    <servlet>
        <servlet-name>servletDemo01</servlet-name>
        <servlet-class>servlet.ServletDemo01</servlet-class>
        
    </servlet>
    <servlet-mapping>
        <servlet-name>servletDemo01</servlet-name>
        <url-pattern>/servletDemo01</url-pattern>
    </servlet-mapping>
</web-app>

 

网页输入:http://localhost:8080/demo1/servletDemo01

Servlet的执行过程

 Servlet关系视图

3.Servlet实现方式之HttpServlet 

Servlet实现方式

1.第一种

实现Servlet接口,实现所有的抽象方法。该方法支持最大程度的自定义

2.第二种

继承GenericServlet抽象类,必须重写servic方法,其他方法可选择重写。该方法让我们开发Servlet变得简单。但是这种方式和HTTP协议无关

3.第三种

继承HttpServlet抽象类,需要重写doGet和doPost方法。该方式表示请求和响应都需要和HTTP协议相关

步骤

1.创建一个类继承HttpServlet

2.重写doGet和doPost方法

3.在web.xml中配置Servlet

4.部署并启动项目

5.通过浏览器测试

例:

package servlet;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/*
    快速入门02
*/
public class ServletDemo02 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("方法执行了...");
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}

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快速入门1的配置-->
    <servlet>
        <servlet-name>servletDemo01</servlet-name>
        <servlet-class>servlet.ServletDemo01</servlet-class>
        
    </servlet>
    <servlet-mapping>
        <servlet-name>servletDemo01</servlet-name>
        <url-pattern>/servletDemo01</url-pattern>
    </servlet-mapping>

    <!--Servlet快速入门2的配置-->
    <servlet>
        <servlet-name>servletDemo02</servlet-name>
        <servlet-class>servlet.ServletDemo02</servlet-class>

    </servlet>
    <servlet-mapping>
        <servlet-name>servletDemo02</servlet-name>
        <url-pattern>/servletDemo02</url-pattern>
    </servlet-mapping>
</web-app>

4.Servlet的生命周期

对象的生命周期,就是对象从出生到死亡的过程。即:出生 -> 活着 -> 死亡。官方说法是对象创建到销毁的过程

出生:请求第一次到达 Servlet 时,对象就创建出来,并且初始化成功。只出生(创建)一次,将对象放到内存中

活着:服务器提供服务的整个过程中,该对象一直存在,每次都是执行 service 方法

死亡:当服务停止时,或者服务器宕机时,对象死亡

例:

package servlet;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/*
    Servlet的生命周期
*/
public class ServletDemo03 extends HttpServlet {
    //对象出生的过程
    @Override
    public void init() throws ServletException {
        System.out.println("对象创建并初始化成功");
    }
    //对象服务的过程
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("接收到了客户端的请求...");
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
    //对象销毁的过程

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

web.xml:

  <!--Servlet生命周期的配置-->
    <servlet>
        <servlet-name>servletDemo03</servlet-name>
        <servlet-class>servlet.ServletDemo03</servlet-class>

    </servlet>
    <servlet-mapping>
        <servlet-name>servletDemo03</servlet-name>
        <url-pattern>/servletDemo03</url-pattern>
    </servlet-mapping>

结论:Servlet 对象只会创建一次,销毁一次。所以 Servlet 对象只有一个实例。如果一个对象实例在应用中是唯一的存在,那么我们就称它为单例模式

5.Servlet线程安全问题

由于 Servlet 采用的是单例模式,也就是整个应用中只有一个实例对象。所以我们需要分析这个唯一的实例对象中的类成员是否线程安全

模拟用户登录功能来查看 Servlet 线程是否安全

例:

package servlet;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
/*
Servlet线程安全的问题
 */
public class ServletDemo04 extends HttpServlet{
    //1.定义用户名成员变量
    private String username = null;

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //2.获取用户名
        username = req.getParameter("username");
        try {
            Thread.sleep(3000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        //3.获取输出流对象
        PrintWriter pw = resp.getWriter();
        //4.响应给客户端浏览器
        pw.print("welcome:" + username);
        //5.关流
        pw.close();
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req,resp);
    }
}
<!--Servlet线程安全的配置-->
    <servlet>
        <servlet-name>servletDemo04</servlet-name>
        <servlet-class>servlet.ServletDemo04</servlet-class>

    </servlet>
    <servlet-mapping>
        <servlet-name>servletDemo04</servlet-name>
        <url-pattern>/servletDemo04</url-pattern>
    </servlet-mapping>

谷歌浏览器中url传递参数username=aaa

火狐浏览器中url传递参数username=bbb

结果两个浏览器都是welcome:bbb

结论:一个浏览器代表一个线程,多个浏览器代表多个线程。按理说我们期望的应该是每个浏览器查看的都应该是自己的用户名。而现在的结果是浏览器中数据混乱。因此,我们可以认为 Servlet 是线程不安全的!

解决:定义类成员要谨慎。如果是共用的,并且只会在初始化时赋值,其他时间都是获取的话,那么是没问题的。如果不是共用的,或者每次使用都有可能对其赋值,那就要考虑线程安全问题了,可以将其定义到 doGet 或 doPost 方法内或者使用同步功能即可。

方法1:将username由成员变量,放到方法中

package servlet;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
/*
Servlet线程安全的问题
 */
public class ServletDemo04 extends HttpServlet{
    //1.定义用户名成员变量
   // private String username = null;

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String username = null;
        //2.获取用户名
        username = req.getParameter("username");
        try {
            Thread.sleep(3000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        //3.获取输出流对象
        PrintWriter pw = resp.getWriter();
        //4.响应给客户端浏览器
        pw.print("welcome:" + username);
        //5.关流
        pw.close();
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req,resp);
    }
}

方法二:使用同步代码块

package servlet;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
/*
Servlet线程安全的问题
 */
public class ServletDemo04 extends HttpServlet{
    //1.定义用户名成员变量
    private String username = null;

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            //String username = null;
            synchronized (this){
            //2.获取用户名
            username = req.getParameter("username");
            try {
                Thread.sleep(3000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            //3.获取输出流对象
            PrintWriter pw = resp.getWriter();
            //4.响应给客户端浏览器
            pw.print("welcome:" + username);
            //5.关流
            pw.close();
        }
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req,resp);
    }
}

6.Servlet不同映射方式

第一种

具体名称的方式。访问的资源路径必须和映射配置完全相同

第二种

/ 开头 + 通配符的方式。只要符合目录结构即可,不用考虑结尾是什么

第三种

通配符 + 固定格式结尾的方式。只要符合固定结尾格式即可,不用考虑前面的路径

注意优先级问题。越是具体的优先级越高,越是模糊通用的优先级越低。第一种 -> 第二种 -> 第三种

例:

第一种:具体名称的方式

访问:http://localhost:8080/demo1/servletDemo05

package servlet;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/*
    Servlet不同映射方式
 */
public class ServletDemo05 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("ServletDemo05执行了...");
    }
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req,resp);
    }

}
 <!--Servlet不同映射方式-->
    <!--指定名称的方式-->
    <servlet>
        <servlet-name>servletDemo05</servlet-name>
        <servlet-class>servlet.ServletDemo05</servlet-class>

    </servlet>
    <servlet-mapping>
        <servlet-name>servletDemo05</servlet-name>
        <url-pattern>/servletDemo05</url-pattern>
    </servlet-mapping>

第二种:/开头+通配符的方式

访问:http://localhost:8080/demo1/servlet/....

 <!--/ 开头 + 通配符的方式-->
    <servlet>
        <servlet-name>servletDemo05</servlet-name>
        <servlet-class>servlet.ServletDemo05</servlet-class>

    </servlet>
    <servlet-mapping>
    <servlet-name>servletDemo05</servlet-name>
    <url-pattern>/servlet/*</url-pattern>
    </servlet-mapping>

第三种:通配符+固定格式结尾

访问:http://localhost:8080/demo1/xxx.do

<!--通配符+固定格式结尾的方式-->
    <servlet>
        <servlet-name>servletDemo05</servlet-name>
        <servlet-class>servlet.ServletDemo05</servlet-class>

    </servlet>
    <servlet-mapping>
        <servlet-name>servletDemo05</servlet-name>
        <url-pattern>*.do</url-pattern>
    </servlet-mapping>

7.Servlet创建时机

1.第一次访问时创建

优势:减少对服务器内存的浪费。提高了服务器启动的效率

弊端:如果有一些要在应用加载时就做的初始化操作,无法完成

2.服务器加载时创建

优势:提前创建好对象,提高了首次执行的效率。可以完成一些应用加载时要做的初始化操作

弊端:对服务器内存占用较多,影响了服务器启动的效率

修改Servlet创建时间:在<servlet>标签中,添加<load-on-startu>标签

正整数代表服务器加载时创建,值越小、优先级越高。 负整数或不写代表第一次访问时创建

<load-on-startup>加载顺序的序号</load-on-startup>

        序号为1,就是服务器启动时第一个加载

        序号为2,就是服务器启动时第二个加载

如果两个Servlet都要配置为正整数,那么值小的优先级高

 <!--Servlet生命周期的配置-->
    <servlet>
        <servlet-name>servletDemo03</servlet-name>
        <servlet-class>servlet.ServletDemo03</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>servletDemo03</servlet-name>
        <url-pattern>/servletDemo03</url-pattern>
    </servlet-mapping>

会在启动tomcat的时候初始化 

8.默认Servlet

默认Servlet是由服务器提供的一个Servlet,它配置在Tomcat的conf目录下的web.xml中

它的映射路径是<url-pattern>/<url-pattern>,我们在发送请求时,首先会在我们项目中的 web.xml 中查找映射配置,找到则执行。

但是当找不到对应的 Servlet 路径时,就去找默认的 Servlet,由默认 Servlet 处理。所以,一切都是 Servlet。

如果我们访问一个不存在的url,浏览器会加载一个404界面,这个404界面,其实就是tomcat配置的默认的Servlet处理的结果。

9.ServletConfig

1.ServletConfig概述

ServletConfig 是 Servlet 的配置参数对象,在 Servlet 的规范中,允许为每一个 Servlet 都提供一

些初始化的配置。所以,每个 Servlet 都有一个自己的 ServletConfig

作用:在 Servlet 的初始化时,把一些配置信息传递给 Servlet

生命周期

生命周期:和Servlet相同

如果Servlet配置了<load-on-startup>1</load-on-startup>,那么ServletConfig也会在应用加载时创建

ServletConfig的配置信息都是键值对的形式

2.ServletConfig的配置方式

在<servlet>标签中,通过<init-param>标签来配置。有两个子标签

<param-name>:代表初始化参数的 key

<param-value>:代表初始化参数的 value

一个init-param配置一个信息,一个信息由name和value组成(只允许一个键值对存在)

例:

package servlet;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/*
    ServletConfig的演示
 */
public class ServletConfigDemo extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req,resp);
    }
}

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>servletConfigDemo</servlet-name>
        <servlet-class>servlet.ServletConfigDemo</servlet-class>
        <!--配置ServletConfig初始化参数-->
        <init-param>
            <!--用于获取初始化参数的key-->
            <param-name>encoding</param-name>
            <!--初始化参数的值-->
            <param-value>UTF-8</param-value>
        </init-param>
        <init-param>
            <param-name>desc</param-name>
            <param-value>This is ServletConfig</param-value>
        </init-param>
    </servlet>
    <servlet-mapping>
        <servlet-name>servletConfigDemo</servlet-name>
        <url-pattern>/servletConfigDemo</url-pattern>
    </servlet-mapping>

</web-app>

3.ServletConfig的常用方法

返回值方法名说明
StringgetInitParameter(String name)根据参数名称获取参数的值
Enumeration<String>getlnitParameterNames()获取所有参数名称的枚举
String getServletName()获取Servlet的名称
ServletContextgetServletContext()获取ServletContext对象
package servlet;

import javax.servlet.ServletConfig;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Enumeration;

/*
    ServletConfig的演示
 */
public class ServletConfigDemo extends HttpServlet {

    //声明ServletConfig配置对象
    private ServletConfig config;

    //通过init方法来为ServletConfig配置对象赋值
    @Override
    public void init(ServletConfig config) throws ServletException {
        this.config = config;
    }


    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //演示ServletConfig常用方法
        //根据key获取value
        String encodingValue = config.getInitParameter("encoding");
        System.out.println(encodingValue);
        //获取所有的key
        Enumeration<String> keys = config.getInitParameterNames();
        while (keys.hasMoreElements()){
            //获取每一个key
            String key = keys.nextElement();
            //根据key获取value
            String value = config.getInitParameter(key);
            System.out.println(key + "," + value);
        }
        //获取Servlet的名称
        String servletName = config.getServletName();
        System.out.println(servletName);
        //获取ServletContext对象
        ServletContext context = config.getServletContext();
        System.out.println(context);

    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req,resp);
    }
}

访问:http://localhost:8080/demo2/servletConfigDemo

10.ServletContext

1.ServletContext概述

ServletContext 是应用上下文对象(应用域对象)。每一个应用中只有一个 ServletContext 对象

作用:可以配置和获得应用的全局初始化参数,可以实现 Servlet 之间的数据共享

生命周期:应用一加载则创建,应用被停止则销毁。

出生——活着——死亡

出生: 应用一加载,该对象就被创建出来了。一个应用只有一个实例对象。(Servlet和ServletContext都是单例的)

活着:只要应用一直提供服务,该对象就一直存在。

死亡:应用被卸载(或者服务器挂了),该对象消亡。

域对象

域对象指的是对象有作用域。也就是有作用范围域对象可以实现数据的共享不同作用范围的域对象,共享数据的能力也不一样

在 Servlet 规范中,一共有 4 个域对象ServletContext 就是其中的一个它也是 web 应用中最大的作用域,也叫 application 域它可以实现整个应用之间的数据共享

2.ServletContext的配置方式

ServletContext 并不属于某个 Servlet 的配置,而是针对于整个应用的配置,也叫全局的初始化参数

在<web-app>标签中,通过<context-param>标签来配置。有两个子标签

<param-name>:代表全局初始化参数的 key

<param-value>:代表全局初始化参数的 value

package servlet;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

public class ServletContextDemo extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req,resp);
    }
}

web.xml

<!--配置Servlet-->
    <servlet>
        <servlet-name>servletContextDemo</servlet-name>
        <servlet-class>servlet.ServletContextDemo</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>servletContextDemo</servlet-name>
        <url-pattern>/servletContextDemo</url-pattern>
    </servlet-mapping>

    <!--配置ServletContext-->
    <context-param>
        <param-name>globalEncoding</param-name>
        <param-value>UTF-8</param-value>
    </context-param>
    <context-param>
        <param-name>globalDesc</param-name>
        <param-value>This is ServletContext</param-value>
    </context-param>

3.ServletContext的常用方法

返回值方法名说明
StringgetInitParameter(String name)根据名称获取全局配置的参数
StringgetContextPath()获取当前应用的虚拟访问目录
StringgetRealPath(string path)根据虚拟目录获取应用部署的磁盘绝对路径
voidsetAttribute(String name,Object value)向应用域对象中存储数据
ObjectgetAttribute(String name)通过名称获取应用域对象中的数据
voidremoveAttribute(String name)通过名称移除应用域对象中的数据
package servlet;

import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

public class ServletContextDemo extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //获取ServletContext对象
        ServletContext context = getServletContext();
        //常用方法演示
        //获取全局配置参数:getInitParameter(String key)  根据key获取value
        String value = context.getInitParameter("globalDesc");
        System.out.println(value);
        //获取应用的虚拟目录:getContextPath()
        String contextPath =context.getContextPath();
        System.out.println(contextPath);
        //根据虚拟目录获取绝对路径:getRealPath(String path)
        String realPath = context.getRealPath("/");
        System.out.println(realPath);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req,resp);
    }
}

访问:http://localhost:8080/demo2/servletContextDemo

11.注解开发 Servlet

1.自动注解开发

1.创建一个web项目

2.定义一个类,继承HttpServlet

3.重写doGet和doPost方法

4.在类上使用@WebServlet注解配置Servlet

5.部署并启动项目

6.通过浏览器测试

package Servlet;

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;

/*
    基于注解方式开发
    @WebServlet("Servlet路径")
 */
@WebServlet("/servletDemo01")
public class ServletDemo01 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("ServletDemo01执行了...");
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req,resp);
    }
}

2.注解详解

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface WebServlet {
    //指定Servlet的名称。等效于web.xml文件<servlet>标签下的<servlet-name>
    String name() default "";
	//用于映射Servlet。等效于<url-pattern>
    String[] value() default {};
    String[] urlPatterns() default {};
	//指定Servlet的加载时机。等效于<load-on-startup>
    int loadOnStartup() default -1;
	//指定Servlet的初始化参数。等效于<init-param>
    WebInitParam[] initParams() default {};
	//指定Servlet是否支持异步
    boolean asyncSupported() default false;
	//指定Servlet的小图标
    String smallIcon() default "";
	//指定Servlet的大图标
    String largeIcon() default "";
	//指定Servlet的描述信息
    String description() default "";
	//指定Servlet的显示名称
    String displayName() default "";
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1085587.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

vue七牛云视频直传

完成后样式&#xff1a; 下面的代码是我自己项目里面用到的&#xff0c;一些判断看自己情况去掉&#xff0c;用的是element-ui组件 安装 uuid 库。你可以使用 npm 或 yarn 来完成安装。在终端中执行以下命令&#xff1a; npm install uuidhtml部分 <el-upload class&quo…

海外接单被没收百万收入并处以罚款,承德的这位程序员到底做了什么?

相信在接单圈混的程序员最近都听说了吧&#xff0c;承德的一位程序员因为翻墙接单被没收了105.8万的收入&#xff0c;还被处了10万的罚款&#xff0c;事件一出瞬间登上了热搜并在接单圈广为传播&#xff0c;如果你还没有听说过&#xff0c;也不用担心&#xff0c;现在我就先来给…

webmin远程命令执行漏洞

文章目录 漏洞编号&#xff1a;漏洞描述&#xff1a;影响版本&#xff1a;利用方法&#xff08;利用案例&#xff09;&#xff1a;安装环境漏洞复现 附带文件&#xff1a;加固建议&#xff1a;参考信息&#xff1a;漏洞分类&#xff1a; Webmin 远程命令执行漏洞&#xff08;CV…

python:使用卷积神经网络(CNN)进行回归预测

作者:CSDN @ _养乐多_ 本文详细记录了从Excel或者csv中读取用于训练卷积神经网络(CNN)模型的数据,包括多个自变量和1个因变量数据,以供卷积神经网络模型的训练。随后,我们将测试数据集应用于该CNN模型,进行回归预测和分析。 该代码进一步修改可用于遥感影像回归模型. …

CentOS7 NTP客户端的时间同步详解

需求&#xff1a;在CentOS7下配置NTP客户端时间同步服务 简介&#xff1a; NTP服务是为了时钟同步使用&#xff0c;特别在一些实时性数据库场景中非常重要。 Centos7下默认使用chronyd服务代替过渡ntpd服务&#xff0c;因此经常遇到大部分人还是记住ntpd服务而不去配置chronyd服…

spring6使用启用Log4j2日志框架

文章目录 Log4j2日志概述1. 引入Log4j2依赖2. 加入日志配置文件3. 测试 Log4j2日志概述 在项目开发中&#xff0c;日志十分的重要&#xff0c;不管是记录运行情况还是定位线上问题&#xff0c;都离不开对日志的分析。日志记录了系统行为的时间、地点、状态等相关信息&#xff…

小型企业必备的重要项目管理软件工具推荐!

大多数项目管理软件都包含有助于规划、协作和进度管理的工具。下面列出了在小型团队的项目管理软件中寻找的基本功能。 1、应用内交流 优秀的项目管理软件允许应用程序内通信、向团队成员发送通知以及使用内置聊天功能促进安全协作。 2、仪表盘 仪表板提供个人、团队和部门…

二十、自定义类型:枚举和联合

1 枚举类型 1.1 枚举类型的声明 例&#xff1a; enum Day//星期 {Mon,Tues,Wed,Thur,Fri,Sat,Sun }; enum Sex//性别 {MALE,FEMALE,SECRET }&#xff1b; enum Color//颜⾊ {RED,GREEN,BLUE };以上定义的enum Day&#xff0c;enum Sex&#xff0c;enum Color都是枚举类型。{…

超赞的AI文案生成器!真的什么都能写~

姐妹们&#xff0c;这个AI文案生成器真的太强了&#xff01; 种草笔记、爆款标题、短视频脚本、工作总结、自定义小说生成......只要输入关键词&#xff0c;就能生成一篇专业又优秀的文章&#xff0c;真的太绝了~ 小橙需&#xff1a;写作火火 安卓ios都可用 使用简单&#…

快上车,LLM专列:想要的资源统统给你准备好了

如有转载&#xff0c;请注明出处。欢迎关注微信公众号&#xff1a;低调奋进。​ (嘿嘿&#xff0c;有点标题党了​。最近整理了LLM相关survey、开源数据、开源代码等等资源&#xff0c;后续会不断丰富内容&#xff0c;省略大家找资料浪费时间。闲言少叙&#xff0c;正式发车&a…

【苍穹外卖 | 项目日记】第二天

前言&#xff1a; 坦率的讲今天有点水&#xff0c;课也多&#xff0c;上了一天课&#xff0c;中午下课后和晚上十一点多跑完步回来写了两个接口 目录 前言&#xff1a; 今日完结任务&#xff1a; 今日收获&#xff1a; 1.实现了公共字段填充功能 2.实现了文件上传接口 杂项…

35道Rust面试题

这套Rust面试题包括了填空题、判断题、连线题和编码题等题型。 选择题 1 &#xff0c;下面哪个是打印变量language的正确方法&#xff1f; A&#xff0c;println("{}", language); B&#xff0c;println(language); C&#xff0c;println!("{}", langu…

【已修复】vcruntime140.dll有什么用,vcruntime140.dll缺失如何修复

我是网友&#xff0c;今天非常荣幸能够在这里和大家分享关于电脑找不到vcruntime140.dll无法继续执行代码的解决方法。我相信&#xff0c;在座的许多朋友都曾遇到过这个问题&#xff0c;而今天我将为大家介绍五种有效的解决方法。 首先&#xff0c;让我们来了解一下vcruntime1…

stm32mp157中断简单应用

设置按键中断&#xff0c;按键1按下&#xff0c;LED亮&#xff0c;再按一次&#xff0c;灭 按键2按下&#xff0c;蜂鸣器响。再按一次&#xff0c;不响 按键3按下&#xff0c;风扇转&#xff0c;再按一次&#xff0c;风扇停 main.c #include "gpio.h" #include &…

99 # mongo 的基本安装和配置

关系型数据库和非关系型数据库 MySQL Oracle SqlServer 用一种关系模型来组织数据的数据库&#xff08;查询方便&#xff0c;不方便拓展&#xff09;nosql mongo redis memcached &#xff08;不同于传统的关系数据库&#xff09; mongo 特点 分布式&#xff1a;文档类型&am…

地下城堡3魂之诗阵容搭配攻略

在地下城堡3魂之诗游戏中&#xff0c;拥有一个合理搭配的阵容非常关键&#xff0c;可以让角色能力发挥最大化。以下是建议的阵容搭配及攻略&#xff1a; 关注【娱乐天梯】&#xff0c;获取内部福利号 1.核心成员(2名) 在阵容中选择两个输出型角色作为核心成员&#xff0c;他们的…

Vue实战项目1:跑马灯效果

Vue实战项目1&#xff1a;跑马灯效果 目录 一、效果预览二、编写思路三、整体代码展示 一、效果预览 二、编写思路 两个按钮用于启动和停止&#xff0c;绑定点击事件&#xff0c;使用v-on&#xff0c;可以简写为 <input type"button" value"跑起来" c…

扒一扒集成运放uA741的内部电路

uA741是一款常见的集成运放芯片,这个是uA741的内部电路。 Q1与Q2组成的差动对是整个741运算放大器的输入端,这两个三极管是射极跟随器的连接方式,特点是输入电阻大,输出电阻小。 Q1和Q2的输出接至共基极组态的PNP晶体管Q3和Q4

ECharts 双y轴时如何处理0刻度线对齐的问题

ECharts 多y轴时如何处理0刻度线对齐的问题 用echarts做双&#xff08;多&#xff09;轴时发现其中某轴有负数时0刻度线不对齐。 解决 首先判断是否有负数 const hasNegative Math.min(...seriesData[0], ... seriesData[1]);如果有的话&#xff0c;我的配置是这样的 yAxi…

Python利用jieba分词提取字符串中的省市区(字符串无规则)

目录 背景库&#xff08;jieba&#xff09;代码拓展结尾 背景 今天的需求就是在一串字符串中提取包含&#xff0c;省、市、区&#xff0c;该字符串不是一个正常的地址;,如下字符串 "安徽省、浙江省、江苏省、上海市,冷运标快首重1kg价格xx元,1.01kg(含)-5kg(不含)续重价…