struts2.X心得3--struts2入门知识2
来源:互联网 发布:python split函数 编辑:程序博客网 时间:2024/06/12 21:14
1. MVC与servlet
Servlet的优点
是mvc的基础,其他的框架比如struts1,struts2,webwork都是从servlet基础上发展过来的。所以掌握servlet是掌握mvc的关键。Servlet把最底层的api暴漏给程序员,使程序员更能清楚的了解mvc的各个特点。程序员可以对servlet进行封装。Struts2就是从servlet中封装以后得到的结果。
Servlet的缺点
每写一个servlet在web.xml中都要做相应的配置。如果有多很servlet,会导致web.xml内容过于繁多。这样的结构不利于分组开发。在servlet中,doGet方法和doPost方法有HttpServletRequest和HttpServletResponse参数。这两个参数与容器相关,如果想在servlet中作单元测试,则必须初始化这两个参数。如果一个servlet中有很多个方法,则必须采用传递参数的形式,分解到每一个方法中。
2 重构servlet
针对servlet以上的特点,我们可以对servlet进行重构,使其开发起来更简单。更容易,更适合团队协作。
重构的目标:
1)、 只写一个serlvet或者过滤器,我们这里选择过滤器。
2)、 不用再写任何的servlet,这样在web.xml中写的代码就很少了。
3)、 原来需要写serlvet,现在改写action。
4)、 在action中把HttpServletRequest参数和HttpServletResponse参数传递过去。
5)、 在过滤器中通过java的反射机制调用action。
3 Struts2介绍
1)、 struts2是apache组织发明的开源框架。是struts的第二代产品。
2)、 struts2是在struts和webwork基础上整合的全新的框架。
3)、 struts2的配置文件组织更合理,是企业开发很好的选择。
4)、 struts2的拦截器为mvc框架注入了全新的概念。
4.过滤器与拦截器的区别:
*相同点:都是起拦截作用
*不同点:
*作用范围:
过滤器:使用范围是J2EE范畴,任何一个web工程都可以使用过滤器;
拦截器:使用范围是struts2范畴,离不开struts2框架的
*完成的功能:
过滤器:拦截请求资源;拦截器:完成其他所有功能
*执行顺序:
过滤器——>拦截器
5.加载struts.xml过程
说明:
1)、 在启动的时候加载了三个配置文件
struts-default.xml、struts-plugin.xml、struts.xml
2)、 如果这三个文件有相同的项,后面覆盖前面的。
3)、 struts.xml文件必须放在src下才能找到
6.在struts.xml中引入其他配置文件
<includefile="csdn/action/include/struts-include.xml">
</include>
这样在加载struts.xml文件的时候,struts-include.xml文件也能被加载进来。
7.Action中result的各种转发类型
result配置类似于struts1中的forward,但struts2中提供了多种结果类型,常用的类型有: dispatcher(默认值)、redirect 、 redirectAction 、plainText。
1)、 每个action方法都返回一个String类型的值,struts一次请求返回什么值是由这个值确定的。
2)、 在配置文件中,每一个action元素的配置都必须有result元素,每一个result对应一个action的返回值。
3)、 Result有两个属性:
name:结果的名字,和action中的返回值一样,默认值为success;
type:响应结果类型,默认值为dispatcher.
4)、可以看出result及结果集总共10种类型;默认类型为ServletDispatcherResult即转发;结果类型可以是这10种结果类型的任意一种。
A、Dispatcher在配置文件中,可以有两种写法:
第一种写法:
<resultname="success">/resulttype/successDispatcher.jsp</result>
第二种写法:
<resultname="success">
<paramname="location">/resulttype/successDispatcher.jsp</param>
</result>
B、Redirect属于重定向。如果用redirect类型,则在reuqest作用域的值不能传递到前台.
C、redirectAction类型
(1)、说明
把结果类型重新定向到action
可以接受两种参数
a) actionName: action的名字
b) namespace:命名空间
(2)、 例子
第一种方式:
<result name="success" type="redirectAction">resulttype/redirectactionAction.action</result>
第二种方式:
<result name="success" type="redirectAction">
<!--
actionName:
请求的action的路径
namespace:
如果不写,默认就是请求的action的路径,如果写,路径将被重新赋值
-->
<param name="actionName">
resulttype/redirectactionAction.action
</param>
</result>
下面是redirectAction 结果类型的例子,如果重定向的action
中同一个包下:
<resulttype="redirectAction">helloworld</result>
如果重定向的action在别的命名空间下:
<resulttype="redirectAction">
<paramname="actionName">helloworld</param>
<param name="namespace">/test</param>
</result>
plaintext:显示原始文件内容,例如:当我们需要原样显示jsp文件源代码的时候,我们可以使用此类型。
<resultname="source" type="plainText ">
<paramname="location">/xxx.jsp</param>
<paramname="charSet">UTF-8</param><!-- 指定读取文件的编码 -->
</result>
在result中还可以使用${属性名}表达式访问action中的属性,表达式里的属性名对应action中的属性。如下:
<resulttype="redirect">view.jsp?id=${id}</result>
8.多个Action共享一个视图--全局result配置
当多个action中都使用到了相同视图,这时我们应该把result定义为全局视图。struts1中提供了全局forward,struts2中也提供了相似功能:
<package....>
<global-results>
<result name="message">/message.jsp</result>
</global-results>
</package>
9.为Action的属性注入值
Struts2为Action中的属性提供了依赖注入功能,在struts2的配置文件中,我们可以很方便地为Action中的属性注入值。注意:属性必须提供setter方法。
publicclass HelloWorldAction{
private String savePath;
public String getSavePath() {
return savePath;
}
public void setSavePath(String savePath) {
this.savePath = savePath;
}
......
}
<packagename="csdn" namespace="/test"extends="struts-default">
<action name="helloworld"class="cn.csdn.action.HelloWorldAction" >
<param name="savePath">/images</param>
<resultname="success">/WEB-INF/page/hello.jsp</result>
</action>
</package>
上面通过<param>节点为action的savePath属性注入“/images”
依赖注入:控制反转IOC 就是本身不负责依赖对象的创建和维护,依赖对象的创建及维护是由外部容器负责的。控制的方向就转移到了外部容器,控制权的转移就是所谓的反转。在运行期间由外部容器动态将依赖对象注入到组件中。
很多的注入方式:比如set方法注入
10、Action原型模式
1)、 回顾servlet
在servlet中,一个servlet只有一个对象,也就是说servlet是单例模式single。如果把一个集合写在servlet属性中,则要考虑线程安全的问题。
2)、 Action多例模式
但是在struts2的框架中,并不存在这种情况,也就是说struts2中的action,只要访问一次就要实例化一个对象。这样就不存在线程安全的问题。这也是struts2框架的一个好
- struts2.X心得3--struts2入门知识2
- struts2.X心得1--struts2入门知识
- struts2.X心得5--struts2入门知识3--动态方法、通配符、常量
- struts2.X心得10--struts2验证
- struts2.X心得11--struts2中的国际化
- struts2.x入门实例
- struts2入门知识总结1
- struts2.X心得13--OGNL表达式语言2
- struts2.X心得2--第一个struts2案例分析以及整合c3p0连接数据库案例分析
- Struts2知识总结3
- Struts2知识总结2
- struts2入门知识3--动态方法、通配符、常量
- struts2知识
- struts2知识
- struts2.2.x入门应用(一)
- struts2入门(3)
- struts2入门3
- struts2入门(2)
- 解决 Ubuntu 下风扇一直高速旋转的方法
- linux内核映像uImage与zImage的区别
- Linux下,不能以根用户身份运行google chrome 浏览器的解决办法
- linux2.6.35zImage生成流程简介
- Struts2请求处理流程及源码分析
- struts2.X心得3--struts2入门知识2
- 一些IT名词
- Java--Java运行机制
- C#中的三种循环:while、do..while..、for循环
- pthread_cond_wait()的实现原理
- chapter 2.2: Kernel Object 和 Data Structures
- Fragment资料
- PHP静态代码扫描工具PHPCheckStyle果真如此不靠谱吗?
- javascript基础加强