java web複習 day05(servlet基礎與細節)

        今天是三月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內容就是這些,累了,洗洗睡。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章