admin 管理员组文章数量: 887053
2023年12月23日发(作者:css网页教程)
Struts2基础描述
Struts2变化
MVC框架最主要的两个功能是页面对象参数与Action Model的转换 与 页面流转控制,我们考察框架时也多从这两点入手。
Struts2模式上的变动:
一、Action 从singleton bean 改为了per request的prototype bean。之前Struts1为了线程安全,action里面没有任何成员变量,在一个处理函数里输入输出都靠request,response参数搞定。
二、将很多处理透明的分解到了Interceptor Chain中,
因此,Struts2中Action在MVC里的位置,从Controller转为了Model(有属性、有行为且不依赖Request/Response的POJO),而Controller的角色则由Struts2亲自担当。
Struts2实际上的简化:
1.输入输出:
FormBean与Action合一,直接读写成员变量,不再需要FormBean或LazyBean,不再需要从request读写数据,每个函数不再需要长长的Request/Response参数。
实用的Prepareable接口和ModelDriven接口,比在在update时先从数据库载入拥有10个属性的对象,然后从页面绑定其中5个属性,整个过程很完美。
2.配置文件:
Zero-Config与Code-Bind,基于约定与annotation实现零配置文件。
支持配置的继承与扩展, 可以预设通用的配置。
零配置文件
Zero Config能根据中配置的actionPackages自动扫描所有Action类,并猜测其NameSpace.
再利用CodeBehind猜测Result指向的jsp,实现了的零配置(其实也不是完全没有,而是指的内容不会随action的增加而膨胀)
如果有特殊的结果指向(如redirect类型的结果),在Action处用@Result配置。
如有package级的配置(如使用非默认的Interceptor栈),仍在中定义package,用@ParentPackage指定。
不过,目前ZeroConfig的Annotation较少,只有@Result、@ParentPackage,@NameSpace(java的package名不符合约定规则时使用),还有exception-Mapping之类的配置没有包含。
nfig
在 中设置ActionPackages ,则 Struts2会自动扫描这些Package下的Class,Class名含Action或扩展子ActionSupport的类都将被载入。
其中actionPackages的设置很有学问,比如 , 则tion,访问路径就会被自动的猜测为 /user/
如果package名不符合这个规则,就需要自行设定NameSpace了,可以用Namespace annotation。又或者用ParentPackage annotation指定package,再在中定义package的namespace.
在Action类中,用Annotation 对特殊的RELOAD返回值进行了注释,其余的results就交给code-behind去猜了。
@Results({
@Result(name=, value="/role",
type=)
})
public class RoleAction
hind
指定JSP的默认目录在/WEB-INF/jsp 下,原因就是希望保护jsp不能被直接打开,安全模块只要保护Action的地址即可
1. 可以用 /user/的URL 打开 /WEB-INF/jsp/user/ ,而LoginAction无需实际编写。
2. 对于UserAction返回return SUCCESS,默认访问/WEB-INF/jsp/user/
或 . 返回 "input" ,默认访问/WEB-INF/jsp/user/
参数绑定-- ModelDriven, Prepareable
无论是将Action中的变量渲染页面中,或者从request中将内容回传到Action中变量的过程,统称参数绑定。
1. 最原始的Struts2会直接赋值Action中的变量。 如?id=1,会将action中的id属性赋值。
2. 如果参数较多,而且都属于同一个对象的,可以将所有属性都放入一个对象中,比如? 会为action中的User对象的id属性赋值。
3. ModelDriven接口,如果不想写太多"user."前缀,如${},可以实现ModelDriven接口的getModel函数,返回user对象。则Struts2碰到{id}时,就会尝试调用getModel() 获得user对象再获取其id属性。
4. Prepareable接口,还有一种情况Hibernate常用的情况,一个对象可能有很多属性(比如有10个属性),但页面上可能只显示5个属性的输入框。如果按上面的方法,先new一个User类,然后从页面上赋值。保存此对象时就会将不在页面上修改的5个属性清空了。这时就需要两次的binding,一开始user变量为空,只绑定了action的id属性,然后在prepare()函数中查出有完整10个属性的对象,然后二次绑定时再将页面的那5个属性复制到user对象中。
prepare()函数有两种作用,一种专门为了二次binding,一种是作为公共的数据准备函数。但是,一个action内有多个method,不是每一个method都需要执行prepare,比如list()方法,如果这种method较多,或者会造成冲突时,还有另外一种方式来定义二次binding函数。比如prepareSave() 函数,就会默认的在执行save()前执行,此时,专门实现prePareMethodName() 方法再调度一个内部的prepare函数,而将prepare()函数留空。
Theme设定
虽然没有用多少Struts2的taglib,但Struts2的Theme设计还是不错的,在
1.在classpath的/template目录中新增自己的theme目录,如/template/mytheme,从struts2的默认simple theme中复制出进行修改。
2.在jsp中使用新的theme
如果需要默认都使用新的theme:
1.在classpath:/template/mytheme 中放置ties,里面放一句parent = xhtml,即所有未重新实现的ftl,都使用xhtml默认的模板。
2.修改,增加 "mytheme" /> 没有使用的功能 页面显示用的UItaglib基本没有用,关于Dojo的taglib封装更加是废的。 也没有用它的validate功能,直接用JQuery的validate就算,如果需要服务端校验,在服务层完成。
版权声明:本文标题:struts2 依赖注入 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.freenas.com.cn/free/1703307424h446288.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论