首页 | 互联网 | IT动态 | IT培训 | Cisco | Windows | Linux | Java | .Net | Oracle | 软件测试 | C/C++ | 嵌入式开发 | 存储世界 | 服务器
网络设备 | IDC | 安全 | 求职招聘 | 数字网校 | 网页设计 | 平面设计 | 技术专题 | 电子书下载 | 教学视频 | 源码下载 | 搜索 | 博客 | 论坛
中国IT实验室Linux频道
中国IT教育
Google
首页 资讯动态 认证考试 新手入门 核心技术 高级技术 J2EE J2ME Java&XML 开源技术 其他技术 RSS订阅 论坛 专题
您现在的位置: 中国IT实验室 >> Java >> J2EE >> mvcwea >> 正文

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

中国IT教育

相关产品和培训
文章评论
 友情推荐链接
 认证培训
 专题推荐

 ·关于Java框架技术专题
 ·XML全攻略技术专题
 ·JAVA开源技术介绍专题
 ·Java嵌入式开发之J2ME技术专题
 ·超前体验 Oracle 11g的5个新特性…
 ·揭密使用VB.NET的五个实用技巧
 ·Oracle和SQL Server常用函数对比专题…
 ·展现C#世界 C#程序设计专题…
 ·Java入门 Tomcat的配置技巧精华专题…
 ·Oracle RMAN物理备份技术详解…
 今日更新
 社区讨论
 博客论点
 频道精选
 Java 频道导航