action源代码的总结:
DispatchAction继承了BaseAction。而BaseAction里面只有资源文件的定义,没有如何业务逻辑。所以
DispatchAction也是一个普通的Action,因此它必须实现execute方法。在这里我们可以学到在必要的
情况下我们要抽取一个父类,把与业务逻辑无关的属性等放到父类里面去。这样的话有利于以后的扩展
以及起到了承上启下的作用。
LocaleAction只要继承LocaleAction,它就会自定把从Form里面拿到的语言等属性放到session当中。
可以简单的就实现国际化。里面有个很经典的方法,那就是getSimpleProperty(),这个方法通过传入
一个String类型的值可以直接拿到它的属性值。而不用我们传统的使用set和get去调用。通过这二个类
我们可以学到很多强大的知识点,比如说 apache下面的lang包,还有beanUtils包。这些包都很强大
struts标签库:
自定义标签编写包括四个步骤:
1.编写标签处理类
2.编写标签描述tld文件
3.配置web.xml文件
4.在jsp页面中声明并调用标签
LinkTag如何在使用debug调试来看了一下它是如何讲html:link转化成
href>的。从中我学到了一些技巧,比如说以前我们都是写死了路径的,而它里面则是使用request.get
ContextPath()来得到上下文路径的。以前我们都是使用if else来判断用户是否有权限的,
如果有一百个超链接的话,就用一百个if else。学了LinkTag以后,只需要简单的在它里面写一下if
else就可以决定是否显示某个超链接了。因此就提高了效率。
DispatchAction与LocaleAction
DispatchAction动态Action,其实它
的意思是分发Action。它其实也是普通的action。这个类是用来
拿method键值对的信息的。值其实就是要调的方法。通过这个键对应
的值它就会到ActionServlet里找相应匹配的方法。
LocaleAction这个类,只要我们继承它,它就会自动把form里的语言,
国家拿到。不过在execute()里一定要用super调用父类的方法,不然
就把父类的execute()覆盖了。这样那你只有自己在写了。
apache中commons.开源工具包下有很多相当强大的东西比如:
beanutils、validator、lang
这三个老师都带我们看了看,验证框架也比较强大。
光看email验证就知道了。
它们非常强大,如apache增强版lang里面增加了很多强大的方法。
如判断string是否为空。
//----------------------------------------------------------------------------------------
服务器进行初始化时,会加载web.xml文件并执行servlet.class.
当找到servlet.class映射文件时会调用ActionServlet类,这个类继承了HttpServlet,其顶级项是servlet接口。
因此它具有servlet的生命周期。
因为struts的核心是ActionServlet所以在初始化时会自动调用它的init()
方法,
其中struts的init初始化有以下几个步骤:
1.initlnternal();初始化内部资源文件。例如初始化内部的警告信息,提示信息,错误信息等。
2.initOther();初始化其他配置。
该方法初始化的是web.xml文件里面除了struts-config之外的配置.
该方法主要获取了其他config,debug参数。
3.initServlet();初始化servlt本身,
主要是通过Digester类解析web。
xml文件,把web.xml中关于servlet的配置放置到当前类.
初始化servlet本身servletMapping和 servletName。
disgester框架根据xml文件的结构,每次读到一个节点元素就会触发一个事件。
他的好处:简洁,方便,可以直接将XML
文档转换成java对象。
4.initChain();
初始化chain链框架,也就是初始化处理请求的流程。
这里主要用到的是职责链模式:它将每个类作为一个command,体现了单一原则。
创建form--->验证from-->创建action-->执行action--->f
word跳转
chain链的主要作用是执行一些复杂的处理流程,所以需要初始化这条链的结构。
该链使用第三方degester框架把struts中所有的配置信息映射到ModuleConfig对象中。
如果前面执行失败了,那后面的就不会执行,这就是所谓的开关原则。
例如:在单一职责类之间插入单一职责类时,无需修改内部源代码.
开关原则就是对外扩展是开放,对内修改关闭。
然后就是struts是如何处理请求。
1.以*.do结尾的URL被ActionServlet拦截,并执行service方法。
2.根据请求传递的方法GET/POST选择执行doGet()或doPost()方法。
3.在doGet()/doPost()方法中,都会调用process()方法统一进行处理。
在struts1.3.8版本之前
是在process()方法中获得RequestProcessor的实例
5.在用RequestProcess的实例调用process()方法,处理请求。
6.在RequestProcess类中,创建和验证Form都是在同一个方法里面进行。
由此我们可以看出它的耦合度非常高。
正是由于耦合度非常高,所以就出现了职责链模式,用职责链模式来代替了RequestProcess类这样在处理的过程中,采用职责链模式分别由对应的Command类进行处理。
并随时可能由于异常等原因返回。
最后根据ActionForward执行下一个流程 或 直接转往
JSP生成的
HTML发送到浏览器。
以上的知识点让我了解到职责链模式对外扩展是开放,对内修改是封闭的。
对外扩展是开放的:如果我们需要加一个新的功能,或者客户需要,我们只要配置一个Command。
而不用修改
源代码。
对内修改是封闭的:比如说要加一个权限,不需要修改它的源代码。或者说改的程度最小。