【JavaWeb】之ServletContext的应用

web容器在启动的时候,它会为每个web程序创建一个唯一的ServletContext对象,通过使用它可以对当前的web应用进行操作

共享数据

在web应用中有一个servlet对web容器对象进行操作或者提交数据之后,其他的servlet对象也可以访问并得到web容器中的数据。

下面演示一个例子帮助大家理解,HelloServlet类的操作是向web容器中存放键值对形式(K:V)格式的数据,GetServlet类是从web容器中取出键所对应的值。

向web容器中填充数据的类

public class HelloServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //web程序的容器操作对象
        ServletContext context = this.getServletContext();
        String username = "喜多川";
        //使用web程序的操作对象将键值对的数据存放到web容器中,供给当前web程序下的servlet使用
        context.setAttribute("username",username);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //不管是post请求还是get请求,都转为get请求处理
        doGet(req, resp);
    }
}

从web容器中得到数据的类

public class GetHello extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.setContentType("text/html");   //设定页面响应格式
        resp.setCharacterEncoding("utf-8"); //设定页面编码
        String username = (String)this.getServletContext().getAttribute("username"); //拿到username对应的值
        resp.getWriter().print(username);	//将结果输出到页面上
    }

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

完成以上两步的代码编写后记得向web.xml中注册servlet

<!--    注册servlet-->
<!--    Servlet第一个应用,共享数据-->
    <servlet>
        <servlet-name>Hello</servlet-name>
        <servlet-class>com.darling.servlet01.HelloServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>Hello</servlet-name>
        <url-pattern>/hello</url-pattern>
    </servlet-mapping>


    <servlet>
        <servlet-name>Gets</servlet-name>
        <servlet-class>com.darling.servlet01.GetHello</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>Gets</servlet-name>
        <url-pattern>/gets</url-pattern>
    </servlet-mapping>

注册完成后访问网址的地址分别为

http://localhost:8080/hello		对应		HelloServlet类
http://localhost:8080/gets		对应		GetHello类

获取初始化配置信息

说道获取信息,首先应该知道信息存在哪里才可以获取,所以这个初始化配置信息就在web.xml中自定义的

定义的格式是: 其实就像是一个键值对的格式————>url : jdbc:mysql://localhost:3306/mybatis

    <context-param>
        <param-name>url</param-name>  //键
        <param-value>jdbc:mysql://localhost:3306/mybatis</param-value>   //值:数据库链接时的端口
    </context-param>

然后编写java代码类

/**
 * 该类意为实现servlet第二个获取初始化配置信息的功能
 */
public class ServletDemo01 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //自己定义的键的名字是啥,那么就获取对应的值("url为自定义的")
        String urls = this.getServletContext().getInitParameter("url");
        resp.getWriter().print(urls);
    }

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

然后别忘了对编写的java类注册成servlet身份,这样才能在网页中访问

<!--    Servlet第二个应用:获取初始化配置信息-->
    <servlet>
        <servlet-name>S2</servlet-name>
        <servlet-class>com.darling.servlet01.ServletDemo01</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>S2</servlet-name>
        <url-pattern>/s2</url-pattern>
    </servlet-mapping>

注册完之后,访问网址为

http://localhost:8080/s2

请求转发

这个servlet应用很简单,就是当你进入一个页面的时候,这个页面将不显示当前内容,直接将你转发到新的页面。

代码如下:

/**
 * 该类意为实现servlet第三个应用:请求转发功能
 */
public class ServletDemo02 extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //  "/gets"是在web.xml中注册servlet时自己定义的网页路径
        this.getServletContext().getRequestDispatcher("/gets").forward(req,resp);
    }

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

当然上面这个也要在web.xml中进行servlet注册

<!--    Servlet第三个应用:请求转发功能-->
    <servlet>
        <servlet-name>S3</servlet-name>
        <servlet-class>com.darling.servlet01.ServletDemo02</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>S3</servlet-name>
        <url-pattern>/s3</url-pattern>
    </servlet-mapping>

注册完之后访问网址为

http://localhost:8080/s3

获取配置文件的信息

配置文件的拓展名是——> *.Properties

当前存在一个配置文件为 db.properties ,内容如下

username=root
password=123456

想要访问配置文件中的数据,那么就先创建java类

/**
 * 该类意为实现servlet的第三个应用:获取配置文件中的信息
 */
public class ServletDemo03 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        InputStream resourceAsStream = this.getServletContext().getResourceAsStream("/WEB-		INF/classes/db.properties");   //当前生成的web程序中配置文件所在的相对路径,注意是相对路径
        Properties properties = new Properties();
        properties.load(resourceAsStream);
        String uam = properties.getProperty("username");   //获取username对应的值
        String pwd = properties.getProperty("password");   //获取password对应的值

        resp.getWriter().print(uam+":"+pwd);   //打印在网页上
    }

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

java类编写完之后,记得在web.xml中注册servlet身份

<!--    Servlet第四个应用:获取配置文件中的信息-->
    <servlet>
        <servlet-name>S4</servlet-name>
        <servlet-class>com.darling.servlet01.ServletDemo03</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>S4</servlet-name>
        <url-pattern>/s4</url-pattern>
    </servlet-mapping>

注册完之后访问网址为

http://localhost:8080/s4

最后说一句Tomcat10Tomcat9中使用HttpServlet类的不同方式

Tomcat9以及以下版本中HttpServlet类在javax包下,全称 javax.servlet.http.HttpServlet

Tomcat10中HttpServlet类在jakarta包下,全称 jakarta.servlet.http.HttpServlet

不注意这个问题的话可能会,啊不一定会出现访问servlet注册时的网页时,提示访问错误,错误访问码500,错误信息是:不认为你所编写的类是servlet对象,因为找不到HttpServlet类所以编写的类没有继承成功,所以不认为是servlet对象。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

卡特霖娜

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值