[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這種加載類的模型被稱為是委托模型。
下面我們要了解的問題是動態加載類原基本原理?或者說為什麼我們要這麼做?