ServletContext的一些应用

ServletContext的应用

1. 共享数据

第一步:创建一个Servlet类,用于提交数据:
通过setAttribute方法将数据赋值给一个字符串

package com.chen.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;
import java.io.PrintWriter;
//共享数据
public class HelloServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.setContentType("text/html");
        resp.setCharacterEncoding("utf-8");
        String username = "陈锦顺作业已提交";
        ServletContext context = this.getServletContext();
        context.setAttribute("name",username);
        PrintWriter writer = resp.getWriter();
        writer.println("谢谢,已提交!");
        System.out.println("执行了doGet方法!");
    }

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

第二步:创建一个新的Servlet类,用来获取setAttribute方法设置的数据:
利用getAttribute方法来获取setAttribute的字符串。

package com.chen.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 GetServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        ServletContext context = this.getServletContext();
        String name = (String) context.getAttribute("name");

        resp.setCharacterEncoding("utf-8");
        resp.setContentType("text/html");

        resp.getWriter().print("提示:"+name);
    }

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

第三步:在web.xml文件中将两个类都注册:

   <servlet>
        <servlet-name>hello</servlet-name>
        <servlet-class>com.chen.servlet.HelloServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>hello</servlet-name>
        <url-pattern>/hello</url-pattern>
    </servlet-mapping>
    
    <servlet>
        <servlet-name>get</servlet-name>
        <servlet-class>com.chen.servlet.GetServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>get</servlet-name>
        <url-pattern>/get</url-pattern>
    </servlet-mapping>

第四步:测试即可:

结果发现,如果在搜索框先输入get(获取数据的页面),得到的值会是null;
如果是先输入hello(发送数据的页面),再输入get(获取数据的页面),就可以的得到数据,实现数据的共享功能!

2.获取初始化参数

第一步:在web.xml文件中设置好初始化参数:

    <!--配置一些web应用初始化参数-->
    <context-param>
        <param-name>url</param-name>
        <param-value>jdbc:mysql://localhost:3306/mybatis</param-value>
    </context-param>

第二步:创建一个Servlet类,用来获取刚才设置的参数:
通过getInitParameter方法获取参数值。

package com.chen.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 ServletDemo extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        ServletContext context = this.getServletContext();
        String url = context.getInitParameter("url");
        resp.getWriter().print(url);
    }

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

第三步:在web.xml文件中注册刚才创建的Servlet类:

   <servlet>
        <servlet-name>ge</servlet-name>
        <servlet-class>com.chen.servlet.ServletDemo</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>ge</servlet-name>
        <url-pattern>/ge</url-pattern>
    </servlet-mapping>

第四步:测试服务器即可:

结果发现,当在搜索框中输入ge,可以显示出url的值!

3.请求转发

第一步:编写一个Servlet类:

利用getRequestDispatcher方法获取另一个页面的url-pattern,再用forward实现请求转发。

package com.chen.servlet;

import javax.servlet.RequestDispatcher;
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 ServletDemo2 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("进入了ServletDemo2!");
        ServletContext context = this.getServletContext();
 /*     RequestDispatcher dispatcher = context.getRequestDispatcher("/ge");//转发的请求路径
        dispatcher.forward(req,resp);//调用forward实现请求转发          */
        context.getRequestDispatcher("/ge").forward(req,resp);
    }

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

第二步:注册Servlet类在web.xml中:

   <!--请求转发-->
    <servlet>
        <servlet-name>sd</servlet-name>
        <servlet-class>com.chen.servlet.ServletDemo2</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>sd</servlet-name>
        <url-pattern>/sd</url-pattern>
    </servlet-mapping>

第三步:测试即可:

结果发现,我们在搜索框输入sd时,我们会显示ge页面的内容,且我们搜索框的路径不会变。

请求转发的用处在于,客户端想要请求B时,但是只知道A的地址,不知道B的地址;我们可以通过A访问B的信息!

4.读取资源文件

第一步:写一个properties文件

username=root
password=123456

第二步:写一个Servlet类:

通过getResourceAsStream方法获取一个文件流,需要注意的是路径为项目执行后资源文件在target下的路径。

package com.chen.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;
import java.io.InputStream;
import java.util.Properties;
//读取资源文件
public class ServletDemo3 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        ServletContext context = this.getServletContext();
        //获取流的路径是在项目执行后资源文件在target下的路径
        InputStream in = context.getResourceAsStream("/WEB-INF/classes/dp.properties");
        Properties prop = new Properties();
        prop.load(in);//将获取的流加载
        String user = prop.getProperty("username");
        String pwd = prop.getProperty("password");
        resp.getWriter().println("username:"+user);
        resp.getWriter().println("password:"+pwd);

    }

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

第三步:在web.xml文件中注册:

    <!--读取资源文件-->
    <servlet>
        <servlet-name>read</servlet-name>
        <servlet-class>com.chen.servlet.ServletDemo3</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>read</servlet-name>
        <url-pattern>/read</url-pattern>
    </servlet-mapping>

第四步:测试即可:

结果发现,我们在搜索框中输入read时,可以获取配置文件的值!

posted @ 2021-09-23 11:36  夕阳的孤独  阅读(67)  评论(0)    收藏  举报