关于对ServletContext对象的应用详解

时间:2022-12-14 11:27:38

一.预准备工程

1.1 ServletContext的概念

ServletContext是用于存储信息的全局空间。它从服务器开始就存在,只有在服务器关闭后才释放。

ServletContext和Cookie、Session对比图如下:

关于对ServletContext对象的应用详解

2.1 创建新的Servlet项目

1.新建项目Servlet-02。

2.新建文件java,标记其为Sources Root。

3.新建接口为com.gowork.servlet

4.创建类helloservlet

5.继承HttpServlet

6.重写doGet和doPost方法

public class helloservlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("Hello");
    }
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        super.doPost(req, resp);
    }
}

7.注册hello,写映射

<servlet>
    <servlet-name>hello</servlet-name>
    <servlet-class>com.gowork.servlet.helloservlet</servlet-class>
</servlet>

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

8.重新设置web容器路径—tomcat

C:\Users\24190\IdeaProjects\xiao\servlet-02\src\main\webapp

关于对ServletContext对象的应用详解

测试可以正常访问!

二.ServletContext对象

做好了上面的准备过程,我们先了解一下几个对象

this.getInitParameter() 初始化参数
this.getServletConfig() servlet配置
this.getServletContext() servlet上下文

当web容器启动时,它将为每个web应用程序创建一个对应的ServletContext对象,该对象表示当前的web应用程序

  • 共享数据:我在这个servlet中保存的数据可以在另一个servlet中获得

    关于对ServletContext对象的应用详解

2.1 新建类 GetServlet

1.继承HttpServlet。

2.重写doGet和doPost。

@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    ServletContext context =this.getServletContext();
    String username = (String) context.getAttribute("username");
    resp.setContentType("text/html");
    resp.setCharacterEncoding("utf-8");
    resp.getWriter().print("我的用户名为"+username);

}

注册getx,写映射:如下

    <servlet>
        <servlet-name>getx</servlet-name>
        <servlet-class>com.gowork.servlet.getservlett</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>getx</servlet-name>
        <url-pattern>/getx</url-pattern>
    </servlet-mapping>

启动应用,测试项目

直接访问

http://localhost:8080/servlet-02/getx

会爆我的用户名为null

关于对ServletContext对象的应用详解

这是因为,我们没有执行hello类,没有生成ServletContext对象,现在的ServletContext是空的,所以显示我的用户名为null。

那么,我们先访问hello,再来访问getx,如下图:

关于对ServletContext对象的应用详解

关于对ServletContext对象的应用详解

现在就出现了——我的用户名为上进小菜猪。

因为我们在第一次访问hello的时候,服务器端会执行helloservlet类,将ServletContext对象赋值。

我们再访问getx的时候,ServletContext就不为空了,而变成了上进小菜猪。

三.ServletContext应用

3.1 获取初始化函数

1.新建立一个类,类名为:servleDemo3。

2.继承HttpServlet。

3.重写doGet和doPost。

ServletContext comtext = this.getServletContext();

获取到之前访问得到的ServletContext对象值。

4.配置一下web应用初始化参数

<context-param>
    <param-name>url</param-name>
    <param-value>jdbc:mysql://localhost:3306/mybatis</param-value>
</context-param>

5.前台输出url的值

String url = comtext.getInitParameter("url");
resp.getWriter().print(url);

6.去配置表里,注册,写对应的映射。

<servlet>
    <servlet-name>url</servlet-name>
    <servlet-class>com.gowork.servlet.servletDemo3</servlet-class>
</servlet>

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

7,启动项目,访问:

关于对ServletContext对象的应用详解

8.由上可以看出我们获取到了初始化函数。后期在这里链接我们的数据库。

jdbc:mysql://localhost:3306/mybatis

3.2 请求转发

1.首先先建立一个新的Demo方便我们操作,类名为servletDemo04。

2.配置好基础的步骤,与上面的配置步骤相同。

4.转发的请求路径

ServletContext context = this.getServletContext();   context.getRequestDispatcher("/url").forward(req,resp);

forward(req,resp);是实现了请求转发。

5.请求转发需要配置的注册表以及映射:

<servlet>
    <servlet-name>goandgo</servlet-name>
    <servlet-class>com.gowork.servlet.servletDemo04</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>goandgo</servlet-name>
    <url-pattern>/goandgo</url-pattern>
</servlet-mapping>

6.重新启动项目访问goandgo路径,观察下列结果。

关于对ServletContext对象的应用详解

3.2.1 转发和重定向的区别

转发是服务器行为,重定向是客户端行为。

重定向是浏览器上的网址改变,转发是浏览器上的网址不变。

关于对ServletContext对象的应用详解

3.3 读取资源文件

1.在build中配置resources,来防止我们资源导出失败的问题

<build>
    <resources>
        <resource>
            <directory>src/main/resources</directory>
            <includes>
                <include>**/*.properties</include>
                <include>**/*.xml</include>
            </includes>
        </resource>
        <resource>
            <directory>src/main/java</directory>
            <includes>
                <include>**/*.properties</include>
                <include>**/*.xml</include>
            </includes>
            <filtering>true</filtering>
        </resource>
    </resources>
</build>

关于对ServletContext对象的应用详解

2.新建类 类名为:servletDemo05。

3.继承类,重写doGet

4.在resour目录下新建db.properties

username=zhu
password=123456

5.路径指向当前项目生成路径:

InputStream is=this.getServletContext().getResourceAsStream("/WEB-INF/classes/db.properties");
Properties prop =new Properties();
prop.load(is);
String user = prop.getProperty("username");
String pas = prop.getProperty("password");

6.输出到页面

resp.getWriter().print(user+":"+pas);

7.写url注册与映射:

<servlet>
    <servlet-name>sx5</servlet-name>
    <servlet-class>com.gowork.servlet.servletDemo05</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>sx5</servlet-name>
    <url-pattern>/sx5</url-pattern>
</servlet-mapping>

8.访问localhost:8080/servlet-02/sx5

结果如下:

关于对ServletContext对象的应用详解