Javaweb03-Servlet技术1(Servlet,ServletConfig,ServletContext)

Servlet技术(Servlet,ServletConfig,ServletContext)

1.Servlet的概述

Servlet是运行在Web服务器端的Java应用程序,它使用Java语言编写。与Java程序的区别是,Servlet 对象主要封装了对HTTP请求的处理,并且它的运行需要Servlet容器(Tomcat)的支持。

  • Servlet接口的方法(javax.servlet.Servlet)
java 复制代码
Servlet,ServletConfig,ServletContext --> GenericServlet
--> HttpServlet(实现Http请求) --> 自定义Servlet
方法声明 功能描述
void init(ServletConfig config) Servlet实例化后,Servlet容器调用该方法完成初始化工作
void service (ServletRequest req,ServletResponse resp) 负责响应用户的请求,当容器接收到客户端访问Servlet对象的请求时,就会调用此方法。在service()方法中,可以通过ServletRequest对象得到客户端的相关信息和请求信息,在对请求进行处理后,调用ServletResponse对象的方法设置响应信息
void destroy() 负责释放Servlet对象占用的资源。当服务器关闭或者Servlet对象被移除时,Servlet对象会被销毁,容器会调用此方法
ServletConfig getServletConfig() 用于获取Servlet对象的配置信息,返回Servlet的ServletConfig对象
String getServletInfo() 返回一个字符串,其中包含关于Servlet的信息,例如,作者、版本和版权等信息
  • 继承HttpServlet的自定义Servlet
java 复制代码
@WebServlet("/TextServlet01")
public class TextServlet01 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doGet(request, response);
    }
}
  • Servlet的配置

1.web.xml配置Servlet

:用来定义Servlet的名字

:用来定义Servlet类的位置,包括包名和类名

:用来定义Servlet的映射路径,它有两个属性表示要映射的Servlet的名字,表示要映射的路径,要映射的路径前要加"/",表示相对于Tomcat的位置

xml 复制代码
<servlet>
    <servlet-name>TextServlet01</servlet-name>
    <servlet-class>com.tyut.TextServlet01</servlet-class>
</servlet>

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

2.@WebServlet配置Servlet

@WebServlet 注解用于代替web.xml文件中的等标签,该注解将会在项目部署时被容器处理,容器将根据具体的属性配置将相应的类部署为Servlet。可以标注在任意一个继承HttpServlet的类上

属性声明 功能描述
String name 指定Servlet的name属性,等价于。如果没有显式指定,则该 Servlet的取值即为类的全限定名。
String[] value 该属性等价于urlPatterns属性。urlPatterns和value属性不能同时使用,同时存在是忽略value的值。
String[] urlPatterns 指定一组Servlet的URL匹配模式。等价于标签。
InitParam[] 指定一组Servlet初始化参数,等价于标签。
java 复制代码
@WebServlet(name = "TextServlet01", urlPatterns = {"/TextServlet01", "/textServlet01"})
  • Servlet的生命周期
java 复制代码
当客户端向Servlet容器发出HTTP请求访问Servlet时,Servlet容器首先会解析请求,检查内存中是否已经有了该Servlet对象,如果有,直接使用该Servlet对象;如果没有,就创建Servlet实例对象,然后通过调用init()方法完成Servlet的初始化。需要注意的是,在Servlet的整个生命周期内,它的init()方法只被调用一次。之后访问Servlet,每一个请求作为一个线程,Servlet对象不会再次创建
java 复制代码
/**
 * Servlet的生命周期
 */
@WebServlet(name = "TextServlet02", urlPatterns = "/textServlet02")
public class TextServlet02 extends GenericServlet {
    public void init(ServletConfig servletConfig) {
        System.out.println("Servlet is called");
    }

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

    public void destroy() {
        System.out.println("Servlet is destroyed");
    }
}

2.ServletConfig接口

  • ServletConfig基本概述(每个Servlet的配置信息)

在Servlet运行期间,经常需要一些配置信息,可以在@WebServlet注解的属性中配置或者在web.xml中配置。

当Tomcat初始化一个Servlet时,会将该Servlet的配置信息封装到一个ServletConfig对象中,通过调用init(ServletConfig config)方法将ServletConfig对象传递给Servlet。

  • ServletConfig基本方法
方法声明 功能描述
String getInitParameter(String name) 根据初始化参数名返回对应的初始化参数值
Enumeration getInitParameterNames() 返回一个Enumeration对象,其中包含了所有的初始化参数名
ServletContext getServletContext() 返回一个代表当前Web应用的ServletContext对象
String getServletName() 返回Servlet的名字

1.通过在每个Servlet中的@WebServlet注解的initParams属性中,通过@WebInitParam(name="",value="")注解设置Servlet的初始化参数

2.通过ServletConfig方法调用每个Servlet的初始化参数

java 复制代码
/**
 * ServletConfig方法练习
 */
@WebServlet(name = "ServletConfigText",urlPatterns = "/textServlet03",
        initParams = {@WebInitParam(name = "encoding", value = "UTF-8"), @WebInitParam(name = "name", value = "tyut")})
public class TextServlet03 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("text/html;charset=utf-8");
        PrintWriter out = response.getWriter();

        ServletConfig sc = getServletConfig();
        //方法一:获取ServletConfig的内容
        String name = sc.getInitParameter("name");
        String encoding = sc.getInitParameter("encoding");

        out.write("name=" + name +  " encoding=" + encoding + "<br>");

        //方法二:获取ServletConfig的内容
        Enumeration<String> initParameterNames = sc.getInitParameterNames();
        while (initParameterNames.hasMoreElements()) {
            String param = initParameterNames.nextElement();
            String initParameter = sc.getInitParameter(param);
            out.write(param + ":" + initParameter + "<br/>");
        }
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doGet(request, response);
    }
}

3.ServletContext接口

  • ServletContext基本概述

当Servlet容器启动时,会为每个Web应用创建一个唯一的ServletContext对象代表当前Web应用。ServletContext对象不仅封装了当前Web应用的所有信息,而且实现了多个Servlet之间数据的共享。

  • 获取web应用初始化参数

1.通过再web.xml中配置web应用的初始化参数

xml 复制代码
<!--配置web应用程序的初始化参数-->
    <context-param>
        <param-name>school</param-name>
        <param-value>tyut</param-value>
    </context-param>

    <context-param>
        <param-name>address</param-name>
        <param-value>taiyuan</param-value>
    </context-param>

2.通过ServletContext方法实现对web应用程序初始化参数的调用

方法声明 功能描述
String getInitParameter(String name) 根据初始化参数名返回对应的初始化参数值
Enumeration getInitParameterNames() 返回一个Enumeration对象,其中包含了所有的初始化参数名
java 复制代码
@WebServlet("/TextServlet04")
public class TextServlet04 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("text/html;charset=utf-8");
        PrintWriter out = response.getWriter();

        ServletContext sc = getServletContext();
        /* 1.获取web应用程序初始化参数 */
        //方法一:
        String school = sc.getInitParameter("school");
        String address = sc.getInitParameter("address");

        out.write("school=" + school + "<br/>" + "address=" + address + "<br/>");
        //方法二:
        Enumeration<String> names = sc.getInitParameterNames();
        while (names.hasMoreElements()) {
            String s = names.nextElement();
            out.write(s + "=" + sc.getInitParameter(s) +"<br/>");
        }
    }
  • 实现多个Servlet数据共享(域对象)

一个Web应用中的所有Servlet共享同一个ServletContext对象,ServletContext对象的域属性可以被该Web应用中的所有Servlet访问。

方法声明 功能描述
Enumeration getAttributeNames() 获取域对象名字的Enumeration对象
Object getAttribute(String name) 根据域对象的名字获取域对象的值
void removeAttribute(String name) 根据域对象的名字删除域对象
void setAttribute(String name, Object value) 添加域对象
java 复制代码
@WebServlet("/TextServlet04")
public class TextServlet04 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        /* 2.实现Servlet之间的数据共享 */
        List<String> cart = new ArrayList<String>();
        cart.add("apple");
        cart.add("orange");
        sc.setAttribute("cart", cart);
        sc.setAttribute("food", "beef");
    }
}

@WebServlet("/TextServlet05")
public class TextServlet05 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("text/html;charset=utf-8");
        PrintWriter out = response.getWriter();

        ServletContext sc = getServletContext();
        List<String> cart = (List<String>) sc.getAttribute("cart");
        System.out.println(cart);

        sc.removeAttribute("food");
        String food = (String) sc.getAttribute("food");
        System.out.println(food);
    }
}
  • 读取web应用下的资源文件

ServletContext接口定义了一些读取Web资源的方法,这些方法是依靠Servlet容器来实现的。Servlet容器根据资源文件相对于Web应用的路径,返回关联资源文件的IO流、资源文件在文件系统的绝对路径

方法说明 功能描述
Set getResourcePaths(String path) 返回一个Set集合,集合中包含资源目录中子目录和文件的路径名称。参数path必须以正斜线(/)开始,指定匹配资源的部分路径
String getRealPath(String path) 返回资源文件在服务器文件系统上的真实路径(文件的绝对路径)。参数path代表资源文件的虚拟路径,它应该以正斜线(/)开始,"/"表示当前Web应用的根目录,如果Servlet容器不能将虚拟路径转换为文件系统的真实路径,则返回null
URL getResource(String path) 返回映射到某个资源文件的URL对象。参数path必须以正斜线(/)开始,"/"表示当前Web应用的根目录
InputStream getResourceAsStream(String path) 返回映射到某个资源文件的InputStream输入流对象。参数path传递规则和getResource()方法完全一致
java 复制代码
/**
 * ServletContext实现下载web应用下的资源文件
 */
@WebServlet("/TextServlet06")
public class TextServlet06 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("text/html;charset=utf-8");
        PrintWriter out = response.getWriter();

        //获取资源的绝对路径
        ServletContext sc = getServletContext();
        String path = sc.getRealPath("/WEB-INF/tyut.properties");
        System.out.println(path);


        //获得文件的流对象
        InputStream in = sc.getResourceAsStream("/WEB-INF/tyut.properties");
        Properties pros = new Properties();
        pros.load(in);

        System.out.println(pros.getProperty("name"));
        System.out.println(pros.getProperty("hobby"));
    }
}
相关推荐
程序猿进阶几秒前
堆外内存泄露排查经历
java·jvm·后端·面试·性能优化·oom·内存泄露
FIN技术铺5 分钟前
Spring Boot框架Starter组件整理
java·spring boot·后端
小曲程序12 分钟前
vue3 封装request请求
java·前端·typescript·vue
陈王卜29 分钟前
django+boostrap实现发布博客权限控制
java·前端·django
小码的头发丝、30 分钟前
Spring Boot 注解
java·spring boot
java亮小白199735 分钟前
Spring循环依赖如何解决的?
java·后端·spring
飞滕人生TYF41 分钟前
java Queue 详解
java·队列
武子康1 小时前
大数据-230 离线数仓 - ODS层的构建 Hive处理 UDF 与 SerDe 处理 与 当前总结
java·大数据·数据仓库·hive·hadoop·sql·hdfs
武子康1 小时前
大数据-231 离线数仓 - DWS 层、ADS 层的创建 Hive 执行脚本
java·大数据·数据仓库·hive·hadoop·mysql
苏-言1 小时前
Spring IOC实战指南:从零到一的构建过程
java·数据库·spring