当前位置导航:炫浪网>>网络学院>>编程开发>>JAVA教程>>J2EE

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


  [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这种加载类的模型被称为是委托模型。  
  下面我们要了解的问题是动态加载类原基本原理?或者说为什么我们要这么做?
相关内容
赞助商链接