struts2学习心得

本文介绍了作者在学习Struts2框架过程中的心得,强调了框架在典型三层结构中的作用,特别是表示层的解决方案。内容涵盖了struts2.xml配置、拦截器、OGNL表达式、ActionContext、valueStack和stackContext的区别与联系,以及它们在处理HTTP请求中的角色。通过对Struts2与Servlet的比较,揭示了Struts2如何简化和优化Web开发。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  在开始拿起书本学习struts2之前,对struts2理论掌握不是很全面,只在实践中做过一些struts2的项目,以及在进入新公司前辈带领下,又是一种struts编程风格(很实用,高效),又学到了很多!在将近半个月的struts2学习中,我先学习了轻量级Javaee企业应用实战(第四版)

  通过这次的学习,对以前我做过的相关struts2项目和现在公司项目有了一个清楚的把握,知道为什么这么做,这样做的理由,和这样做的好处,把来龙去脉都掳了一遍!轻量级那本书说的很繁琐,知识点很多,但是又没完全深入,刚好技术内幕这本书填补了它的那个空缺!struts2框架在典型的三层结构的开发模式中被视为表示层得解决方案,最为核心的内容就是和web容器打交道,帮助我们处理http请求!

  在轻量级这本书中,前辈教我的那些规范,这本书里面都有提及到,都有详细的解释和例子,有些地方会说明这样做的缘由。在web.xmlstruts2过滤器的配置和在struts2.xml文件中的action配置,拦截器的设置,以及逻辑视图名和物理资源之间的映射,还有关于action充当业务控制器,strutsPrepareAndExecuteFilter充当核心控制器等的原理都熟悉了一下。jspOGNL表达式的使用(当然也可以访问静态成员)。redirectredirectAction都是重新生成请求,请求参数和请求属性和前一个action的处理结果都会丢失。书中也扩展了一些其他重要知识,比如在标签内指定var属性(相当于id),在拼接集合时很有效,只需用OGNL表达式进行输出,同时value取值时在前面加#。当指定var属性,那么意味着标签内的集合或者javabean等都会放到stackContext,如果不在标签内,也可以通过var属性来访问该javabean或集合。struts2使用标准的context来进行OGNL表达式的语言求值,OGNL的顶级对象是stackContext(map类型-数据结构),其根对象就是valueStack(当系统创建action实例后,该Action实例已经保存到valueStack中),不过在标签的标签体内,位于valueStack临时生成的集合在标签结束时是会移出valueStack。说到这里,不得不提及最常用的property标签,它属性value值不指定的时候,默认输出valueStack栈顶的值,其实很多标签都是这样,默认输出valueStack栈顶值。struts2标签,其实还蛮强大的,非常丰富,拼接、迭代、排序、控制、数据等。但不得不提的是,对于表单标签而言,namevalue属性之间存在一个特殊的关系,因为每个表单元素会映射成action属性,所以如果某个表单对应的Action已经被实例化(该表单提交过)、且其属性有值时,则该Action对应表单里的表单元素会显示出该属性的值,这个值将是表单的value值;name属性设置表单元素的名字,表单元素的名字实际上封装着一个请求参数,而请求参数是被封装到Action属性的。

  通过以前项目(用的servlet)和现在的公司项目(用action,引发我对这两者的深入思考,最后发现struts2servlet的关系:在struts2中,可以通过ServletActionContext.getRequest()获取request对象,在action的方法中return一个字符串也就是逻辑视图名,该字符串对应struts2.xml中的result标签的nameresult标签中包含的就是跳转页面,其中实现原理在我刚开始也是朦胧的,因为前面用的servlet,现在突然用的是action,还这么简捷,高效的运行起来。在写项目的时候,我就有发现根本使用不来servlet,原因是页面的请求都被struts2给拦截了,根本访问不了servlet!其原理经过查阅资料后得知:struts2servlet进行了封装,并结合filter配合使用。其原理步骤如下:

一、客户端提起一个(HttpServletRequest)请求,像在浏览器中输入的

url

二、请求被提交到mvc模型的过滤器filter中,如ActionContextCleanUp

StrutsPrepareAndExecuteFilter

三、StrutsPrepareAndExecuteFilter是控制器的核心,将它初始化并启用核心doFilter;

四、StrutsPrepareAndExecuteFilter询问ActionMapper(判断它是否为空)是否需要调用某个Action来处理这个(requestresponse)请求,最终会去访问valueStack并取值!如果ActionMapper需要调用某个ActionStrutsPrepareAndExecuteFilter把请求的处理交给ActionProxy;

五、ActionProxy通过询问框架的配置文件struts2.xml,找到需要调用的Action;

六、ActionProxy创建一个ActionInvocation的实例,ActionInvocation会根据配置文件加载Action相关的Interceptor(拦截器),然后ActionInvocation通过代理模式调用Action

总体上来说,比直接使用servlet方便很多,最起码的一点就是维护起来挺好的。

  在了解了valueStackActionContextstackContext之后,又有疑惑,他们之间的具体联系,以及是怎么表现的,于是我又查阅了下,其定义如下:

1valueStack:里面存放的是Action类中通过set方法设置的属性值(表单传

过来的值等),由OGNL框架实现;

2stackContext:也是用来存值的,stack上下文,它包含一些列对象,包括request/session/attr/applicationmap等;

3actionContext:action的上下文,可以得到requestsessionapplication等。

这三者在jsp中被访问时也是有所不同的,我们在jsp页面中访问valueStack的内容时,是不用加#,如果访问stackcontext的其他对象则要加上#。对于ActionContext,它在一个线程(执行http请求)只有一个,生命周期是一次请求,作用在一次HTTP请求范围内!这跟valueStack是一样的!只不过valueStack是值栈,而actionContextMap类型-映射结构。需要注意是,只有运行在request线程中的代码才能调ActionContext.getContext(),否则返回的是null

  以前对这些框架只知道用,但不知道为啥要用。不同的框架有不同的特点,有各自领域的优势,想起上家公司的框架,我这才猛然觉醒,他们那些框架为啥要那样搭载。我对struts2技术内幕书本有句话印象很深刻,那就是:框架是一组程序的集合,包含了一系列的最佳实践,作用是解决某个领域的问题,不同的框架,只是为了解决不同领域的问题。





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值