您的位置:首页 > 编程语言 > Java开发

Struts2.x学习笔记

2014-08-11 10:39 141 查看
[align=left][/align]

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中有时可以提供getter和setter方法,便于收集数据(这样收集数据的模式一般可以成为属性驱动模式).

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

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

注意点:

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

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

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

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

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

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

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已经不单纯了,里面包含了太多的属性了以及setter和getter方法,所以有ModelDriven模式解决方案。

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

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

如何实现模型驱动模式?

* 创建User

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

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

注意点:

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

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

3.实现getModel()方法,返回Bean对象,所以要建立action和javabean(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.要生成User的setter 和getter方法

Struts2 中的Action 访问Servlet API

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

注意点:

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

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

Struts的重定向有两种:

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

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

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

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

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

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

4、全局Result和局部Result

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

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

Struts2命名空间和字符集设置

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

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

*** Struts2中Action的完整路径应该为: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的 OGNL、ValueStack

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

5.Actoin如何访问 Servlet API

6.类型转换器(StrutsTypeConverter)

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

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




内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: