1. 程式人生 > >servlet配置及域物件

servlet配置及域物件

一:ServletConfig(servlet配置資訊)

  • 配置資訊需要web.xml進行配置

  • 是以鍵值對形式配置 key=value

  • 在Servlet初始化時配置

  • 注意:

  • 1.每個Servlet都一個屬於自己的ServletConfig物件

  • 2.ServletConfig物件內部維護一個map集合

  • public class Demo001 extends HttpServlet {
    // 獲取方式1
    // 宣告成員變數來儲存ServletConfig
    private ServletConfig config;
    // 初始化Servlet配置資訊
    @Override
    public void init(ServletConfig config) throws ServletException {
    // TODO Auto-generated method stub
    super.init(config);
    // 接收引數中的配置物件
    this.config = config;
    }

    public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    //fun1();
    // 通過父類中方法 直接獲取ServletConfig物件
    ServletConfig config2 = this.getServletConfig();
    String value = config2.getInitParameter(“shaoye”);
    System.out.println(value);
    }

    private void fun1() {
    // 獲取ServletConfig中的值
    String value = this.config.getInitParameter(“shaoye”);
    System.out.println(value);
    // 遍歷ServletConfig中的值
    Enumeration names = this.config.getInitParameterNames();
    while (names.hasMoreElements()) {
    // 獲取所有name
    String name = names.nextElement();
    System.out.println(name + " = "
    + this.config.getInitParameter(name));
    }
    }

    public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    // TODO Auto-generated method stub
    doGet(request, response);
    }

}

二:域物件

  • 在一定範圍內 有效的物件

  • ServletContext(application域)

  • 作用範圍(最大範圍的域物件):

  • 當前工程都有效 並且整個工程有且只有一個ServletContext物件

  • 相當於一個單例物件

  • 注意:所有的域物件都有共同的特點 內部維護了一個map集合

  • 所有域物件共有的方法:

  • 1.setAttribute

  • 2.getAttribute

  • 3.removeAttribute

  • 域物件的作用

  • 1.存值取值

  • 2.進行單例傳值

  • 3.可以獲取全域性配置資訊 web.xml

  • 4.可以獲取專案中所有資源在伺服器上的絕對路徑 getRealPath

  • 5.可以進行請求轉發

  • public class Demo002 extends HttpServlet {
    public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    // 獲取context域方式1
    // 可以通過ServletConfig物件獲取
    ServletContext application = this.getServletConfig().getServletContext();
    // 存值
    application.setAttribute(“name”, “xiaobai”);
    System.out.println(“儲存值”);
    // 取出全域性配置資訊
    String value = application.getInitParameter("xioahei ");
    System.out.println(value);
    }

    public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    // TODO Auto-generated method stub
    doGet(request, response);
    }

}
三:測試application取值
public class Demo003 extends HttpServlet {

public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
	//fun1();
	ServletContext application = this.getServletContext();
	//  列印b的絕對路徑
	String path2 = application.getRealPath("/WEB-INF/classes/com/lanou3g/b.properties");
	//  列印c的絕對路徑
	String path3 = application.getRealPath("/WEB-INF/c.properties");
	System.out.println(path2);
	System.out.println(path3);
}

private void fun1() throws FileNotFoundException, IOException {
	//  獲取Context域方式2
	ServletContext application = this.getServletContext();
	//  獲取伺服器上的真實路徑
	//  引數:使用伺服器上相對於專案的相對路徑
	//      / 表示伺服器上專案名後面的斜槓
	String path1 = application.getRealPath("/WEB-INF/classes/a.properties");
	System.out.println(path1);
	//  讀取檔案列印value
	FileInputStream fis = new FileInputStream(path1);
	Properties properties = new Properties();
	properties.load(fis);
	System.out.println(properties.getProperty("key"));
	fis.close();
}

public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
	// TODO Auto-generated method stub
	doGet(request, response);
}

}
獲取請求轉發器
引數: 轉發的路徑
注意:請求轉發 只能轉發站內的路徑
並且傳入的地址 相對於工程
http://localhost:8080/sh-web-02/demo07
請求轉發注意
1.請求轉發使用者只發送了一次請求
2.網址沒有發生變化(使用者並不知道內部你怎麼操作的)
3.只能轉發站內

四:響應(response 響應回瀏覽器(使用者))

  • 響應行

  • 響應狀態碼

  • 200(成功) 302(重定向) http協議1.1

  • 響應頭

  • 告訴瀏覽器 要做什麼

  • 告訴瀏覽器 要下載

  • 告訴瀏覽器 要什麼編碼格式

  • 響應體

  • 響應的內容
    public class Demo004 extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    //tomcat 預設編碼格式 iso-8859-1
    response.setCharacterEncoding(“UTF-8”);
    //利用設定響應頭 告訴瀏覽器 以什麼編碼格式來解析響應
    response.setHeader(“Content-type”, “test/html;charset=UTF-8”);
    //相當於上面兩句二合一
    response.setContentType(“test/html;charset=UTF-8”);
    //利用response獲取 字元流 和位元組流
    PrintWriter writer = response.getWriter();
    writer.write(“wang”);
    }

    public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    // TODO Auto-generated method stub
    doGet(request, response);
    }

}
五:下載圖片
public class Demo005 extends HttpServlet {

public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
 //獲取圖片在伺服器上的真實路徑
String path = this.getServletContext().getRealPath("/WEB-INF/classes/哈哈.png");
//通過file 類  來獲取檔名
	File file=new File(path);
	String name = file.getName();
	System.out.println(name);
 //設定圖片名的編碼格式iso-8859-1
name =new String(name.getBytes(), "iso-8859-1");
//通過設定響應頭  來告訴瀏覽器  給資源   供下載
//content-disposition attachment;filename=圖片名
response.setHeader("content-disposition", "attachment;filename="+name);
//設定下載內容的格式(去web.xml中查詢資源字尾的格式)
response.setHeader("Content-type", "image/png");


 //使用位元組流讀取圖片
	FileInputStream fis=new FileInputStream(path);
//使用響應中的位元組流 將圖片寫回瀏覽器
	ServletOutputStream sos = response.getOutputStream();
	byte[] b=new byte[1024];
	int len=0;
	while ((len=fis.read(b))!=-1) {
		//將圖片寫回瀏覽器
		sos.write(b, 0, len);
	}
	fis.close();
}

public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
	// TODO Auto-generated method stub
	doGet(request, response);
}

}
通過響應response 請求重定向
可以進行站內重定向 相對於8080後的斜槓(需要帶上工程名)
可以進行站外重定向
新增重定向的狀態碼
注意 1.重定向 傳送兩次請求(網址變了)
2.會執行完第一次請求的方法 在進行第二次請求