this is a extra element for clear the floated element
MVC构架学习之渐行渐进(三)
  • 12/31
  • 2008
mvcwea | Java 1731 次查看
  [b:9e5a30927b]操作Servlet[/b:9e5a30927b]

  

  action

  ActionServlet

  


  

  action

  *.do

  


  部署信息把以.do结尾的URL映射到操作的servlet.

  JSP页面在引用的方法为:

  
  name="form1"

  method="post"

  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这种加载类的模型被称为是委托模型。

  下面我们要了解的问题是动态加载类原基本原理?或者说为什么我们要这么做?
您可能感兴趣的:

更多相关内容