<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                > 本文主要介紹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); } } ~~~ 1. 修改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); } } ~~~ 1. 訪問[http://localhost:8080/HttpSer/TestServlet](http://localhost:8080/HttpSer/TestServlet)即可看到結果。 ### 2servlet的路徑映射: ~~~ <url-pattern>/TestServlet</url-pattern>或者:@WebServlet(urlPatterns={"/TestServlet"}) ~~~ <table border="1"><tbody><tr><td>匹配方式</td> <td>url-pattern</td> <td>地址欄</td> </tr><tr><td>精確匹配</td> <td>/TestServlet<br/>/TestServlet/test</td> <td>http://localhost:8080/HttpSer/TestServlet<br/>http://localhost:8080/HttpSer/TestServlet/test</td> </tr><tr><td>模糊匹配</td> <td>/*<br/>/TestServlet/*<br/>/*.do</td> <td>http://localhost:8080/HttpSer/任意路徑<br/>http://localhost:8080/HttpSer/TestServlet/任意路徑<br/>http://localhost:8080/HttpSer/任意路徑.do</td> </tr></tbody></table> **注意** 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服務器控制的!!!! 1. Servlet重要的四個生命周期方法: 構造方法: 創建servlet對象的時候調用。默認情況下,第一次訪問servlet的時候創建servlet對象 只調用1次。證明servlet對象在tomcat是單實例的。 init方法: 創建完servlet對象的時候調用。只調用1次。 service方法: 每次發出請求時調用。調用n次。 destroy方法: 銷毀servlet對象的時候調用。停止服務器或者重新部署web應用時銷毀servlet對象。只調用1次。 1. 代碼演示: ~~~ @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.TestServlet 2)通過反射構造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方法被調用 ~~~ 1. 圖像演示如下: ![1](https://box.kancloud.cn/2016-04-13_570e001204b1a.png "") ### 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的servlet protected 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/TestRedect)變為[http://localhost:8080/HttpSer/GetData](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的servlet protected 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) [代碼下載](https://github.com/wpeace1212/BlogSource/tree/master/HttpSer/src/com/rlovep/serlvet)
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看