天天看點

ServletContext對象簡單介紹及應用ServletContext

ServletContext

  1. 定義:ServletContext定義為上下文對象,servletContext接口是Servlet中最大的一個接口,呈現了web應用的Servlet視圖。ServletContext執行個體是通過 getServletContext()方法獲得的。
  2. 作用範圍:一個Web應用有且僅有一個ServletContext對象
  3. 用途:多個Java程式可以向ServletContext對象存取資料,實作資料共享
    ServletContext對象簡單介紹及應用ServletContext
  4. 簡單示例

    Set

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 SetServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        ServletContext servletContext = this.getServletContext();  //獲得本對象的ServletContext對象
        String username = "khp";
        servletContext.setAttribute("username",username); //以鍵值對方式存資料
    }

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

Get

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 GetServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        ServletContext servletContext = this.getServletContext();   獲得本對象的ServletContext對象
        String username = (String)servletContext.getAttribute("username");   //取資料
        resp.setContentType("text/html");  
        resp.setCharacterEncoding("utf-8");  
        PrintWriter writer = resp.getWriter();   //獲得寫對象
        writer.print("名字為:"+username);  //顯示獲得資料
    }

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

           

Web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
                         http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0"
         metadata-complete="true">
  <display-name>Archetype Created Web Application</display-name>
  <servlet>
    <servlet-name>set</servlet-name>
    <servlet-class>com.khp.servlet.SetServlet</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>set</servlet-name>
    <url-pattern>/set</url-pattern>
  </servlet-mapping>
  
  <servlet>
    <servlet-name>get</servlet-name>
    <servlet-class>com.khp.servlet.GetServlet</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>get</servlet-name>
    <url-pattern>/get</url-pattern>
  </servlet-mapping>
</web-app>
           

注意:

如果通路Get前未通路Set,則無資料可讀,讀結果未null

ServletContext對象簡單介紹及應用ServletContext

若通路Get前已經Set存入資料,則正常讀取資料

ServletContext對象簡單介紹及應用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 ServletDemo03 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String url = this.getServletContext().getInitParameter("url");   //擷取初始化參數
        PrintWriter writer = resp.getWriter();
        writer.print(url);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}
           
<!--  設定初始化參數-->
  <context-param>  
    <param-name>url</param-name>
    <param-value>jdbc:mysql://localhost:3006</param-value>
  </context-param>
           
ServletContext對象簡單介紹及應用ServletContext

請求轉發

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 ServletDemo04 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        ServletContext servletContext = this.getServletContext();
        servletContext.getRequestDispatcher("/sd3").forward(req,resp);  //請求轉發到sd3
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}
           
<servlet>
    <servlet-name>sd4</servlet-name>
    <servlet-class>com.khp.servlet.ServletDemo04</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>sd4</servlet-name>
    <url-pattern>/sd4</url-pattern>
  </servlet-mapping>
           
ServletContext對象簡單介紹及應用ServletContext
ServletContext對象簡單介紹及應用ServletContext

可以看到雖然通路的是sd3,但是位址還是sd4,不變,所用請求轉發位址不變

擷取資源檔案

  1. 首先在resouces目錄下建立db.properties檔案
    ServletContext對象簡單介紹及應用ServletContext
  2. 運作Tomcat,通過更新後得Target包我們發現db.properties在目前應用下得Web-INF下的classes檔案夾下
    ServletContext對象簡單介紹及應用ServletContext
    3.Java類
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 ServletDemo05 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        InputStream is = this.getServletContext().getResourceAsStream("/WEB-INF/classes/db.properties");  //将資源檔案轉換成流檔案
        Properties properties = new Properties();
        properties.load(is);   //加載流檔案
        String username = properties.getProperty("username");  //擷取資源檔案内容
        String password = properties.getProperty("password");
        resp.getWriter().print(username+":"+password);   //列印資源檔案内容
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}
           
  1. 在web.xml檔案注冊
<servlet>
    <servlet-name>sd5</servlet-name>
    <servlet-class>com.khp.servlet.ServletDemo05</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>sd5</servlet-name>
    <url-pattern>/sd5</url-pattern>
  </servlet-mapping>
           
  1. 運作結果
    ServletContext對象簡單介紹及應用ServletContext