程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> MVC 構架學習之漸行漸進(三)

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

編輯:關於JAVA

[b:9e5a30927b]操作Servlet[/b:9e5a30927b]

action

ActionServlet

action

*.do

部署信息把以.do結尾的URL映射到操作的servlet. JSP頁面在引用的方法為:

action="">

[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這種加載類的模型被稱為是委托模型。

下面我們要了解的問題是動態加載類原基本原理?或者說為什麼我們要這麼做?

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved