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.會執行完第一次請求的方法 在進行第二次請求