栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

javaweb基础:servlet第二篇 -----简单聊servlet 中servletconfig 和 servletcontext

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

javaweb基础:servlet第二篇 -----简单聊servlet 中servletconfig 和 servletcontext

ServletConfig

前面聊servlet的时有五个方法,但是聊了servlet的生命周期相关的方法,现在聊另一个方法:

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

但是如果查看默认的话,需要通过init方法:

// 因为这个参数直接在创建servlet的时候就会传递个init方法,
public void init(ServletConfig servletConfig) throws ServletException 

如果非要通过getServletConfig()得到,可以如下修改一下:

   // 声明一个变量
   ServletConfig servletConfig;
 
    @Override
    public void init(ServletConfig servletConfig) throws ServletException {
       this.servletConfig=servletConfig;
   
    }

    @Override
    public ServletConfig getServletConfig() {
        return this.servletConfig;
    }

这个ServletConfig对象, 该对象包含此 servlet 的初始化和启动参数。

通俗的说就是ServletConfig类包含servlet程序的配置信息

其实无论Servlet还是ServletConfig两者的对象创建都是由Tomcat负责创建的, 而开发者直接使用。毕竟开发者没有通过new来创建这两个对象。

在聊servlet生命周期的时候没有说ServletConfig,其实在第一次访问servlet的时候就创建了ServletConfig。而每一个servlet创建的时候都创建了一个ServletConfig对象。

而这个ServletConfig类有什么用?先看官方文档。

通过上面四个方法可以看出ServletConfig类的三个作用。

  • 可以获得servlet程序的别名(web.xml配置的名字)
  • 获取初始化参数init-param
  • 获取ServletContext对象。

前面说过web.xml和注释的区别的中说过,web.xml的配置信息会更多,而配置更多的消息可以通这个ServletContext得到。

下面只会添加一些配置信息,但是不是全部只是为了演示这ServletConfig作用,如果想要明白xml中配置信息有哪些,后面单独聊一篇,因为还会配置的过滤器等。

废话不多说还是老规矩进代码演示:




      
      
            test1
            com.xzd.test.test_servlet
            
                  name
                  xiaozhudi
            
            
                  myslqurl
                  jdbc:mysql://localhost:3306/test
            
      
      
      
            test1
            /test
      


然后可以进入如下操作:

package com.xzd.test;

import javax.servlet.*;
 
import java.io.IOException;
import java.util.Enumeration;
 
public class test_servlet implements Servlet {


    @Override
    public void init(ServletConfig servletConfig) throws ServletException {
        System.out.println("servlet.....");
        String servletName=servletConfig.getServletName();
        String name= servletConfig.getInitParameter("name");
        Enumeration parameters=servletConfig.getInitParameterNames();

        ServletContext ServletContext=servletConfig.getServletContext();
        System.out.println("servletName:  "+servletName);
        System.out.println(name);
        System.out.println("parameters:  "+parameters);
        while (parameters.hasMoreElements()){
            System.out.println(parameters.nextElement());
        }
        System.out.println("ServletContext:   "+servletName);
    }

    @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() {

    }
}

然后看一下后台的输出什么:

注意:

  • 在web.xml中配置servlet,每一个servlet标签都配置一个servletname标签,所以在servlet中的servletConfig只能得到自己的配置信息,不能得到其它的servlet的信息。
ServletContext

上面聊ServletConfig的方法的中其实一个方法:

public ServletContext getServletContext()

需要单独说一下呢,因为这个是上下文信息看一下官网的解释:

其实如果了解安卓的话,就更具容易理解,因为安卓的很多信息交互以及配置信息,都是通过类似的一个中上下文对象进行交互的。

ServletContext 类的作用:

  • ServletContext 可以默认中一个项目中的公用对象都可以存储和读取数据。对于上下文ServletContext 存储数据,其实有点像是map的样式,类似key-value,只不过方法存储和得到的方法不同。

  • 获取web.xml中配置的上下文参数context-param。

  • 可以得到web工程路径,格式:/工程路径

  • 获取工程部署后在服务器硬盘上的绝对路径。

注意:每个web项目都有一个上下文ServletContext ,同一个服务器下的多个项目,相互是独立的。

看官网:

上下文存取数据

上下文对于数据操作可以有如下方法:

setAttribute(String key,String value);  // 添加数据或修改数据
getAttribute(String key );// 得到数据
removeAttribute(String key);//删除数据

现在做一个实验创建两个servlet:

  • test1
package com.xzd.test;
import javax.servlet.ServletContext;
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("/test1")
public class test1 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doPost(req,resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("111111111111");
        ServletContext servletContext= getServletConfig().getServletContext();//也可以直接用getServletContext()
        servletContext.setAttribute("name","张三");

    }
}

  • test2
package com.xzd.test;
import javax.servlet.ServletContext;
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("/test2")
public class test2 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doPost(req,resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("22222");
        ServletContext servletContext= getServletConfig().getServletContext();//也可以直接用getServletContext()
        String name= (String) servletContext.getAttribute("name");
        System.out.println("222222-----"+name);


    }
}

因为创建的servlet如下:

而在GenericServlet定义了一个 getServletContext()方法,所以其子类可以直接调用getServletContext得到ServletContext对象。

因为浏览器默认是get请求,所以直接用访问:

第一次请求:http://localhost:8080/javaweb/test1

第二次请求:http://localhost:8080/javaweb/test2

获取web.xml中的参数

首先在web.xml如此添加数据:

   
      
            name
            李四
      

然后创建的servlet类:

import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet("/test1")
public class test1 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doPost(req,resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        ServletContext servletContext= getServletContext();
        String name=servletContext.getInitParameter("name");
        System.out.println("web.xml   "+name);
    }
}

得到路径

创建一个servlet:

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

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        ServletContext servletContext= getServletContext();
        System.out.println("当前工程路径  == "+servletContext.getContextPath());
        System.out.println("工程部署的路径  == "+servletContext.getRealPath("/"));
        
    }
}

看结果:

当然还有别的方法,其它的方法也是看需要的时候具体用了,就是简单的聊了一下常用的方法。

补充

任何语言中对路径有两种分类:相对路径和绝对路径。

  • 绝对路径: 就是完整的路径地址,比如:http://ip:port/工程路径/路径

  • 相对路径:指由这个文件所在的路径引起的跟其它文件(或文件夹)的路径关系。使用相对路径可以为我们带来非常多的便利。其中有常用的字符:

    • . : 表示当前目录

    • … : 表示上一级目录

    • / :在web中以/开始的话

      如果浏览器解析的话是:http://ip:port/

      斜杠尝试
      

      如果在服务解析的话是:http://ip:port/工程路径。

      第一:xml中
          /test1
      第二:
          servletContext.getRealPath("/")
      

      但是在服务器中的也有不同,不过写在服务器但是是有浏览器解析的。

      response.sendRedirect("/"); //所以其是http://ip:port/ 
      
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1013737.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号