今天是三月20號,離月底還有11天,感覺是有點趕不上進度了,加上這兩天的畢業設計也耽誤了一些時間,所以時間很倉促。
day05的內容主要是servlet開發,servlet是sun發佈的一款用於開發動態web資源的技術,本質是一個接口。一般的servlet繼承的是HttpServlet類,覆蓋其service方法,在實現get請求時,使用doGet()方法,在實現post請求時,使用doPost()請求。所以一般是直接覆蓋doPost()或者doGet()。
servlet有幾個細節:
(1)servlet在創建時,WEB-INF中會自動創建其映射例如:
<web-app>
<servlet>
<servlet-name>HelloServlet</servlet-name>
<servlet-class>cn.iatcast.HelloServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>HelloServlet</servlet-name>
<url-pattern>/servlet/HelloServlet</url-pattern>
</servlet-mapping>
</web-app>
一般約定,<servlet-name>標籤與類名相同,<url-pattern>標籤中爲/servlet/類名
(2)servlet映射過程中有兩種url通配方式,一種是*.擴展名,一種是/*,在訪問時,一般長得像爲優先以及/爲優先。
(3)servlet實例對象一旦創立,它就會一直在內存中,直到web容器退出,他才被銷燬。
(4)如果一個servlet的映射路徑僅爲一個/,那麼這個servlet就成爲當前web應用程序的缺省servlet
接下來衍生講了線程安全問題,synchronized是Java語言的關鍵字,可用來給對象和方法或者代碼塊加鎖,當它鎖定一個方法或者一個代碼塊的時候,同一時刻最多隻有一個線程執行這段代碼。 synchronized(this)代表鎖定當前對象。
ServletConfig與ServletContext
ServletConfig內容較少,主要講了使用<init-param>配置初始化參數,然後通過ServletConfig的方法來獲取參數:在web.xml中配置如下:
<servlet>
<description>This is the description of my J2EE component</description>
<display-name>This is the display name of my J2EE component</display-name>
<servlet-name>ServletConfigDemo1</servlet-name>
<servlet-class>cn.itcast.servletconfig.ServletConfigDemo1</servlet-class>
<init-param>
<param-name>username</param-name>
<param-value>crush</param-value>
</init-param>
</servlet>
Servlet中獲取如下:
String username = this.getServletConfig().getInitParameter("username");
ServletContext爲今天內容的重中之重。web容器在啓動時,會爲每個WEB應用程序創建一個對應的ServletContext對象,代表當前的web應用。通過ServletConfig.getServletContext()來獲取ServletContext對象,一個web中的所有的servlet共享一個ServletContext對象。
ServletContext應用如下:
(1)獲得整個web站點的初始參數
<context-param>
<param-name>url</param-name>
<param-value>jdbc:mysql://localhost:3306/test</param-value>
</context-param>
String url = (String) this.getServletConfig().getServletContext().getInitParameter("url")
(2)多個servlet通過servletContext實現數據共享
public class ServletContextDemo1 extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String username = "crush";
ServletContext context = this.getServletConfig().getServletContext();
context.setAttribute("data", data); //map
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
public class ServletContextDemo2 extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
ServletContext context = this.getServletContext();
String data = (String) context.getAttribute("username");
System.out.println(username);
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
(3)轉發功能(請求重定向)
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
RequestDispatcher rd = this.getServletConfig().getServletContext().getRequestDispatcher("/servlet/ServletContextDemo5");
rd.forward(request, response);
}
(4)利用ServletContext獲得資源文件
private void test2() throws IOException{
InputStream in = this.getServletContext().getResourceAsStream("/WEB-INF/classes/db.properties");
Properties prop = new Properties();
prop.load(in);
String driver = prop.getProperty("driver");
System.out.println(driver);
//讀取web工程中資源文件的模板代碼
}
private void test3() throws IOException {
//獲取web資源的絕對路徑
String path = this.getServletContext().getRealPath("/WEB-INF/classes/db.properties");
FileInputStream in = new FileInputStream(path);
Properties prop = new Properties();
prop.load(in);
String driver = prop.getProperty("driver");
System.out.println(driver);
}
(5)利用類裝載器讀取資源
private void test1() throws IOException {
//獲取到裝載當前類的類裝載器
ClassLoader loader = ServletContextDemo7.class.getClassLoader();
//用類裝載器裝載db.properties文件
InputStream in = loader.getResourceAsStream("db.properties");
Properties prop = new Properties();
prop.load(in);
String driver = prop.getProperty("driver");
String url = prop.getProperty("url");
String username = prop.getProperty("username");
String password = prop.getProperty("password");
System.out.println(driver);
}//通過類裝載器讀取資源文件的注意事項:不適合裝載大文件,否則會導致jvm內存溢出
(6)讀取大文件的方法,此例中使用一個100+m的視頻做示例
//文件太大,只能用servletContext
public void test4() throws IOException{
//讀取pokerface.mp4,並拷貝到e:\根目錄下
//path=c:\asdf\adsd\add\PranavMistry_2009I_480.mp4
//path=PranavMistry_2009I_480.mp4
////獲取文件名
String path = this.getServletContext().getRealPath("/WEB-INF/classes/pokerface.mp4");
String filename = path.substring(path.lastIndexOf("\\")+1);//分割出文件名,天才
//讀文件模板代碼
InputStream in = this.getServletContext().getResourceAsStream("/WEB-INF/classes/pokerface.mp4");
byte buffer[] = new byte[1024];
int len = 0;
FileOutputStream out = new FileOutputStream("e:\\" + filename);
while((len=in.read(buffer))>0){
out.write(buffer,0,len);
}
out.close();
in.close();
}
所以day05內容就是這些,累了,洗洗睡。