Struts2.x学习笔记



Struts2.x学习笔记

Struts2.x开发步骤:

1.添加struts2 开发需要的jar 

2.配置 web.xml和 struts.xml

3.编写具体 action

需要注意:Struts2需要运行在JRE1.5 及以上版本(用到了大量泛型和反射)

 

添加Struts2.x开发需要的jar 

  * struts2-core-2.3.16.jar  struts核心包 当然需要咯

  * xwork-core-2.3.16.jar    struts2.x的本质就是使用了xwork的核心包

  * ognl-3.0.6.jar           struts2.x的新特征是加强版的JSTL

  * commons-fileupload-1.3.jar  文件上传下载包

  * commons-io-2.2.jar          有文件上传和下载一定需要io

  * commons-logging-1.1.3.jar    做日志所需要的包

  * freemarker-2.3.19.jar  

最简单的办法就是直接在Struts blank项目中copy lib包下的jar包 

 

Struts2.x里面最最重要的两个配置文件是web.xml struts.xml

web.xml如下:   

就是在web.xml中添加一个StrutsPrepareAndExecuteFilter过滤器配置

 <!-- 配置Struts2 的最重要的 中央控制器  其实是一个过滤器 -->  

  <filter>

<filter-name>struts2</filter-name>

<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExe          cuteFilter

</filter-class>

  </filter>

          <filter-mapping>

  <filter-name>struts2</filter-name>

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

  </filter-mapping>

 

注释:千万不要忘记配置这个文件

 

struts.xml如下:

<package name="struts2" extends="struts-default" >

<action name="Login" class="com.xuyi.action.Login">

<result name="success">/login_success.jsp</result>

<result name="error">/login_error.jsp</result>

</action>

</package>

注释:通常要继承struts-default, struts.xml 放在src目录下。

 

Action中有时可以提供gettersetter方法,便于收集数据(这样收集数据的模式一般可以成为属性驱动模式).

 

我们自己定义的action类最好继承ActionSupport,因为ActionSupport里面已经帮我们实现和定义好了很多方法了,开发中一般都需要继承这个类。

好好分析里面的几个类的源码

注意点:

1.struts2的配置文件放在src目录下

2.创建自己的Action可以是简单POJO(纯粹的java),也可以是实现ActionSupport类或实现Action接口

3.Action中可以提供settergetter方法,便于收集数据(这样收集数据的模式一般可以成为属性驱动模式).

4.Action要配置到struts.xml中才能起作用

5.去了解struts-default.xml配置文件,default.propertiesStruts2的默认后缀为.action

6.String execut()方法的返回值可以是默认配置中的一些参数(successerrorinput),也可以是任意的一个字符串,推荐使用默认参数,统一标准而已。

 

struts.xml配置文件

1.<result>标签的name属性,如果不配置的就默认是 success

2.struts2提供了一个Action接口,在Action接口中定义了一些常量 和 execute方法,我们可以使用该接口,这样的开发更规范

3.struts2的常用配置参数(开发中可能会使用,生产环境下不推荐使用)

      *struts.configuration.xml.reload   

--struts.xml配置文件发生修改,会立刻加载,在生产环境下最好 不要配置    

  *struts.devMode

          --会提供更加友好的提示信息(即开发出错时报的 404的等错误更好看)

 

以上配置参数配置方式有两种:

            *struts.properties文件中配置

         *struts.xml配置文件中配置(推荐使用)

推荐使用xml配置文件方式,web开发的主流生力军。

 

Struts2对团队开发的支持(多配置文件,方便维护和提高开发效率)

1、可以为某个模块建立单独的配置文件,该配置文件的格式需要和struts.xml配置文件的格式一致

2、在struts.xml配置文件中采用<include>标签引入

<!-- Struts2对团队开发的支持   多配置文件的支持 -->

<!-- 采用include引入外部配置文件 -->

<include file="login.xml"/>

注意点:login.xml的配置文件最好是从struts.xml copy过来,以防格式不准确

 

是不是觉得action已经不单纯了,里面包含了太多的属性了以及settergetter方法,所以有ModelDriven模式解决方案。

Struts2ModelDriven模式的支持(实际开发中用的并不多)

Struts2可以采用类似于Struts1中的ActionForm方式收集数据,这样方式叫ModelDriven模式

如何实现模型驱动模式?

创建User

* Action需要实现ModelDriven<T>接口  最好把T的泛型传进入

实现getModel()方法,返回Bean对象

注意点:

1.单独创建一个User类来接收,用户登入表单提交的数据

2.action需要是实现ModelDriven<T>接口,就是把刚才的 User类传入泛型

3.实现getModel()方法,返回Bean对象,所以要建立actionjavabean(User)类的关联

使用ModelDriven这是第一种解决方案。

 

直接对Action中的对象赋值   据说这种方法在开发中用的比较多,但是我个人目前并不是很喜欢。

主要修改要发生在提交表单了:

<form action="login.action">

用户:<input type="text" name="user.username"><br>

密码:<input type="password" name="user.password"><br>

<input type="submit" value="登录">

</form>

注意点:

1.还是要建立一个User

2.还是要建立action 和 User的关系,但是此时不要要new User()

3.要生成Usersetter getter方法

 

Struts2 中的Action 访问Servlet API

方式一:使用ActionContext  无侵入式的访问   (可以推荐使用)

注意点:

1、可以通过ActionContext访问Servlet API,此种方式没有侵入性

 

2、在Struts2中默认为转发,也就是<result>标签中的type="dispatcher"type的属性可以修改为重定向

    Struts的重定向有两种:

 type="redirect",可以重定向到任何一个web资源,如:jspAction

                   如果要重定向到Action,需要写上后缀:xxxx.action  

 type="redirectAction",可以重定向到Action,不需要写后缀,此种方式更通用些

                           不会因为后缀的改变影响配置                            

3、关于Struts2type类型,也就是Result类型,他们都实现了共同的接口Result,都实现了execute方法

   他们体现了策略模式,具体Result类型参见:struts-default.xml文件:  

4、全局Result和局部Result

方式二:通过实现装配接口,完成对Servlet API的接口      (不推荐使用,太麻烦了)实现ServletxxxAware

 

方式三:通过ServletActionContext提供的静态方法来获得 Servlet API  (推荐使用)

   

Struts2命名空间和字符集设置     

采用命名空间,可以区分不同的包下相同的Action名称

如果packagenamespace属性没有指定,使用的默认命名空间为“/

*** Struts2Action的完整路径应该为:namespace+Action的名称

 

关于Struts2的字符集问题,主要有三种配置方式:

* struts.properties配置文件中

struts.i18n.encoding

* struts.xml配置文件                   最为推荐使用

<constant name="struts.i18n.encoding" value="GB18030"/>

StrutsPrepareAndExecuteFilter中配置    

命名空间namespace  :主要是为了区分不同包下相同action名称

******发现要点:form提交表单的action 要和struts.xml 里面的配置action名字相同,而不需要和 action类名相同(我以前一直理解错误了)但是有时候需要添加命名空间这点要特别注意。

 

Action中多个方法如何条用,即(方法的动态调用)

action的具体的调用方式:

*方法的动态调用

*<action>中配置method属性(推荐使用)

*使用通配符(推荐使用,可以减少配置量)  {1}*

 

类型转换器:(实际开发中我们自己写转换器的机会比较少)

如何实现Struts2类型转换器?

*继承StrutsTypeConverter

*覆盖converFormString 和 convertToString

 

注册类型转换器

局部类型转换器,局部类型转换器只对当前Action起作用,需要提供如下配置文件:配置文件myActionName-conversion.properties

全局类型转换器,全局类型转换器可以是所有的Action起作用(同Struts1的类型转换器),配置文件:xwork--conversion.properties  

如果全局类型转换器和局部类型转换器同时存在,局部优先

 

Struts2.x的拦截器:(Struts2.x的核心,非常重要)

1.Struts2的拦截器只能拦截Action,拦截器是AOP的一种思路,可以使我们的系统架构更松散(耦合度低),可以插拔,容易互换,代码不改变的情况下很容易满足客户需求,其实体现了OCP

 

2.如何实现拦截器?(整个拦截器体现了责任链模式,Filter也体现了责任链模式)

继承AbstractInterceptor(体现了缺省适配器模式)

实现Interceptor

 

3、如果自定了拦截器,缺省拦截器会失效,必须显示引用Struts2默认的拦截 

 

4、拦截器栈,多个拦截器的总和

 

5、定义缺省拦截器<default-interceptor-ref>,所有的Action都会使用

 

6、拦截器的执行原理,在ActionInvocation中有一个成员变量Iterator,这个Iterator中保存了所有的拦截器,每次都会取得Iterator进行next,如果找到了拦截器就会执行,否则就执行Action,都执行完了

   拦截器出栈(其实出栈就是拦截器的intercept方法弹出栈)

 

Struts2.x标签属性:

 

Struts2.x OGNL:这也是Struts2的精髓(值栈)

OGNL学习笔记

OGNL介绍:

1.OGNL(Object Graph Nvigation Language),对象图导航语言

2.OgnlContext(ognl上下文对象),存在唯一的叫根的的对象root,可以通过程序设定上下文当中哪个对象作为根对象

3.在OGNL中,如果表达式没有使用#号,那么OGNL会从根对象中寻找该属性对应的get方法,如果寻找的不是根对象中的属性,那么则需要以#号开头,告诉OGNL,去寻找你所指定对象的属性

 

OGNL使用:

1.当使用OGNL调用静态方法的时候,需要按照如下的语法编写表达式:

 @package.classname@methodname(parmeter)

2.对OGNL来说,数组和集合是一样来看待的,都是通过下标索引去访问的。构造集合的时候使用{. . .}形式

3.使用OGNL处理Map的语法格式如下所示:

#{key1:value1,key2:value2,key3:value3}有点像json

4.过滤(filtering)collection.{? expression}

5.过滤(filtering):获得第一个元素collection {^expression}

6.过滤(filtering):获得最后一个元素collection {$expression}

7.通常在使用过滤操作的时候,我们会使用到#this,该表达式用于代表当前正在迭代的集合中的对象(类似增强的for循环)

8.投影(projection)collection.{expression}

9.过滤与投影之间的差别:类比于数据库中表,过滤是取行操作(选择),投影是取列操作

10.Struts2.x中有一个称作值栈的概念(ValueStack)非常重要。

11.在Struts2.x中根对象就是ValueStack.Struts2.x的任何流程中ValueStack中最顶层对象一定是Action对象

12.几个常用的命名对象

  parameters, #parameters.username

  request, #request.username

  session, #session.username

  application,#application.username

  attr,#attr.username

13.Struts2.x标签库属性值的%#的关系

文件上传:(文件上传比较简单)

 

Struts2.x对国际化支持:(实际项目中没有那么多项目要国际化吧)

 

 

 

Strut2.x的核心重难点

1.理解Struts2.x的运行流程图和原理(流程图的截图----王勇老师这方面讲的比较好)

*拦截器、代理、核心StrutsPrepareAndExecuteFilter

2.struts.xml 和 web.xml配置文件的配置

3.表单数据是如何传值给Action的 OGNLValueStack

4.struts-default.xml default.properties配置文件

5.Actoin如何访问 Servlet API

6.类型转换器(StrutsTypeConverter)

7.拦截器(Intercepter) Struts2.x的核心重点

8.OGNL对象导航图语言(其实我们实际开发用的并不多,但是可以帮助我们深刻理解struts原理----张龙老师这部分讲的非常好)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 


 

 

 

 

 

 

 

 

 

 

 

 

 


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值