- 我們打開一個頁面由一個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”)
- 首先配置web.xml的web應用初始化參數(例如)
<context-param>
<param-name>url</param-name>
<param-value>jdbc:mysql://localhost:3306/mybatis</param-value>
</context-param>
- 然後 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);
}
- 配置映射
<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.效果圖