免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2735 | 回复: 2
打印 上一主题 下一主题

MVC渐行渐进(三) [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2003-08-02 21:27 |只看该作者 |倒序浏览
操作Servlet
<servlet>;
        <servlet-name>;action</servlet-name>;
        <servlet-class>;ActionServlet</servlet-class>;
</servlet>;
<servlet-mapping>;
        <servlet-name>;action</servlet-name>;
        <url-pattern>;*.do</url-pattern>;
</servlet-mapping>;
部署信息把以.do结尾的URL映射到操作的servlet. JSP页面在引用的方法为:
<form name="form1" method="post"
action="<%=response.encodeURL("actions.LoginAction.do"%>;">;

用Servlet把URL映射到操作类
示例: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这种加载类的模型被称为是委托模型。
下面我们要了解的问题是动态加载类原基本原理?或者说为什么我们要这么做?

论坛徽章:
0
2 [报告]
发表于 2003-08-04 15:52 |只看该作者

MVC渐行渐进(三)

你是不是在抄袭struts啊?,连
actionServlet的配置都一模一样啊?要不你索性说是STRUTS学习后感好了!!

论坛徽章:
0
3 [报告]
发表于 2003-08-04 16:51 |只看该作者

MVC渐行渐进(三)

楼上这位仁兄批评得对。我的主意也是把这些东西和自己的理解拿出来和大家共享。再者,天下文章大抄,只要抄得得法又何尝不是一篇新的文章呢?
  望指正
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP