程序员社区

【Servlet-1】ServletContext接口

1.ServletContext接口

ServletContext接口:

  1. Tomcat服务器对ServletContext接口的实现类的完整类名:org.apache.catalina.core.ApplicationContextFacade
    javaweb程序员只需要面向ServletContext接口调用方法即可,不需要关心Tomcat具体的实现

  2. ServletContext到底是什么?什么时候被创建?什么时候被销毁?创建几个?
    Servlet被翻译为:Servlet上下文
    一个webapp只有一个web.xml对象,web.xml在文件启动阶段被解析
    一个webapp只有一个ServletContext对象,ServletContext在服务器启动时被实例化
    ServletContext在服务器关闭的时候被销毁
    ServletContext对应的是web.xml文件,是web.xml文件的代表
    ServletContext是Servlet对象四周环境的代表
    在同一个webapp中,所有Servlet对象共享同一个四周环境,该对象就是ServletContext
    所有的用户如果想共享同一个数据,可以将数据放到ServletContext对象中
    一般放到ServletContext对象中的数据是不建议修改的,因为ServletContext对象式多线程共享的一个对象,存在线程安全问题。

  3. ServletContext接口中有哪些常用的方法?
    向ServletContext范围内添加数据(map.put(key,value)):
    void setAttribute(String name, Object object)
    从Servletcontext范围内拿出数据(map.get(key)):
    Object getAttribute(String name)
    移除ServletContext范围呃逆的数据(map.remove(key)):
    void removeAttribute(String name)
    取出ServletContext中的name:
    String getInitParameter(String name)
    取出ServletContext中的所有name:
    Enumeration getInitParameterNames()
    取出文件的绝对路径:
    String getRealPath(String path)

  4. Servlet,ServletConfig,ServletContext之间的关系?
    一个Servlet对象对应一个ServletConfig对象
    所有的Servlet共享一个ServletContext对象

  5. ServletContext范围可以完成跨用户传递

html文件:

<html>

<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<a href="/26_ServletContext/a">AServlet</a>
<a href="/26_ServletContext/b">BServlet</a>
</body>
</html>

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">
<!--web,xml文件中配置上下文参数,这些信息自动封装到ServletContext对象中-->
    <context-param>
        <param-name>username</param-name>
        <param-value>admin</param-value>
    </context-param>
    <context-param>
        <param-name>password</param-name>
        <param-value>123</param-value>
    </context-param>

    <servlet>
        <servlet-name>a</servlet-name>
        <servlet-class>ServletContext.AServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>a</servlet-name>
        <url-pattern>/a</url-pattern>
    </servlet-mapping>

    <servlet>
        <servlet-name>b</servlet-name>
        <servlet-class>ServletContext.BServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>b</servlet-name>
        <url-pattern>/b</url-pattern>
    </servlet-mapping>
</web-app>
package domain;

public class User {
    private String username;
    private String usercode;

    public String getUsername() {
        return username;
    }

    public String getUsercode() {
        return usercode;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public void setUsercode(String usercode) {
        this.usercode = usercode;
    }

    @Override
    public String toString() {
        return "User{" +
                "username='" + username + '\'' +
                ", usercode='" + usercode + '\'' +
                '}';
    }
}

AServlet文件:

package ServletContext;

import domain.User;

import javax.servlet.*;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Date;
import java.util.Enumeration;

public class AServlet implements Servlet {
    //实例变量
    private ServletConfig config;
    @Override
    public void init(ServletConfig servletConfig) throws ServletException {
        System.out.println("AServlet="+servletConfig.toString());
        this.config=servletConfig;
    }
    @Override
    public ServletConfig getServletConfig() {
        return config;
    }

    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        //获取ServletConfig
        ServletConfig servletConfig = getServletConfig();
        //获取ServletContext对象
        ServletContext servletContext = servletConfig.getServletContext();

        /*
        //获取所有上下文参数的name
        Enumeration<String> names = servletContext.getInitParameterNames();
        while(names.hasMoreElements()){
            String name = names.nextElement();
            String value = servletContext.getInitParameter(name);
            System.out.println(name+":"+value);
        }
         */

        /*
        //获取文件的绝对路径
        String realPath = servletContext.getRealPath("/index.html");
        System.out.println(realPath);

        String realPath1 = servletContext.getRealPath("/WEB-INF/resource/db.properties");
        System.out.println(realPath1);
         */
        //创建user对象
        User user = new User();
        user.setUsername("hh");
        user.setUsercode("123");

        //向ServletContext范围中存储数据
        servletContext.setAttribute("userobj",user);
        servletContext.setAttribute("time",new Date());

        //从ServletContext范围内一处数据
        servletContext.removeAttribute("time");
    }

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

    }
}

BServlet文件:

package ServletContext;

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

public class BServlet implements Servlet {
    //实例变量
    private ServletConfig config;
    @Override
    public void init(ServletConfig servletConfig) throws ServletException {
        System.out.println("AServlet="+servletConfig.toString());
        this.config=servletConfig;
    }
    @Override
    public ServletConfig getServletConfig() {
        return config;
    }
    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        //获取ServletConfig
        ServletConfig servletConfig = getServletConfig();
        //获取ServletContext对象
        ServletContext servletContext = servletConfig.getServletContext();
        //从ServletContext对象中获取数据
        Object userobj = servletContext.getAttribute("userobj");
        Object time = servletContext.getAttribute("time");
        //将从ServletContext中获取到的数据打印输出到浏览器
        servletResponse.getWriter().print(userobj);
        servletResponse.getWriter().print(time);
    }
    @Override
    public String getServletInfo() {
        return null;
    }
    @Override
    public void destroy() {

    }
}

2.欢迎页面

  1. 欢迎页面怎么设置:
	<welcome-file-list>
        <welcome-file>login.html</welcome-file>
    </welcome-file-list>
  1. 为什么设置欢迎页面?
    为了访问方便,提高用户的体验
    直接在浏览器地址栏上访问该webapp即可,自动定位到欢迎页面login.html:http://localhost/27/
    在这里插入图片描述
<html>
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
欢迎页面
</form>
</body>
</html>
<?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">
    <welcome-file-list>
        <welcome-file>login.html</welcome-file>
    </welcome-file-list>

    <welcome-file-list>
        <welcome-file>html/welcome.html</welcome-file>
    </welcome-file-list>
</web-app>
  1. 欢迎页面可以设置多个,越往上,优先级越高
	<welcome-file-list>
        <welcome-file>login.html</welcome-file>
        <welcome-file>html/welcome.html</welcome-file>
    </welcome-file-list>
  1. yige webapp的欢迎页面不一定是一个html资源,可以时任意一种类型的web资源,欢迎页面可以是servlet
  2. 欢迎页面设置的时候,路径不需要以/开始
  3. 欢迎页面包括全局配置和局部配置
    全局配置:CATALINA_HOME/conf/web.xml
    局部配置:CATALINA_HOMEwebapps/webapp/WEB-INF/web.xml
    尊重就近原则

下面是默认的欢迎页面:

    <welcome-file-list>
        <welcome-file>index.html</welcome-file>
        <welcome-file>index.htm</welcome-file>
        <welcome-file>index.jsp</welcome-file>
    </welcome-file-list>

赞(0) 打赏
未经允许不得转载:IDEA激活码 » 【Servlet-1】ServletContext接口

相关推荐

  • 暂无文章

一个分享Java & Python知识的社区