JavaWeb(入門篇06)ServletContext,Servlet信息之間的交互

  • 我們打開一個頁面由一個Servlet提供,但是我們思考一個問題,我們打開淘寶的時候只需要登錄一次,然後就可以訪問多個頁面了
  • 這是怎麼實現的呢?
  • 有的人想可以一個Servlet提交數據使用IO流儲存信息到文件裏,然後另一個ServletIO讀取即可,這個方法固然可以,但是實現比較麻煩,速度比較慢,不適合大衆程序員,於是就有打包好的可用的對象ServletContext對象

在這裏插入圖片描述

一、Servlet信息之間的交互 原理

1.ServletContext 的原理,

  • ServletContext所有的Servlet共享一個,類似單例模式
  • 每個Servlet都可以通過**this.getServletContext();**獲取那個唯一的ServletContext
  • (關係如圖)
    在這裏插入圖片描述

二、Servlet信息之間的交互 代碼實現

1. Submit.java

這個Servlet用於提交name到ServletContext,

package com.bmft;

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;

/**
 * 這個歌Servlet用於提交name到ServletContext,
 *
 */
public class Submit extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //這裏沒有表單提交先湊合字節寫一個測試.
        String name = "張三";
        ServletContext servletContext = this.getServletContext();
        servletContext.setAttribute("name",name);
        //返回提交成功的頁面
        resp.setContentType("text/html;charset=UTF-8");//亂碼問題解決
        resp.getWriter().write("<h1>提交成功!張三</h1>");

    }

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

2.GetContext.java

這個類用於獲得提交的Context裏面的內容

package com.bmft;

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;


/**
 * 這個類用於獲得提交的Context裏面的內容
 */
public class GetContext extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("GetContext成功");
        //這個類用於獲得提交的Context裏面的內容
        ServletContext servletContext = this.getServletContext();
        Object name = servletContext.getAttribute("name");
        //2.返回頁面給瀏覽器
        resp.setContentType("text/html;charset=UTF-8");
        resp.getWriter().write("<h1>提取名稱:"+(String)name+"</h1>");
    }

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

3.web.xml配置映射

  <!-- 一、 -->
  <servlet>
    <servlet-name>get</servlet-name>
    <servlet-class>com.bmft.GetContext</servlet-class>
  </servlet>
  <servlet>
    <servlet-name>submit</servlet-name>
    <servlet-class>com.bmft.Submit</servlet-class>
  </servlet>

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

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

4.效果

在這裏插入圖片描述
在這裏插入圖片描述

三、ServletContext其他功能介紹

1. 獲取初始化參數

核心代碼servletContext.getInitParameter(“url”)

  1. 首先配置web.xml的web應用初始化參數(例如)
  <context-param>
    <param-name>url</param-name>
    <param-value>jdbc:mysql://localhost:3306/mybatis</param-value>
  </context-param>
  1. 然後 GetInitParameter用來測試ServletContext 獲取初始化參數
    核心代碼:
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
	ServletContext servletContext = this.getServletContext();
	String url = servletContext.getInitParameter("url");
	resp.getWriter().write(url);
}
  1. 配置映射
  <servlet>
    <servlet-name>GetInitParameter</servlet-name>
    <servlet-class>com.bmft.GetInitParameter</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>GetInitParameter</servlet-name>
    <url-pattern>/GetInitParameter</url-pattern>
  </servlet-mapping>

4.輸出效果
在這裏插入圖片描述

2.請求轉發(區別於重定向)

核心代碼====
請求轉發只是放回的數據的改變,url地址沒有變.
1.新建頁面1 Page1.java

package com.bmft;

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;


/**
 * 被轉發的page1
 */
public class Page1 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("Page1啓動成功");
        resp.getWriter().write("Page1啓動成功");
    }

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

2.新建Page2.java**(請求轉發到page1的頁面)**

package com.bmft;

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;


/**
 * 核心代碼轉發到page1
 */
public class Page2 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("Page2啓動成功");
        resp.getWriter().write("Page2啓動成功");
        ServletContext servletContext = this.getServletContext();
        //核心代碼轉發到page1
        servletContext.getRequestDispatcher("/page1").forward(req,resp);
    }

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

3.映射

4.效果
在這裏插入圖片描述

3.讀取資源文件

==配置映射的時候Servlet-pattern配置錯成class地址,導致一直部署不了,別配置錯了 ==

3.1 讀取resources下的資源文件 db1.properties

1.在resources下新建db1.properties

name=張三
age=13

2.獲取resources下的資源文件 – GetResources1
使用相對path,相對對象爲生成的項目target中的index.jsp文件

package com.bmft;

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;


/**
 * 獲取resources下的資源文件
 */
public class GetResources1 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("獲取resources下的資源文件");
        InputStream inputStream = this.getServletContext().getResourceAsStream("WEB-INF/classes/db1.properties");
        Properties properties = new Properties();
        properties.load(inputStream);
        String name = properties.getProperty("name");
        String age = properties.getProperty("age");
        resp.getWriter().write(name+" "+age);
    }

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

3.配置映射==(小心別配置錯了,會部署不了)==

4.效果圖
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章