Struts 2的基本使用-------学习笔记

3.1 MVC思想概述
3.2 Struts2的下载与安装
3.3 Struts2的流程
3.4 Struts2的常规配置
3.5 实现Action
3.6 配置Action
3.7 配置处理结果
3.8 配置Struts2的异常处理
3.9 Convention插件预“约定”支持
3.10使用Struts2的国际化
3.11 使用Struts2的标签库




Struts2由Struts1和WebWork两个经典MVC框架发展起来,提供更强大更易用的输入校验功能,整合的Ajax支持

3.1 MVC思想概述

传统的JavaWeb应用经历了Model1和Model2两个时代。

Model1:整个Web应用几乎全部由JSP页面组成,只用少量的JavaBean来处理数据路连接数据库访问等操作。JSP身兼View和Controller两种角色。

Model2:已是基于MVC架构的设计模式。Servlet作为前端控制器,负责接受客服端的请求,在Servlet中只包含控制逻辑和简单的前端处理;然后调用JavaBean来完成实际的逻辑处理;最后转发到相应的JSP页面处理显示逻辑。


MVC思想及其优势
MVC并不是Java语言特有的设计思想,也不是Web应用所特有的思想,他是所有面向对象程序设计语言都应遵循的规范。

MVC思想讲一个应用分成三个基本部分:三个部分以最少的耦合系统工作,从而提高应用的可扩展性和可维护性。

MVC思想预观察者设计模式有一定的相似之处,但并不完全相同。观察者模式中有两个角色,观察者(相当于View)与被观察者(Model)是对等的身份。


3.2 Struts2的下载与安装

*Struts2的lib文件夹下的库文件:
commons-fileupload.jar:与文件上传有关
commons-io.jar:与配置文件的读取有关
freemaker.jar:视图freemaker视图所需
javasisit.ga.jar:是一个动态编辑、生成字节码的类库(类似于CGLIB,不过性能会更好,他不包括在struts2提供的lib包中,要去别的网站下载。
OGNL.jar:用于支持OGNL表达式
struts2-core.jar:Struts2的核心文件1------------Struts框架
xwork-core.jar:Struts2的核心文件2-------------XWork框架
以上几个库是开发Struts的必须类库…………………………….


*导入开发包,配置完web.xml文件,则表明该Web应用已支持Struts2的支持。


3.3 Struts2的流程

Struts2应用的开发步骤

1、 导入所需的包,在web.xml中定义核心filter来拦截用户所有的请求
2、 如果是post请求,则定义包含表单数据的JSP页面,如果仅仅是get方式,则无需这一步。
3、 定义处理用户请求的Action类
问题:
Action并未接收到用户的请求,他怎么知道处理用户请求呢?
通常用户请求后,核心servlet或filter会对用户请求进行简单的预处理,如解析、封装参数等,然后通过反射来创建Action实例,并调用指定Action的execute方法来处理用户请求。

有两种解决方案指明用户请求对应的Action:
一:是利用配置文件
二:是利用约定(需提供Convention插件)

4、在struts.xml文件中中配置Action,包括设置常量、建立包等
5、配置处理结果和物理视图资源之间的对应关系。
6、编写视图资源,如果Action需要把一些数据传给视图资源,则可以借助OGNL表达式(与JSP2 EL功能类似)。


3.4 Struts2的常规配置

虽然Struts2提供了Convention插件来管理Action、结果映射,但大多用户还是使用xml文件。
1、常量
struts.properties文件是一个标准的文件,该文件包含了系列的key-value对 ,每个key就是一个常量。该文件能设置的常量只能是在struts包里边的一个default.properties文件里边的属性常量。

Struts2配置常量总共有三种方式:
通过struts.properties、通过struts.xml文件、通过Web应用的web.xml文件。
如:

在struts.properties文件中配置的常量可以覆盖default.properties文件中的常量,在struts.xml文件中配置了一个常量,该常量可代替struts.properties文件中Struts2配置属性。


Struts2框架按如下顺序加载Struts2常量:
struts-default.xml->struts-plugin.xml->struts.xml->struts.properties->web.xml


3.5 实现Action

Action类里包含了对用户请求的处理逻辑,Action也被称为业务控制器。
相对于Struts1而言,Struts采用了低浸入式的设计,不要求Struts2的Action类必须继承的Struts2的基类ActionSupport或者Action。

Struts2通常直接使用Action来封装HTTP请求参数,这也是问什么Action里边包含参数对应的属性。----------而通常在使用Action的execute方法之前,即解析和预处理阶段,会调用Action的这些属性封装请求参数。


Action类里边的属性,不仅可封装请求参数,还可以用于封装处理结果(该结果可用标签<s:property value=”属性名”>从StackContext或者ValueStack中取出)。P175

Action接口:定义了Struts2的Action处理类应该遵循的规范。该接口定义了5个常量,声明了一个方法—execute();
ActionSupport基类:该类提供了许多默认的方法。如获取国际化信息,数据校验的方法,默认的处理用户请求的方法。


Action访问Servlet API
有三种方法:
1、Struts2提供了一个ActionContext类,通过该类可以访问Servlet API。----间接方式访问
常用的有访问和操作request和session的application属性。

2、Action还可以这样访问servlet API,但需实现如下几个接口:
如ServletContextAware、ServletRequestAware、ServletResponseAware…….
3、 可使用ServletActionContext 访问ServletAPI--------------这个工具类
Action依靠这个工具类,可以以更简单的方式访问Servlet API.


3.6 配置Action

struts.xml文件中配置Action就是让Struts2知道使用那个Action处理那个用户请求,也就是完成用户请求和Action之间的对应关系。

1、包和命名空间
每个包有多个Action,每个Action可以有多个拦截器,Struts2的默认包为struts-default
包用来组织Action和拦截器,可以定义抽象包,可供其他包继承,当然其它非抽象包也可被继承。
命名空间主要是为了处理同一个Web应用中包含同名的Action的情形,用于指定该包对应的命名空间。
Struts2不支持为单独的Action设置命名空间,而是通过包来设定。

2、Action的基本配置:
Struts2提供了包含处理多个处理逻辑的Action,调用DMI(动态方法调用)来处理请求。
要像实现动态调用,先需在struts的default.properties文件中设置struts.enable.DynamicMthodInvocation常量的值为true.
动态调用有两种实现方式:
○1action=”ActionName!methodName”;--------------意思是:把用户请求提交给Action名为ActioName里边的methodName方法来处理。
可改进上方法:指定method属性
○2使用通配符
当多个匹配的action时,除非请求的URL与Action的name属性绝对相同,否则将按先后顺序来决定有那个Action来处理用户请求,这也是为什么name=”*”的action配置在最后的原因。
--
配置默认的Action:
<default-action-ref name=”自己指定一个Action的名字"/>
<action name="自己指定一个Action的名字" class=”…”>
<result>.....
</action>

--
配置Action的默认处理类,struts的Action的默认处理类是ActionSupport即Action的基类。
当然也可更改默认处理类。
在struts.xml中定义<default-class-ref class="…………."/>



3.7 配置处理结果

配置结果,Action处理完成后,返回一个普通字符串---逻辑视图名,必须在struts.xml文件中完成逻辑试图和物理试图资源的映射,才可让系统转到实际的视图资源。

可配置两种结果:一、全局结果,二、局部结果
默认的返回结果类型:dispatcher类型(struts默认的)------用于与JSP整合的结果类型。

Struts2支持的结果类型:
1、PlainText结果类型:用于显示某个页面的原始代码的结果类型
2、Stream结果类型:用于向浏览器返回一个InputStream(一般用于文件下载)
3、Redirect结果类型:用于直接跳抓到其他URL的结果类型
4、RedirectAction结果类型:用于直接跳转到其他Action的结果类型。
……..等。

全局结果:
在struts.xml文件中package节点下定义。
<global-resilts>
<result name=”success”>/{….}</result>
</global-results>

局部覆盖全局的Result….

可使用PreResultListener这个监听器接口,它可在Action完成控制器处理之后和系统转入实际的物理试图之间被回调。可作为日志的实现形式。

3.8 配置Struts2的异常处理

1、我们可在Action的execute()方法里边使用try{}catch{}捕捉异常,当捕捉到时,系统返回对应逻辑视图名-----这种方式完全是手动处理异常,非常繁琐,可复用性不好。
2、对于1方法,我们完全可以把这种对应关系推迟到struts.xml文件中完成。在strut.xml文件中开启异常映射需开启一个拦截器。
声明异常捕捉:在Action里边throw异常!!
在struts.xml文件中通过配置<exception-mapping…/>元素来完成。需指定两个属性:exception和result。

又可设置全局异常和局部异常。

可输出异常信息:<s:property value=”exception”/>或<s:property value=”exceptionStack”/>


3.9 Convention插件预“约定”支持


3.10使用Struts2的国际化

Struts2的国际化是建立在Java国际化的基础之上,一样也是通过不同国家语言环境的消息资源,然后通过ResourceBundle加载指定Locale对应的资源文件,再取得该资源文件中指定key对应的消息。
Struts2对java程序国际化进行了封装。

1、Struts2中加载全局资源文件
Struts2提供了多种方式加载国际化资源文件,最简单的是加载全局国际化资源文件,在struts.xml中通过配置常量完成,只需配置struts.custom.i18n.resources常量即可,该常量的值指定资源文件的名称。

2、访问国际化信息
Struts2访问国际化信息有三种方式:
○1在JSP页面中使用标签<s:text>标签,该标签可以指定一个name属性,该属性指定了国际化资源文件中的key。
○2在Action中 调用国际化资源信息,可使用ActionSuppor类提供的getText(“名字”)方法,该方法也只需一个name属性。
○3在表单元素里输出国际化信息,为该表单标签指定一个key属性,该key对应国际化资源中的key,若不存在指定的key,则表单标签的名字为key字符串序列。

3、输出带占位符的国际化资源
4、加载资源文件的方式
除了最常用的加载方式,还有其它加载方式:
分别是包范围的资源文件、Action范围的资源文件、临时资源文件。

5、加载资源文件的顺序
……………P228

3.11 使用Struts2的标签库

Struts2也提供了大量的标签来支持开发表现层页面。
Struts2可将标签分为三类:
UI标签(又分为表单和非表单)、
Ajax标签、
非UI标签(又分为流程控制标签和数据访问标签(输出valueStack中的值,完成国际化等功能))。

Struts2的OGNL表达式语言-------------------------与JSP2 EL的作用完全相似。
Struts2利用内建的OGNL表达式语言,大大加强了Struts2的数据访问功能。增加了对ValueStack的支持。


在Struts2应用中,视图页面可通过标签直接访问Action属性值,当Action属性值不是简单值是,而是某个对象、数组、集合时,即可用OGNL来访问这些集合的内部数据。


OGNL的StackContext和ValueStack两个概念:
StackContext是整个OGNL计算、求值的Context,而ValueStack只是StackContext的一个“根”对象而已。OGNl的StackContext除了包含ValueStack这个根对象外,还包括parameters/requesr/session/application/attr等命名对象。

StackContext的根对象和普通命名对象的区别在于:
访问根对象须在对象面前加#前缀、
访问根对象的属性时可省略对象名。


Debug标签主要用于辅助调试他在页面上生成一个超级链接,通过该链接可查看ValueStack和StackContext中所有值的信息。

几个标签说明:
param标签:主要为其它标签提供参数,该标签与其它标签一起使用。
bean标签:用于创建一个JavaBean实例.
set标签:用于把某个值放入制定的范围,如application/request.session等。
property标签:输出value指定的属性的值,如无指定,默认输出valueStack栈顶的值。
token标签,这是一个用于防止多次提交表单的标签,能组织多次提交表单的问题(避免刷新页面导致的多次提交)。P268

-----------------------------
非表单标签

主要用于在页面上生成一些非表单元素的可视化元素。如tab页面、树形结构。当然也包含在页面中显示Action里封装的信息。
主要有如下几个:
actionerror:
actionmessage:
component:
fielderror:如果Actions实例存在表单域的类型转换错误、校验错误,该标签负责输出这些错误提示。


学习笔记...............

猜你喜欢

转载自haiors.iteye.com/blog/1605119
今日推荐