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

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

MVC 構架學習之漸行漸進(三)

2019-11-18 12:44:16
字體:
來源:轉載
供稿:網友

  [b:9e5a30927b]操作Servlet[/b:9e5a30927b]  
    
  action  
  ActionServlet  
  
  
    
  action  
  *.do  
  
  
  部署信息把以.do結尾的URL映射到操作的servlet. jsp頁面在引用的方法為:  
    action="<%=response.encodeURL("actions.LoginAction.do")%>">  
  
  [b:9e5a30927b]用Servlet把URL映射到操作類[/b:9e5a30927b]  
  示例:ActionServlet類   /WEB-INF/classes/ ActionServlet  
  import javax.servlet.ServletException;  
  import javax.servlet.http.HttpServlet;  
  import javax.servlet.http.HttpServletRequest;  
  import javax.servlet.http.HttpServletResponse;  
  import actions.Action;  
  import actions.ActionRouter;  
  import actions.ActionFactory;  
  public class ActionServlet extends HttpServlet  
  {  
  PRivate ActionFactory factory=new ActionFactory();  
  public void init(ServletConfig config) throws ServletException  
  {  
    /*根據ActionRouter類導讀內容中對HttpServlet類的描述來看,HttpServlet規定了必須執行的方法,該時期調用了init()方法,當Servlet被Servlet引擎載入后,接下來就會執行init()這個方法,因此我們可以重載這個方法以做一些我們自己的初始化的工作。在Servlet的生命期中,init()方法僅在服務器裝入Servlet時被執行一次,此后無論有多少客戶機訪問這個Servlet,init()都不會被重復執行。*/  
  }  
  public void service(HttpServletRequest req, HttpServletResponse res)  
          throws java.io.IOException, ServletException  
      {  
       /*在Servlet被載入后,主要通過service()方法對外響應,該方法可以被同時、多次地呼叫。*/  
  try  
       {  
       Action action=factory.getAction(getClassname(req),getClass().getClassLoader());  
       ActionRouter router=action.perform(this,req,res);  
       router.route(this,req,res);  
       }  
       catch(Exception e)  
       {  
       throw new ServletException(e);  
       }  
      }  
      public String getClassname(HttpServletRequest req)  
      {  
       String Path=req.getServletPath();  
       int beginPos=Path.lastIndexOf("/");  
       int endPos=Path.lastIndexOf(".");  
       if (beginPos>-1 && endPos>beginPos)  
       {  
       Path=Path.substring(beginPos+1,endPos);  
       }  
       return Path;  
      }  
  }  
  該類的service方法實現了:從操作庫中獲取操作,然后調用接口的perform方法。由perform的實現返回一個操作路徑,最后由ActionRouter類的route方法進行重定向操作。達到頁面跳轉的作用。  
  導讀:getClassname(req)將獲取操作類名,過程如下:  
  由req.getServletPath()獲取servlet的路徑為/ actions.LoginAction.do通過截取得到類名:actions.LoginAction。  
  getClass().getClassLoader():getClass()方法是類的一個方法,主要用于返回一個類型為Class的對象。該例中返回為:class  ActionServlet  
  GetClassLoader()是Class類的一個方法,返回為ClassLoader對象。本例返回為:sun.misc.Launcher$AppClassLoader@92e78c。這說明加載ActionServlet類的類的加載者(classLoader的翻譯)為AppClassLoader.那么AppClassLoader又是什么呢?下面我們來解答該問題:  
  首先要明確java虛擬機上所有的類,必須要加載才能運行。JVM在運行時會產生三個ClassLoader, 它們分別是Bootstrap ClassLoader、Extension ClassLoader和AppClassLoader:  
  ClassLoader                 作    用  
  Bootstrap ClassLoader 加載核心類庫static const char classpathFormat[] ="%/lib/rt.jar:""%/lib/i18n.jar:""%/lib/sunrsasign.jar:""%/lib/jsse.jar:""%/lib/jce.jar:""%/lib/charsets.jar:""%/classes";這里我們可看到為什么在classpath里為什么不加載這些類  
  Extension ClassLoader 加載擴展類,即/lib/ext中的類。  
  AppClassLoader 加載Classpath中指定的類。  
  從上面可以看出,所有web應用程序的類都是AppClassLoader來加載的,三者的關系為:AppClassLoader的Parent是ExtClassLoader,而ExtClassLoader的Parent為Bootstrap ClassLoader。加載一個類時,首先BootStrap先進行尋找,找不到再由ExtClassLoader尋找,最后才是AppClassLoader。ClassLoader這種加載類的模型被稱為是委托模型。  
  下面我們要了解的問題是動態加載類原基本原理?或者說為什么我們要這么做?

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 慈利县| 昭通市| 九江市| 微山县| 泸西县| 镇远县| 莒南县| 昌都县| 禄丰县| 静宁县| 马关县| 贵德县| 东海县| 丹阳市| 清丰县| 方山县| 祁连县| 邹平县| 庄河市| 廉江市| 舒城县| 威信县| 遵化市| 长岛县| 湟中县| 新疆| 乌拉特后旗| 马鞍山市| 德州市| 永福县| 肥东县| 聂荣县| 浮梁县| 洮南市| 城口县| 喀喇沁旗| 隆子县| 屏东县| 宣汉县| 正蓝旗| 安仁县|