[b:9e5a30927" />
龙盟编程博客 | 无障碍搜索 | 云盘搜索神器
快速搜索
主页 > 软件开发 > JAVA开发 >

MVC 构架学习之渐行渐进(三)

时间:2009-12-23 15:42来源:未知 作者:admin 点击:
分享到:
[b:9e5a30927b]操作Servlet[/b:9e5a30927b] action ActionServlet action *.do 部署信息把以.do结尾的URL映射到操作的servlet. jsp页面在引用的方法为: action="%=response.encodeURL("actions.LoginAction.do")%"> [b:9e5a30927

  [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这种加载类的模型被称为是委托模型。  
  下面我们要了解的问题是动态加载类原基本原理?或者说为什么我们要这么做?
  
精彩图集

赞助商链接