Struts2的笔记整理与复习

来源:互联网 发布:apache 编译 编辑:程序博客网 时间:2024/05/19 04:06

什么是struts?
struts是一个严格遵循MVC设计模式的web层框架,说到底他就是一个大大的Servlet,即ActionServlet;
现在有两个版本,struts1.x,struts2.x,Struts2结合了webwork和struts1.0;struts2其实主要继承了webwork,
同时又继承了Struts1中的优秀部分,是两大框架的混血儿;打个比方,如果webwork是爸爸,而struts1.0是妈妈,那么Struts2
更像爸爸;

几大核心功能:

1 表单数据封装:复杂数据类型和基本数据类型;
2 输入校验:针对某个方法和针对所有方法,以及手动和基于xml文件进行校验,使用资源文件中的内容
3 文件上传,多文件上传
4 权限拦截,即拦截器,拦截器栈;
5 防止表单重复提交的使用;
6 struts2常用标签  :
7 多种视图的使用;原样输出,转发,重定向
8 类型转换:全局以及局部
9 国际化资源文件的使用

101无侵入式设计,实现其与servlet api和struts api的解耦;既不依赖与这两个api;
关于这点,我们可以定义一个action而不使用任何与servlet和struts相关的类;
仅仅是返回值是success和input等等我们自定义的视图名称

对用户的每一个请求都交给一个action,处理完成后返回一个视图去显示处理结果;这种视图映射关系可以在
struts.xml中配置;要知道tomcat服务器每次启动是根据配置文件来的,配置文件中的每个项目和属性,都对应的是一个个Java类;
和属性及方法;因此我们每次修改配置文件而不重启服务器要达到更改程序的目的是不可能;
我们看一个配置文件

 
  /index.jsp
  /WEB-INF/jsp/login.jsp
 

上面的一个配置表示的意思是;
1 我们通过在浏览器端输入地址 http://127.0.0.1:8080/Struts2Demo/test/loginexecute.action
可以访问到主页;
为什么呢?
因为通过上面地址可以访问到HelloWorldAction根据上面的操作返回的结果视图跳转;如果HelloWorldAction返回的
是success,则跳转到首页index.jsp;如果返回的是input,在跳转到login.jsp;
而且在result中可以配置type属性,如果type中没有配置则默认是dispatcher,即转发,如果配置了redirect,即重定向;

开发struts2程序至少需要的jar
struts2-core-2.x.x.jar; struts2框架的核心类库
xwork-2.x.x.jar XWork类库,Struts2在其上构建;
ognl-2.6.x.jar 对象图导航语言(Object Graph NavigationLanguage);Struts2
框架通过其读写对象的属性;
freemarker-2.3.x.jar; Struts2的UI标签的模板使用FreeMarker 来写;
commons-logging-1.1.x.jar;ASF出品的日志包,Struts2框架使用这个日志包来支持Log4j和JDK1.4+的日志记录。
commons-fileupload-1.2.1.jar 文件上传组件,2.1.6版本后必须加入此文件;
还有一些包:
对struts.xml配置文件中包的配置介绍:
一般要继承struts-default;否则有些自动拦截功能会用不了,因为struts2主要是靠这些拦截器来工作的;

Struts2中是通过加载解析struts.xml配置文件工作的;
当struts.xml文件被加载后,其中的各个标签会被描述封装成一个个的对象,即java类;
所以当我们修改配置文件是起不到什么作用的,除非重新启动服务器;
准确的说上面所说的Java类其实就是一个个都javabean,标签中的属性就是javabean的属性;
其底层的原理是:我们配置好配置文件,创建好配置文件中出现的类,或者导入相应的jar包,struts就会通过解析该配置文件(dom4j技术),
找到相应的类名,然后通过反射技术去调用它;也就是最最最底层的原理是反射技术;
配置文件相当于是图纸,而我们创建好的类或者jar包就是原材料,我们把这些东西交给了struts,由它来统一调度使用;要用到哪些,可以根据我们的配置文件来跟struts说,即通过配置文件告诉struts,struts根据图纸和原料去工作,完成用户的需求;底层都是靠的dom4j来解析xml文档,获取相应的类名,然后根据类名去相应的jar包中找,找到了就去装配,找不到就要出错;


以一个例子来说:

 
  /WEB-INF/page/hello.jsp
 

上面这个配置文件中
itcast:主要供继承使用;
namespace:命名空间,可以简化书写,优化代码!
extends:要使用struts中的核心功能必须要继承struts-default;
Action的搜索顺序:
Action配置中的各项默认值

 
  /WEB-INF/page/hello.jsp
 

如果没有为action指定的class,默认是ActionSupport.
如果没有为action指定method,默认执行action中的execute()方法。
如果没有执行那个result的name属性,默认值为success;
要实现在struts配置文件中配置请求浏览器重定向到不同的包去要使用到一个标签
来实现属性的注入;
要转发到的类名
要转发到的命名空间
比如
cn.itcast.web.struts.action.LoginAction
/itcast
param标签也可以实现对Action中的属性注入值;
  所谓重定向,也就是引导用户的浏览器该去那个地址;是给浏览器用的;
对于地址URL可以动态生成;比如;
http://127.0.0.1:8080/strutstest/RegUser.do
我们定义了一个超链接链接到上面的地址:前面的strutstest工程项目名和后面的程序地址名需要动态生成;实现前者可以用${....}即EL表达式;
而要两者都实现就可以实现struts中提供的表达式

超链接
也可以使用struts的s:url标签实现,只写action名称;
action配置项中的默认值
如果没有配置class则默认为 ActionSupport;
如果没有配置method则默认值为execute;
result项的name属性默认为success;
为action结果集注入属性的方法是配置
param项;
将struts的默认后缀配置为.do方法为:

value的值可以有多个,用,号分隔;
Struts2中的action是针对用户每个请求都创建一个action,采用的是原型设计模式,因而不存在线程安全问题;
所以我们在和spring集成的时候,使用注解技术来标识,将action实例交给Spring容器时要注意添加Scope("prototype");注解,告诉Spring容器使用原型设计模式来创建全新的对象,告别多线程安全问题;
而struts1中的action是采用单例设计模式,初始化时创建一个action,然后将该action存在缓存中,供各个请求使用;因而可能会有线程安全问题发生;

在大部分应用里,随着应用规模的增加,系统中action数量也会大量增加,导致struts.xml配置文件变得非常臃肿,为了避免struts.xml文件过于臃肿,我们可以对其进行分模块分解成多个配置文件,然后在struts.xml中包含各个模块的配置文件,以提高其可读性,可以使用include来实现这一效果;同时我觉得应该也会有注解方式支持;就算现在没有,将来也会有的;


通过这种方式我们就可以将struts2的action按模块添加在多个配置文件中;

但是出现了注解技术后,可以用注解来解释,将程序员从配置文件的洪流中解脱出来;注解技术是一个很重要的技术,要重点掌握,可以大大提高开发效率,而且使得代码非常简洁,再也不用配置一大堆的配置项;
注解工作的原理:注解只是一个标识符,给某个类或者类中的某个成员打上一个标记,但是该标记后面都有一个处理器类,就类似于我们自定义JSP标签时,后台都得定义一个标签处理器类,来处理标签;这是一个,但是他是怎么写出该注解处理器类的呢?
也是依靠反射技术来实现的,通过反射该类,判断该类中是否有注解标记,有就处理他,每个注解对应不同的注解处理器;


动态调用action;可以使用通配符;
在struts2中对form表单或者超链接的地址写法规律;
${pageContext.request.contextPath}/namespace/actionname...
即工程名+namespace+action名称,不过这个最好使用struts2提供的form标签;
使用局部类型转换器实现从请求参数到成员变量之间数据类型的转换;
比如带给浏览器的请求参数是20120521此种日期类型的转换器;
而Action中有个birthday接受Date的类型的参数;
1:则需要定义一个转换器;可以选择继承DefaultTypeConverter;
2:在需要用到转换器的局部Action类所在包下创建一个配置文件;
该配置文件需要遵循的命名规范为:简单类名-conversion.properties;
配置文件中的内容是
需要转换的变量名=转换器的完整类名称;
比如我们有个HelloWorldAction,其中有个birthday变量,需要有个转换器,实现从
Date与String的互相转换;
我们定义了一个转换器:cn.itcast.type.converter.DateTypeConverter
那么我们就在HelloWorldAction所在地包下建一个HelloWorldAction-conversion.properties;配置文件;
配置文件中的内容是
birthday=cn.itcast.type.converter.DateTypeConverter
自定义全局类型转换器的步骤:
1 定义一个转换器;
2 src目录下,发布后即WEB-INF/class/ 下新建一个配置文件,取名为xwork-conversion.properties;这是一个固定写法;
该配置文件中的内容是
需要转换成的类型复杂类名=类型转换器的复杂类名;
比如要定义一个全局日期转换器;cn.itcast.type.converter.DateTypeConverter
在src目录下新建一个配置文件。名称为xwork-conversion.properties;
其中的内容为
java.util.Date=cn.itcast.type.converter.DateTypeConverter
可以根据实际业务需求来定义是全局还是局部转换器;
改变上传文件大小限制的配置项;

文件上传程序实现步骤:
1 首先要有一个commons-io.jar包的支持;
2 提交表单要有个浏览文件项,不妨假设其名称为image;注意要在input项中加入属性:
3 在Action中定义一个文件对象,名称必须为image,即与form表单中的属性名称相同;
 如果要得到文件名称及文件类型;只需在Action中定义相关字段即可,并创建字段属性设置器与
访问器,字段属性名称必须要为:imageFileName;imageContentType;
4 将文件保存到硬盘上,如果没有这一步骤,则当actin停止时,文件也随之被摧毁;可以用到
FileUtils工具类;
特别要注意:在jsp标签或者form表单中,如果要使用文件上传,必须要加入文件上传配置项;enctype="multipart/form-data"
自定义拦截器:
首先定义好拦截器,自定义拦截条件,即什么时候拦截,其拦截原理是拦截对象是否调用invoke方法,
如果允许调用invoke方法,则允许action执行,反之亦然;
定义好拦截器后,在配置文件中配置,按如下注意事项配置;
自定义拦截器注意事项:

 
  
  
   
   
  
 
 
  /WEB-INF/page/hello.jsp
 

由于struts2中如文件上传,数据验证,封装请求参数到action等功能都是由系统默认的defaultStack中;
的拦截器实现的,所以我们定义的拦截器需要引用系统默认的defaultStack,而且最好放在我们自定义拦截器的前面
,因为放前面的先生效,我们必须要先过了系统这一关,才到我们自己定义的拦截器去拦截有问题的action;
系统定义的拦截器都在struts2核心文件中的配置文件中,里面定义许多有用的拦截器,因此我们必须要使用它;
如果希望包下面的所有action都使用自定的拦截器,可以通过
,这样就既把自定义的拦截器用上了,也用到了系统定义拦截器;
使用拦截器我们必须要知道,我们定义了什么拦截器,该拦截器能干什么,或者说是为那个action服务,及帮助该action拦截一些不合适的信息;
其次我们要把拦截器在action中定义,及哪个action中要使用哪个拦截器;
配置资源文件:在src目录下定义好资源文件,命名规则;
itcast_
以后写路径的时候要使用struts2的URL标签,可以实现动态填写URL
"againpassword==password使用struts2的自带校验器时配置文件中的校验项
中使用表达式校验"againpassword==password
在添加拦截器时,系统struts2自带的拦截器,即默认拦截器defaultStack要配置在最前面,其次才是自己的;并且防止表提交的token拦截器也要定义在其之后!

转发与重定向的关系:
而且在result中可以配置type属性,如果type中没有配置则默认是dispatcher,即转发,如果配置了redirect,即重定向;
这两者的区别有以下几点;打个比方说;
你找我借钱,我说等下,可是我没有钱,我去找第三个人借,借了然后交给你;
这是转发;
你找我借钱,我说我没钱,你去找第三个人,由第三个人给钱给你;这是重定向;
转发是一个servlet在进行的,而重定向是两个不同的servlet;
转发是在服务器内部实现的即根据用户的请求在内部找页面给浏览器使用,浏览器的地址不会改变;
而重定向是引导浏览器重新去访问服务器的某个地址;浏览器的地址会改变
总而言之:
转发是服务器行为,而重定向是浏览器行为,前者是一个request在各个jsp和servlet之间转发,对应的是同一个servlet容器,而且转发到对象也
只能是该服务器下面的页面,可以 是jsp html或者servlet;
而重定向是浏览器根据服务器的指示,去另一个服务器应用;这是另外一个servlet,
跟前面的没有什么关系;
同时转发在servlet中是用的request的forward方法(严格的说应该不是,是dispatcher的)而重定向是用到response的sendRedirect方法
同时重定向有访问局限,即不能访问WEB-INF下面的应用;
当给浏览器的参数中出现非常规字符时,比如中文,需要重新进行编码

 


Struts2的笔记整理与复习转发至微博
 
Struts2的笔记整理与复习转发至微博
阅读(15)|评论(0)
|
       
Struts2的笔记整理与复习

用微信  “扫一扫”

将文章分享到朋友圈。

 
Struts2的笔记整理与复习

用易信  “扫一扫”

将文章分享到朋友圈。

 
喜欢推荐 0  转载
 

历史上的今天

最近读者

热度

在LOFTER的更多文章

关闭
玩LOFTER,免费冲印20张照片,人人有奖!     我要抢>

评论

--------android培训java培训期待与您交流------

\r\n

什么是struts?
struts是一个严格遵循MVC设计模式的web层框架,说到底他就是一个大大的Servlet,即ActionServlet;
现在有两个版本,struts1.x,struts2.x,Struts2结合了webwork和struts1.0;struts2其实主要继承了webwork,
同时又继承了Struts1中的优秀部分,是两大框架的混血儿;打个比方,如果webwork是爸爸,而struts1.0是妈妈,那么Struts2
更像爸爸;

\r\n

几大核心功能:

\r\n

1 表单数据封装:复杂数据类型和基本数据类型;
2 输入校验:针对某个方法和针对所有方法,以及手动和基于xml文件进行校验,使用资源文件中的内容

', blogTag:'', blogUrl:'blog/static/21727620920134281223630',isPublished:1, istop:false, type:0, modifyTime:1400160348505,publishTime:1367497201681,permalink:'blog/static/21727620920134281223630', commentCount:0,mainCommentCount:0, recommendCount:0, bsrk:-100, publisherId:0,recomBlogHome:false, currentRecomBlog:false, attachmentsFileIds:[],vote:{}, groupInfo:{}, friendstatus:'none',followstatus:'unFollow', pubSucc:'', visitorProvince:'',visitorCity:'', visitorNewUser:false, postAddInfo:{}, mset:'000',mcon:'', srk:-100, remindgoodnightblog:false, isBlackVisitor:false,isShowYodaoAd:false,hostIntro:'JAVA软件工程师,有扎实的Java基础,熟悉JavaEE技术,对框架的底层原理熟悉,学习能力强。',hmcon:'0', selfRecomBlogCount:'0', lofter_single:'' }
{if x.visitorName==visitor.userName} ${x.visitorNickname|escape} {else} ${x.visitorNickname|escape} {/if}
{if x.moveFrom=='wap'}   {elseifx.moveFrom=='iphone'}   {elseifx.moveFrom=='android'}   {elseifx.moveFrom=='mobile'}   {/if} ${fn(x.visitorNickname,8)|escape}
{/if} {/list}
${a.selfIntro|escape}{ifgreat260}${suplement}{/if}
 
{/if}
0 0