`
tongchuanwei
  • 浏览: 8828 次
  • 性别: Icon_minigender_1
  • 来自: 郑州
文章分类
社区版块
存档分类
最新评论

java学习笔记10 struts2

阅读更多

最近业余时间笔者一直Java Virtual Machine的研究,由于实习分配到项目组里面,不想从前那么闲了,好不容易才抽出时间来继续这个话题的帖子。我打算把J2ee的部分结束之后,再谈谈 JVMJavaScript,只要笔者有最新的学习笔记总结出来,一定会拿来及时和大家分享的。衷心希望与热爱Java的关大同仁共同进步……

 

这次准备继续上次的话题先讲讲Struts-2,手下简短回顾一段历史:随着时间的推移,Web应用框架经常变化的需求,产生了几个下一代 Struts的解决方案。其中的Struts Ti 继续坚持 MVC模式的基础上改进,继续Struts的成功经验。 WebWork项目是在20023月发布的,它对Struts式框架进行了革命性改进,引进了不少新的思想,概念和功能,但和原Struts代码并不兼 容。WebWork是一个成熟的框架,经过了好几次重大的改进与发布。在200512月,WebWorkStruts Ti决定合拼, 再此同时, Struts Ti 改名为 Struts Action Framework 2.0,成为Struts真正的下一代。

 

看看Struts-2的处理流程:

1) Browser产生一个请求并提交框架来处理:根据配置决定使用哪些拦截器、action类和结果等。

2) 请求经过一系列拦截器:根据请求的级别不同拦截器做不同的处理。这和Struts-1RequestProcessor类很相似。

3) 调用Action: 产生一个新的action实例,调用业务逻辑方法。

4) 调用产生结果:匹配result class并调用产生实例。

5) 请求再次经过一系列拦截器返回:过程也可配置减少拦截器数量

6) 请求返回用户:从control返回servlet,生成Html

 

这里很明显的一点是不存在FormBean的作用域封装,直接可以从Action中取得数据。 这里有一个Strut-2配置的web.xml文件:

<filter>

<filter-name> controller </filter-name>

<filter-class> org.apache.struts.action2.dispatcher.FilterDispatcher </filter-class>

</filter>

<filter-mapping>

<filter-name> cotroller </filter-name>

<url-pattern> /* </url-pattern>

</filter-mapping>

 

注意到以往的servlet变成了filterActionServlet变成了FilterDispatcher*.do变成了/*filter 配置定义了名称(供关联)filter的类。filter mappingURI匹配成功的的请求调用该filter。默认情况下,扩展名为 ".action "。这个是在default.properties文件里的 "struts.action.extension "属性定义的。

 

default.properties是属性定义文件,通过在项目classpath路径中包含一个名为“struts.properties”的文件来 设置不同的属性值。而Struts-2的默认配置文件名为struts.xml。由于12action扩展名分别为.do.action,所以很方 便能共存。我们再来看一个Struts-2action代码:

public class MyAction {

public String execute() throws Exception {

//do the work

return "success ";

}

}

 

很明显的区别是不用再继承任何类和接口,返回的只是一个String,无参数。实际上在Struts-2中任何返回String的无参数方法都可以通过配 置来调用action。所有的参数从哪里来获得呢?答案就是Inversion of Control技术(控制反转)。笔者尽量以最通俗的方式来解释,我们先试图让这个Action获得request对象,这样可以提取页面提交的任何参 数。那么我们把request设为一个成员变量,然后需要一个对它的set方法。由于大部分的action都需要这么做,我们把这个set方法作为接口来 实现。

public interface ServletRequestAware {

public void setServletRequest(HttpServletRequest request);

}

 

public class MyAction implements ServletRequestAware {

private HttpServletRequest request;

 

public void setServletRequest(HttpServletRequest request) {

this.request = request;

}

 

public String execute() throws Exception {

// do the work directly using the request

return Action.SUCCESS;

}

}

 

那么谁来调用这个set方法呢?也就是说谁来控制这个action的行为,以往我们都是自己在适当的地方写上一句 action.setServletRequest(),也就是控制权在程序员这边。然而控制反转的思想是在哪里调用交给正在运行的容器来决定,只要利 Java反射机制来获得Method对象然后调用它的invoke方法传入参数就能做到,这样控制权就从程序员这边转移到了容器那边。程序员可以减轻很 多繁琐的工作更多的关注业务逻辑。Request可以这样注入到action中,其他任何对象也都可以。为了保证action的成员变量线程安全, Struts-2action不是单例的,每一个新的请求都会产生一个新的action实例。

 

那么有人会问,到底谁来做这个对象的注入工作呢?答案就是拦截器。拦截器又是什么东西?笔者再来尽量通俗的解释拦截器的概念。大家要理解拦截器的话,首先一定要理解GOF23种设计模式中的Proxy模式。

 

A对象要调用f(),它希望代理给B来做,那么B就要获得A对象的引用,然后在Bf()中通过A对象引用调用A对象的f()方法,最终达到Af() 调用的目的。有没有人会觉得这样很麻烦,为什么明明只要A.f()就可以完成的一定要封装到Bf()方法中去?有哪些好处呢?

 

1) 这里我们只有一个A,当我们有很多个A的时候,只需要监视B一个对象的f()方法就可以从全局上控制所有被调用的f()方法。

2) 另外,既然代理人B能获得A对象的引用,那么B可以决定在真正调A对象的f()方法之前可以做哪些前置工作,调完返回前可有做哪些后置工作。

 

讲到这里,大家看出来一点拦截器的概念了么?它拦截下一调f()方法的请求,然后统一的做处理(处理每个的方式还可以不同,解析A对象就可以辨别),处理 完毕再放行。这样像不像对流动的河水横切了一刀,对所有想通过的水分子进行搜身,然后再放行?这也就是AOPAspect of Programming面向切面编程)的思想。

 

AnywayStruts-2只是利用了AOPIoC技术来减轻action和框架的耦合关系,力图到最大程度重用action的目的。在这样的技术 促动下,Struts-2action成了一个简单被框架使用的POJOPlain Old Java Object)罢了。实事上AOPIoC的思想已经遍布新出来的每一个框架上,他们并不是多么新的技术,利用的也都是JDK早已可以最到的事情,它们代 表的是更加面向接口编程,提高重用,增加扩展性的一种思想。Struts-2只是部分的使用这两种思想来设计完成的,另外一个最近很火的框架 Spring,更大程度上代表了这两种设计思想,笔者将于下一篇来进一步探讨Spring的结构。

 

PS: 关于Struts-2笔者也没真正怎么用过,这里是看了网上一些前辈的帖子之后写下自己的学习体验,不足之处请见谅!

分享到:
评论

相关推荐

    java unix sping ajax struts hibernate 学习笔记

    Core Java 学习笔记 Tiger 学习笔记 XML 学习笔记 Oracle 学习笔记 JDBC 学习笔记 Hibernate 学习笔记 HTML&JavaScript 学习笔记 Servlet 学习笔记 JSP 学习笔记 Struts 学习笔记. Ajax 学习笔记 EJB 学习笔记 ...

    林信良java学习笔记

    林信良学习笔记(内容):ajax学习笔记,算法学习笔记,计算机图形学,C++学习笔记,设计模式,Hibernate学习笔记,Java学习笔记,JSF,JSP/Servlet,JUnit,Spring,Struts等

    java学习笔记

    java学习笔记大全:java内容介绍 java编程可以分成三个方向: 1、java se (j2se)桌面开发 java中的基础中的基础 2、java ee (j2ee)web开发 3、java me (j2me)手机开发 java se课程介绍 java面向对象编程(基础) java...

    Java相关课程系列笔记之十三Struts2学习笔记

    Java相关课程系列笔记之十三Struts2学习笔记

    struts2详细学习笔记

    这个是本人自学struts2框架时的总结笔记,里面关于struts2的基本知识很是详尽,如果想要进阶的就不要看了,这只是struts2基础的笔记,个人学习用的,绝不掺假!

    Java相关课程系列笔记之九Servlet学习笔记

    Java相关课程系列笔记之一Java学习笔记 Java相关课程系列笔记之四JDBC学习笔记 Java相关课程系列笔记之六HTML学习笔记 Java相关课程系列笔记之七CSS学习笔记 Java相关课程系列笔记之八JavaScript学习笔记 Java相关...

    struts2 学习笔记 实战

    三、 Namespace Namespace决定了action的访问路径,默认为“”,可以接收所有路径的action,如果没有找到相应的namespace时,则使用namespace为空的action ...struts2中的package与java的package是相同的作用的。

    java SSH框架架构学习_笔记.struts,spring,hibernate. IOC,AOP,JDBC,编写个留言管理系统网站

    java SSH框架架构学习_笔记.zip java SSH框架架构学习_笔记.struts,spring,hibernate. IOC,AOP,JDBC,编写个留言管理系统网站

    Struts2_学习笔记

    Struts2_学习笔记 JavaEE企业级开发,初学JSP技术有所帮助,学习java框架之一Struts2

    struts2学习笔记黑马程序员

    个人收藏,纯属备份作用,做个记录,方便需要时候查看

    Java相关课程系列笔记

    Java相关课程系列笔记之八JavaScript学习笔记(建议用WPS打开) Java相关课程系列笔记之二Oracle学习笔记(建议用WPS打开) Java相关课程系列笔记之九Servlet...Java相关课程系列笔记之一Java学习笔记(建议用WPS打开)

    struts项目学习笔记

    Struts2 是一个非常优秀的MVC框架,基于Model2 设计模型 由传统Struts1和WebWork两个经典框架发展而来 Struts2框架=Struts2+XWork Strust2 核心功能 允许POJO(Plain Old Java Objects,简单javabean对象,没有继承,...

    Java相关课程系列笔记之十三Struts2学习笔记.doc

    Java相关课程系列笔记之十三Struts2学习笔记.doc

    良葛格java学习笔记

    常見程式演算,電腦圖學入門,設計模式,C 語言,GTK,C++,Qt3,Qt4,,Java (上),Java (下),JSP/Servlet,JSF,Ajax,JUnit,Struts,Spring,Hibernate,Acegi

    struts2学习笔记

    自己整理的struts2学习笔记,对于初学struts2的很有帮助。

    Struts2 学习笔记

    01 Struts2-Action 5 一、 Struts作用: 5 二、 搭建Struts2的运行环境: 5 三、 Namespace 6 四、 标签 6 五、 Action 6 六、 路径问题的说明 8 七、 Action的动态调用方法 8 八、 Action通配符(wildcard)的配置 9 ...

    凯达Java学习笔记.rar

    Java Java JavaEE hibernate struts spring jdbc jsp oracle EJB WEBServices,凯达Java学习笔记

    Java学习笔记,spring,hibernate,struts

    超级强悍,内容包括spring,hibernate,java,jquery, struts,Validator框架,fck,...

Global site tag (gtag.js) - Google Analytics