国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

Servlet入門實踐

2019-11-14 15:02:35
字體:
來源:轉載
供稿:網友

本文主要介紹servlet,包括入門到升入,基本上可以對servlet有一個很好的認識;

1servlet介紹:

??Servlet(Server Applet),全稱java Servlet,未有中文譯文。是用Java編寫的服務器端程序。其主要功能在于交互式地瀏覽和修改數據,生成動態Web內容。狹義的Servlet是指Java語言實現的一個接口,廣義的Servlet是指任何實現了這個Servlet接口的類,一般情況下,人們將Servlet理解為后者。
手把手教你建立一個繼承servlet的類:

  1. 在webcontent點擊右鍵選擇other,選擇servlet,這里就建成了servlet的類
  2. 重寫doGet和doPost方法

    public class TestServlet extends HttpServlet {	PRivate static final long serialVersionUID = 1L;	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {		response.setCharacterEncoding("utf-8");		PrintWriter out = response.getWriter();		out.println("hello peace");	}	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {		doGet(request, response);	}}
  3. 修改web.xml或者加上webServlet注解:
    修改web.xml:在根標簽下加入一下代碼

    <!-- 配置一個servlet -->  <!-- servlet的配置 -->  <servlet>  <!-- servlet的內部名稱,自定義。盡量有意義 -->       <servlet-name>TestServlet</servlet-name>       	<!-- servlet的類全名: 包名+簡單類名 -->       <servlet-class>com.rlovep.servlet.TestServlet</servlet-class>       <!-- servlet的映射配置 -->  </servlet>  <servlet-mapping>  <!-- servlet的內部名稱,一定要和上面的內部名稱保持一致!! -->      <servlet-name>TestServlet</servlet-name>      <!-- servlet的映射路徑(訪問servlet的名稱) -->      <url-pattern>/TestServlet</url-pattern>  </servlet-mapping>

    或者在類定義上加上webServlet的注解(注意兩者只能有一個)
    注意:1.不要在web.xml根標簽中指定metadata-complete="true".2。不要在web.xml中配置servlet
    修改后的servlet類:

    @WebServlet("/TestServlet")//設置servlet的訪問路徑為/TestServlet;或者這樣寫@WebServlet(name="TestServlet",urlPatterns={"/TestServlet"})public class TestServlet extends HttpServlet {	private static final long serialVersionUID = 1L;	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {		response.setCharacterEncoding("utf-8");		PrintWriter out = response.getWriter();		out.println("hello peace");	}	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {		doGet(request, response);	}}
  4. 訪問http://localhost:8080/HttpSer/TestServlet即可看到結果。

2servlet的路徑映射:

<url-pattern>/TestServlet</url-pattern>或者:@WebServlet(urlPatterns={"/TestServlet"})
匹配方式 url-pattern 地址欄
精確匹配 /TestServlet
/TestServlet/test
http://localhost:8080/HttpSer/TestServlet
http://localhost:8080/HttpSer/TestServlet/test
模糊匹配 /*
/TestServlet/*
/*.do
http://localhost:8080/HttpSer/任意路徑
http://localhost:8080/HttpSer/TestServlet/任意路徑
http://localhost:8080/HttpSer/任意路徑.do

注意
1)url-pattern要么以 / 開頭,要么以開頭。 例如, TestServlet是非法路徑。
2)不能同時使用兩種模糊匹配,例如 /TestServlet/
.do是非法路徑
3)當有輸入的URL有多個servlet同時被匹配的情況下:
??3.1 精確匹配優先。(長的最像優先被匹配)
??3.2 以后綴名結尾的模糊url-pattern優先級最低!!!

3servlet生命周期:

  1. 生命周期的引入:
    Servlet的生命周期: servlet類對象什么時候創建,什么時候調用什么方法,什么時候銷毀。
    以前的對象: new Student(); stu.study(); stu=null;
    Servlet程序的生命周期由tomcat服務器控制的!!!!
  2. Servlet重要的四個生命周期方法:
    構造方法: 創建servlet對象的時候調用。默認情況下,第一次訪問servlet的時候創建servlet對象 只調用1次。證明servlet對象在tomcat是單實例的。
    init方法: 創建完servlet對象的時候調用。只調用1次。
    service方法: 每次發出請求時調用。調用n次。
    destroy方法: 銷毀servlet對象的時候調用。停止服務器或者重新部署web應用時銷毀servlet對象。只調用1次。
  3. 代碼演示:
    ```
    @WebServlet(name="TestServlet",urlPatterns={"/TestServlet"})
    public class TestServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;
    int i=0;
    /**

    • 1.構造方法,只被調用一次
      */
      public TestServlet() {
      super();
      System.out.println("構造方法>>>>");
      }
      /**
    • 2.init初始化方法,在構造方法后只被調用一次
    • 有參數的init方法會調用init方法;;一般覆蓋無參數的init方法;
      */
      @Override
      public void init() throws ServletException {
      // TODO Auto-generated method stub
      super.init();
      System.out.println("inti>>>>");
      }
      /**
    • 3.service方法,發生請求和響應時調用的方法,次數不限
    • 一般是重寫doget和dopost,此去只是方便演示
      */
      @Override
      protected void service(HttpServletRequest arg0, HttpServletResponse arg1) throws ServletException, IOException {
      System.out.println("service>>>" +i++);
      }
      /**
  • 4.destory方法,只有在停止服務器和重新部署web應用時調用
    */
    @Override
    public void destroy() {
    System.out.println("destory");
    super.destroy();
    }
    }

    輸出結果:http://localhost:8080/HttpSer/TestServlet。連續訪問四次,得到下面的結果:

    構造方法>>>>
    inti>>>>
    service>>>0
    service>>>1
    service>>>2
    service>>>3
    Oct 11, 2015 8:53:52 PM org.apache.catalina.core.StandardContext reload
    INFO: Reloading Context with name [/HttpSer] has started
    destory
    ```
  1. 偽代碼演示:

    Tomtcat內部代碼運行:1)通過映射找到到servlet-class的內容,字符串: com.rlovep.serlvet.TestServlet2)通過反射構造TestServlett對象     2.1 得到字節碼對象         Class clazz = class.forName(" com.rlovep.serlvet.TestServlet");    2.2 調用無參數的構造方法來構造對象          Object obj = clazz.newInstance();     ---1.servlet的構造方法被調用3)創建ServletConfig對象,通過反射調用init方法    3.1 得到方法對象         Method m = clazz.getDeclareMethod("init",ServletConfig.class);     3.2 調用方法        m.invoke(obj,config);           --2.servlet的init方法被調用4)創建request,response對象,通過反射調用service方法     4.1 得到方法對象        Methodm m =clazz.getDeclareMethod("service",HttpServletRequest.class,HttpServletResponse.class);    4.2 調用方法    m.invoke(obj,request,response); --3.servlet的service方法被調用5)當tomcat服務器停止或web應用重新部署,通過反射調用destroy方法     5.1 得到方法對象        Method m = clazz.getDeclareMethod("destroy",null);    5.2 調用方法         m.invoke(obj,null);          --4.servlet的destroy方法被調用
  2. 圖像演示如下:
    1

4自動加載servlet:

默認情況下,第一次訪問servlet的時候創建servlet對象。如果servlet的構造方法或init方法中執行了比較多的邏輯代碼,那么導致用戶第一次訪問sevrlet的時候比較慢。
改變servlet創建對象的時機: 提前到加載web應用的時候!!!
在servlet的配置信息中,加上一個或者加上注解(loadOnStartup=1)即可:

 <servlet>  <!-- servlet的內部名稱,自定義。盡量有意義 -->       <servlet-name>TestServlet</servlet-name>       	<!-- servlet的類全名: 包名+簡單類名 -->       <servlet-class>com.rlovep.serlvet.TestServlet</servlet-class>       <load-on-startup>1</load-on-startup>  </servlet>或者:@WebServlet(name="TestServlet",loadOnStartup=1,urlPatterns={"/TestServlet"})

5多用戶問題:

注意: servlet對象在tomcat服務器是單實例多線程的。可以有多個用戶;
因為servlet是多線程的,所以當多個線程同時訪問了servlet的共享數據,如成員變量,可能會引發線程安全問題。
解決辦法:
1)把使用到共享數據的代碼塊進行同步(使用synchronized關鍵字進行同步)
2)建議在servlet類中盡量不要使用成員變量。如果確實要使用成員,必須同步。而且盡量縮小同步代碼塊的范圍。(哪里使用到了成員變量,就同步哪里!!),以避免因為同步而導致并發效率降低。

6Servlet常用對象:

servlet:有幾個比較有用的對象:

1.HttpServletRequest   請求對象   http協議中已講2.HttpServletResponse  響應對象  http協議中已講3.ServletConfig       servlet配置對象4.ServletContext    Servlet的上下文對象。對整個web應用有效5.Httpsession        會話對象,當一個用戶向服務器發送第一個請求時,服務器為其建立一個session,并為此session創建一個標識號;

ServletConfig對象介紹:

ServletConfig對象: 主要是用于加載servlet的初始化參數。在一個web應用可以存在多個ServletConfig對象(一個Servlet對應一個ServletConfig對象)
可以直接從getServletConfig方法;或者自己在有參的init中獲得 .
在web.xml中創建參數:一樣有兩種方法:

 <servlet>  <!-- servlet的內部名稱,自定義。盡量有意義 -->       <servlet-name>TestConfig</servlet-name>       	<!-- servlet的類全名: 包名+簡單類名 -->       <servlet-class>com.rlovep.serlvet.TestConfig</servlet-class>       <init-param>       		<param-name>name</param-name>       		<param-value>peace</param-value>       </init-param>  </servlet>或者:@WebServlet(urlPatterns={"/TestConfig"},        initParams={@WebInitParam(name="driver",value="com.MySQL*")                    ,@WebInitParam(name="url",value="jdbc*"),                    @WebInitParam(name="user",value="root"),                    @WebInitParam(name="pass",value="123456")})

測試如下:

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {		ServletConfig servletConfig = getServletConfig();        //得到servlet的名字		System.out.println(servletConfig.getServletName());		//根據參數名獲取參數值		String name=servletConfig.getInitParameter("user");		System.out.println(name+">>>>>");		//獲取所有參數名稱		Enumeration<String> names = servletConfig.getInitParameterNames();		while(names.hasMoreElements()){			String s=names.nextElement();			System.out.println(s+"="+servletConfig.getInitParameter(s));		}	}

ServletContext對象介紹:

1. 引入
ServletContext對象 ,叫做Servlet的上下文對象。表示一個當前的web應用環境。一個web應用中只有一 個ServletContext對象。
2. 對象引用的得到
創建時機:加載web應用時創建ServletContext對象。
得到對象: 從ServletConfig對象的getServletContext方法得到或者直接調用ServletContext servletContext = getServletContext();
3. 核心api

java.lang.String getContextPath()   --得到當前web應用的路徑java.lang.String getInitParameter(java.lang.String name)  --得到web應用的初始化參數java.util.Enumeration getInitParameterNames()void setAttribute(java.lang.String name, java.lang.Object object) --域對象有關的方法java.lang.Object getAttribute(java.lang.String name)void removeAttribute(java.lang.String name)RequestDispatcher getRequestDispatcher(java.lang.String path) --轉發(類似于重定向)java.lang.String getRealPath(java.lang.String path)     --得到web應用的資源文件java.io.InputStream getResourceAsStream(java.lang.String path)

4. 演示如下

ServletContext servletContext = getServletContext();		//得到當前web應用路徑		System.out.println("路徑:"+servletContext.getContextPath());		//根據參數名獲得參數值		System.out.println("AAA="+servletContext.getInitParameter("AAA"));		//獲取所有參數名稱		Enumeration<String> names = servletContext.getInitParameterNames();		while(names.hasMoreElements()){			String s=names.nextElement();			System.out.println(s+":"+servletContext.getInitParameter(s));		}		//設置域對象,整個web應用有效		servletContext.setAttribute("name","peace");		servletContext.setAttribute("age", "23");		//獲得域對象		System.out.println("name"+servletContext.getAttribute("name"));		System.out.println("age"+servletContext.getAttribute("age"));		//刪除域對象		servletContext.removeAttribute("age");		System.out.println("age"+servletContext.getAttribute("age"));

7.轉發和重定向;

域對象介紹:

域對象:作用是用于保存數據,獲取數據。可以在不同的動態資源(servlet)之間共享數據。
案例:

#通過重定向,使用實體內容傳遞數據,一般只能存儲字符Servlet1 傳數據:name=eric         response.sendRedirect("/Servlet2?name=eric")            Servlet2接收:        String request.getParameter("name");#通過域對象傳遞:可以傳遞任何數據;ServletContext就是一個域對象,上面有介紹怎么用    保存數據:void setAttribute(java.lang.String name, java.lang.Object object)    獲取數據: java.lang.Object getAttribute(java.lang.String name)    刪除數據: void removeAttribute(java.lang.String name)ServletContext域對象:作用范圍在整個web應用中有效!!!所有域對象:HttpServletRequet 域對象  測試;ServletContext域對象HttpSession 域對象PageContext域對象

重定向:

重定向是服務器告訴瀏覽器,重新請求另一頁面,請求信息丟失更新
a)地址欄會改變,變成重定向到地址。
b)重定向可以跳轉到當前web應用,或其他web應用,甚至是外部域名網站。
c)不能在重定向的過程,把數據保存到request中。
測試如下:

1.建立一個TestRedect servlet:protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {		/**		 * 保存數據到request域對象		 */		request.setAttribute("name", "rose");		    //重定向				/**				 * 注意:可以跳轉到web應用內,或其他web應用,甚至其他外部域名。				 */		//request域數據會丟失		response.sendRedirect("/HttpSer/GetData");		//重定向到外部域名:		//response.sendRedirect("www.baidu.com");	}2.建立一個GetData的servletprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {		PrintWriter out = response.getWriter();		out.println("hello");		System.out.println("獲得域對象"+request.getAttribute("name"));	}

現象如下:
1.地址欄從http://localhost:8080/HttpSer/TestRedect變為http://localhost:8080/HttpSer/GetData;
2.request域對象數據丟失:獲得域對象null

轉發:

轉發是服務器將請求信號封裝后轉發到另一個servlet頁面,請求信息會保存
a)地址欄不會改變
b)轉發只能轉發到當前web應用內的資源
c)可以在轉發過程中,可以把數據保存到request域對象中
測試如下:

1.建立一個TestRedect servlet:protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {	/**		 * 保存數據到request域對象		 */		request.setAttribute("name", "rose");		//轉發			/**		 * 注意:不能轉發當前web應用以外的資源。		 */		/*RequestDispatcher rd = this.getServletContext().getRequestDispatcher("/GetDataServlet");		rd.forward(request, response);*/		this.getServletContext().		getRequestDispatcher("/GetData").forward(request, response);	}2.建立一個GetData的servletprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {		PrintWriter out = response.getWriter();		out.println("hello");		System.out.println("獲得域對象"+request.getAttribute("name"));	}

現象如下:
1.地址欄沒有變化
2.request域對象數據沒有丟失:獲得域對象rose
來自一條小鯊魚(rlovep.com)
代碼下載


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 滦平县| 顺平县| 霍城县| 盱眙县| 胶南市| 栾川县| 沂源县| 五峰| 宝兴县| 城市| 龙南县| 宜昌市| 菏泽市| 醴陵市| 来凤县| 云安县| 济阳县| 京山县| 隆化县| 会同县| 定西市| 盱眙县| 老河口市| 固始县| 当雄县| 临猗县| 宁远县| 武陟县| 河池市| 腾冲县| 沈丘县| 镇平县| 平定县| 顺平县| 罗平县| 泰顺县| 象州县| 镇康县| 康保县| 洛川县| 彭山县|