MVC框架技术Struts2

1.Struts2概述

1.1在Web程序的开发过程中,大家普遍认可了MVC模式的重要地位。但是MVC模式并没有给出代码结构性的具体要求。例如MVC的控制器部分是做一个Servlet,还是做多个Servlet,跳转页面的名称是写在代码中,还是写在配置文件中。对这些问题,MVC模式不能给出进一步的回答。虽然大家都使用MVC模式,但是写出来的代码还是不能做到完全的一致。这样就给MVC模式开发的规范化带来了不少的麻烦。
Sun Microsystems的一名高级工程师Craig R. McClanahan为我们解除了这个烦恼。他设计了一套Web应用程序的通用框架Struts。Struts为Java Web应用提供了MVC框架,尤其适用于开发大型可扩展的Web应用,开发人员可以把精力集中在如何解决实际业务问题上。

1.2 Struts框架有如下优点:
支持MVC模式,结构清晰,使开发者只关注业务逻辑的实现。
Struts提供的标签库如能灵活使用,可能大大提高开发效率。
通过一个配置文件,即可把握整个系统各部分之间的联系,这对于后期的维护有着莫大的好处。
提供Exception处理机制。
提供数据库连接池管理。
支持国际化(I18N)。

1.3 Struts2的MVC原理


2 Action与结果类型

2.1Action的实现类
在Struts2中,Action的设计是非常关键的。Struts2中对Action对象没有特殊要求, Action可以是任意的Java对象,它和Web对象之间没有直接关系,所以这样的Action是非常易于测试的,这也是Struts2中Action的最大优点。
普通的Java对象作为Action
继承ActionSupport实现Action
模型驱动(ModelDriven)的Action

2.2在Action中访问Web对象

通过ActionContext访问
public static ActionContext getContext():获得ActionContext 对象。
public Map getParameters():从请求对象(HttpServletRequest)中获取请求参数。
public Map getApplication():获取ServletContext中保存的Attribute。
public Map getSession():获取HttpSession中保存的Attribute。
直接访问Web对象
Struts2框架提供org.apache.struts2.ServletActionContext辅助类来获得web对象。

HttpServletRequest request = ServletActionContext.getRequest();
HttpServletResponse response = ServletActionContext.getResponse();
HttpSession session = request.getSession();
ServletContext application = ServletActionContext.getServletContext();

2.3通过IOC访问Servlet对象
在Struts2中,可以通过IOC(依赖注入)将Servlet对象注入到Action中,这一切都是由一组接口决定的,这一组接口有一个共同点,名称都由Aware结尾。
public interface ApplicationAware {
public void setApplication(Map application);
}

2.4多方法的Action
前面所定义的Action都是通过execute()方法处理请求。在实际的应用中,如果为每个业务逻辑定义一个Action,虽然实现方便,但是Action数量多,struts.xml中需要配置的内容也多,使系统非常庞杂。实际上,可以用一个Action处理多个业务请求。
以BsCustomerAction为例,可以为每个操作定义一个方法,这些方法的格式和execute()方法一样。

public class BsCustomerAction {
……
public String login() throws Exception {
……
return "msg";
}
public String register() throws Exception {
……
return "msg";
}
……
}

多方法Action的配置及调用方法有如下几种:
1.为Action配置method属性
2.动态方法调用
动态方法调用是指采用如下格式调用Action中对应的方法:
控制名!方法名.action
3. 使用通配符映射方式
在struts.xml文件中配置action元素时,它的name、class、method属性都可支持通配符,这种通配符的方式是另一种形式的动态方法调用。当使用通配符定义action的name属性时,相当于用一个元素action定义了多个逻辑Action。例如:

<action name="BsCustomer_*" class="bookstore.action.BsCustomerAction"
method="{1}"> 
……
</action> 
2.5Result类型
在配置文件中,action的result子元素用于配置Action跳转的目的地,其基本格式为: <result name="resultName" type="resultType">…</result>。Action某业务方法的返回值与result的name值相对应,以此来表明该方法执行完将跳转到哪个页面。type可以有多种选择,Struts2支持各种视图技术,例如JSP、JSF、XML等,默认的是JSP。常见的type类型配置如下:
Dispatcher
redirect
chain
redirectAction

3 输入验证

良好的输入验证是一个成熟系统的必备条件。Struts2提供了安全的服务器验证方法,一种是使用validate()方法,另一种是配置验证。
使用validate()方法
使用验证文件验证
一般情况下,验证文件的命名规则是:Action类名-validatin.xml。如果一个Action有多个逻辑处理方法,要为某个特定方法做验证,可采用如下方式命名:Action类名-Action逻辑名-validatin.xml(其中,Action逻辑名,是指struts.xml中的对应该处理方法的action配置中的name值)。可采用通配符的方式,以区分不同的方法

4 Struts2国际化、标签库和OGNL表达式

4.1Struts2国际化
国际化是指应用程序运行时,可根据客户端请求来自的国家/地区、语言的不同而显示不同的界面。Struts2框架通过资源文件的方式来实现国际化。
下面以客户登录页面为例,说明制作国际化程序的步骤。
(1)在属性文件中配置strlcustom.i18n.resources。strlcustom.i18n.resources常量中设置的值为资源文件的basename(基本名称)。
struts.custom.i18n.resources=resources
(2)在【源包】下建立中文和英文的资源文件。按照basename_language_country.pro
perties的命名规则来建立不同语言环境的资源文件。如果资源文件内有非西欧字符集,则需要使用native2ascii转换工具转换为unicode编码,但采用NetBeans6.9开发会自动编码,所有不用转换。
(3)修改login.jsp
(4)将属性文件中struts.locale值分别设置成zh_CH和en_US

4.2常用Struts 2标签
Struts2框架的标签库可以分为3类:
用户界面标签(UI标签) 主要用于生成HTML元素的标签。
非用户界面标签 主要用于数据访问、逻辑控制等。
AJAX标签 该标签用来支持AJAX技术。
其中,用户界面标签(UI标签),可以分为下面两类:
表单标签 表单标签主要用于生成HTML页面的Form元素,以及普通表单元素标签。
非表单标签 用于生成页面上的tree、tab页等。
非用户界面标签,也可以分为两类:
数据标签 主要包含用于输出值栈(ValueStack)中的值、完成国际化等功能的标签。
控制标签 主要包含用于实现分支、循环等流程控制的标签。

5 拦截器、文件上传和下载

5.1拦截器
拦截器(Interceptor)是Struts2的核心组成部分。很多功能都是构建在拦截器基础之上的,例如文件的上传和下载、国际化、转换器和数据校验等。Struts2利用内建的拦截器完成了框架内的大部分操作。
拦截器动态拦截Action调用的对象,它提供了一种机制,使开发者可以定义一个特定的功能模块,这个模块可以在Action执行之前或者之后运行,也可以在一个Action执行之前阻止Action执行。
Struts2架构的Action被一个或者多个拦截器(拦截器栈)所包围,所有的用户请求都会被拦截器所拦截,然后交给Action处理,处理结果以逻辑视图方式返回给用户。而这个调用执行流程,是由Struts2的配置文件来实现的。
自定义拦截器
自定义一个拦截器需要三步:
(1)自定义一个实现Interceptor接口(或者继承自AbstractInterceptor)的类。
(2)在struts.xml中注册上一步中定义的拦截器。
(3)在需要使用的Action中引用上述定义的拦截器,为了方便也可将拦截器定义为默认的拦截器,这样在不加特殊声明的情况下所有的Action都被这个拦截器拦截。
Struts2中Interceptor接口的定义如下:

public interface Interceptor extends Serializable {
void destroy();
void init();
String intercept(ActionInvocation invocation) throws Exception;
}
5.2

文件上传和下载
Struts2框架默认使用Common-fileUpload组件实现文件上传,该组件将解析出HttpServletRequest请求中的文件域信息,并使用IO流方式,将文件保存在服务器的指定位置。
使用Struts2的文件上传功能,需要在Web应用中引入两个JAR文件,即commons-io-1.3.2.jar和commons-fileupload-1.2.1.jar。
上传文件过滤
Struts 2提供了一个内置的文件上传拦截器fileUpload,通过配置该拦截器可以轻松地实现文件过滤。在Action配置中引用fileUpload拦截器时,可以为其指定两个参数:
allowedTypes 指定允许上传的文件类型,多个文件类型之间以英文逗号(,)隔开。
maximumSize 指定允许上传的文件大小,单位是字节。
当文件过滤失败后,系统自动转入input逻辑视图,因此必须为该Action配置名为input的逻辑视图。除此之外,还必须显式地为该Action配置defaultStack的拦截器引用。






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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值