`
nesta2001zhang
  • 浏览: 70783 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

继承ActionSupport

阅读更多

2.8  增加数据校验

在上面应用中,即使浏览者不输入任何用户名、密码,系统也会处理用户请求。在我们整个HelloWorld应用中,这种空用户名、空密码的情况不会引起太大的问题。但如果数据需要保存到数据库,或者需要根据用户输入的用户名、密码查询数据,这些空输入可能引起异常。

为了避免用户的输入引起底层异常,通常我们会在进行业务逻辑操作之前,先执行基本的数据校验。

2.8.1  继承ActionSupport

ActionSupport类是一个工具类,它已经实现了Action接口。除此之外,它还实现了Validateable接口,提供了数据校验功能。通过继承该ActionSupport类,可以简化Struts 2的Action开发。

在Validatable接口中定义了一个validate()方法,重写该方法,如果校验表单输入域出现错误,则将错误添加到ActionSupport类的fieldErrors域中,然后通过OGNL表达式负责输出。

为了让Struts 2增加输入数据校验的功能,改写程序中的LoginAction,增加重写validate方法。修改后的LoginAction类代码如下:

程序清单:codes\02\2.8\validate1\WEB-INF\src\lee\LoginAction.java

//继承ActionSupport来实现Struts 2的Action类
public class LoginAction extends ActionSupport
{
//下面是Action内用于封装用户请求参数的两个属性
private String username;
private String password;
//username属性的getter和setter方法
public String getUsername()
{
return username;
}
public void setUsername(String username)
{
this.username = username;
}
//password属性的getter和setter方法
public String getPassword()
{
return password;
}
public void setPassword(String password)
{
this.password = password;
}
//处理用户请求的execute方法
public String execute() throws Exception
{
//当用户请求参数的username等于crazyjava,密码请求参数为leegang时,
//返回success字符串,否则返回error字符串
if (getUsername().equals("crazyjava")
&& getPassword().equals("leegang"))
{
//通过ActionContext对象访问Web应用的HTTP Session
ActionContext.getContext().getSession()
.put("user" , username);
return SUCCESS;
}
else
{
return ERROR;
}
}
//完成输入校验需要重写的validate方法
public void validate()
{
//如果用户名为空,或者用户名为空字符串
if (getUsername() == null || 
getUsername().trim().equals(""))
{
//添加表单校验错误
addFieldError("username", "user.required");
}
//当密码为空,或者密码为空字符串时,添加表单校验错误
if (getPassword() == null ||
getPassword().trim().equals(""))
{
addFieldError("password", "pass.required");
}
}
}

上面的Action类重写了validate方法,该方法会在执行系统的execute方法之前执行,如果执行该方法之后,Action类的fieldErrors中已经包含了数据校验错误,请求将被转发到input逻辑视图处。

为了在校验失败后能将转入名为input的逻辑视图,必须在配置该Action时指定input属性。下面是修改后的login Action的配置片段:

程序清单:codes\02\2.8\validate1\WEB-INF\src\struts.xml

<!-- 定义login的Action,该Action的实现类为lee.LoginAction类 -->
<action name="login" class="lee.LoginAction">
<!-- 定义处理结果和视图资源之间映射关系 -->
<!-- 定义input的逻辑视图名,对应login.jsp页面 -->
<result name="input">/login.jsp</result>
<result name="error">/error.jsp</result>
<result name="success">/welcome.jsp</result>
</action>

对比上面的Action配置与前面的Action配置,我们发现该Action配置片段中增加了input逻辑视图的配置,该逻辑视图映射到login.jsp页面。

前面已经提到:当用户提交请求时,请求得到execute方法处理之前,先会被validate方法处理,如果该方法处理结束后,Action的 fieldErrors里的校验错误不为空,请求将被转发给input逻辑视图。如果我们不输入用户名、密码而直接提交表单,将看到如图2.13所示的界 面。

 
(点击查看大图)图2.13  输入校验的界面

看到这里也许读者觉得非常神奇:我们仅仅在Action添加了数据校验错误,并未在输入页面输出这些校验错误信息,但图2.13所示的页面,却可以 看到页面已经输出了这些校验信息--这是因为Struts 2的标签,上面的JSP页面中表单使用的并不是HTML表单,而是用了<s:form .../>标签,Struts 2的<s:form ... />标签已经具备了输出校验错误的能力。

注意  Struts 2的<s:form .../>默认已经提供了输出校验错误的能力。

但上面的程序还存在一个问题:校验信息的国际化。查看上面的Action类代码发现:重写validate方法时,如果发生校验失败的问题,校验错误的提示信息是以硬编码方式写死了--这就失去了国际化的能力。

实际上,ActionSupport类已经提供了国际化信息的能力,它提供了一个getText(String key)方法,该方法用于从资源文件中获取国际化信息。为了让校验信息支持国际化,再次改写Action里的validate方法,改写后的 validate方法代码如下:

程序清单:codes\02\2.8\validate1\WEB-INF\src\lee\LoginAction.java

//完成输入校验需要重写的validate方法
public void validate()
{
//如果用户名为空,或者用户名为空字符串
if (getUsername() == null || 
getUsername().trim().equals(""))
{
//添加校验错误提示,使用getText方法来提示信息国际化
addFieldError("username", getText("user.required"));
}
//当密码为空,或者密码为空字符串时,添加表单校验错误
if (getPassword() == null ||
getPassword().trim().equals(""))
{
addFieldError("password", getText("pass.required"));
}
}

在上面的validate方法中,添加校验错误提示时,并不是直接给出了错误提示的字符串,而是调用了getText(key)方法来获取错误提 示。因为在Action中,使用getText(key)方法获取了两个国际化提示:user.required和pass.required,因此应该 在国际化资源文件中添加这两条提示信息。

提示  ActionSupport增加了让提示信息国际化的能力,ActionSupport提供的getText(key)方法可以根据资源文件加载获得国际化提示信息。

此时,如果没有任何输出,直接提交登录表单,将看到如图2.14所示的界面。

 
(点击查看大图)图2.14  国际化数据校验的错误提示
分享到:
评论

相关推荐

    Spring和Struts整合---继承ActionSupport的方法

    **继承ActionSupport的方法** `ActionSupport`是Struts2提供的一个基类,包含了一些常用的功能,如国际化、验证、业务逻辑执行状态等。在Spring与Struts整合时,我们的自定义Action通常会继承`ActionSupport`,这样...

    自定义Action继承ActionSupport实现简单登录

    当我们需要实现一个特定的功能,比如这里的“简单登录”,我们可以创建一个新的Action类并继承`ActionSupport`,这样可以利用其提供的便利功能,同时添加自己的业务逻辑。 首先,让我们了解下`ActionSupport`类的...

    Struts2继承ActionSupport例子

    这个例子展示了如何在自定义的Action类中继承`ActionSupport`,从而利用其内置的特性。 首先,`ActionSupport`类是所有Struts2 Action类的基类,它包含了以下几个关键功能: 1. **字段验证**:`ActionSupport`提供...

    struts 2 基础2__继承ActionSupport完成输入校验

    **继承ActionSupport的优点:** 1. **错误处理**:`ActionSupport`提供了处理异常的能力,当Action执行过程中发生异常时,可以自动捕获并设置错误信息。 2. **国际化**:`ActionSupport`支持多语言,可以通过改变...

    ActionSupport与action区别1

    有两种常见的创建Action的方式:实现Action接口和继承ActionSupport类。这两种方式各有特点,但ActionSupport类通常更受开发者青睐,因为它提供了许多内置的功能。 1. 实现Action接口(implements Action) 当一个...

    ActionSupport源代码

    通过继承ActionSupport,开发者可以快速构建符合Struts2规范的Action,而无需从头开始实现所有基础功能。同时,ActionSupport的源代码也为我们揭示了Struts2框架在处理请求、验证和响应过程中的内部机制。

    ActionSupport接口类

    action类中为何要继承ActionSupport这个接口类。

    校验框架1

    本篇文章将聚焦于“校验框架1”,具体是Struts2框架中的数据验证机制,包括如何通过继承ActionSupport类以及利用内置的校验框架来实现有效的用户输入验证。 【标签】:“doc文档” 【正文】: Struts2作为一款...

    图书管理系统J2EE设计报告书

    开发者通常会继承ActionSupport类,利用其提供的国际化、验证和错误处理等功能。 Spring框架则在Struts的基础上进一步提升了灵活性和可测试性,它支持依赖注入(DI)和面向切面编程(AOP),简化了组件之间的耦合。...

    struts2 Action编写方式

    3. 继承ActionSupport类: `ActionSupport`是Struts2提供的一个基类,它实现了Action接口,并提供了很多有用的功能,如国际化支持、内置的校验框架等。因此,大多数开发者倾向于继承`ActionSupport`,以便利用其...

    JAVASSH面试题.doc

    Struts1.2 和 Struts2.0 是两个不同的框架,Struts1.2 需要 Action 类继承一个基类,而 Struts2.0 需要 Action 继承 ActionSupport 基类。Struts1.2 的 Action 是单例模式的,而 Struts2.0 的 Action 为每一个请求...

    信息系统软件设计:第3章 Struts2.0-Action知识.ppt

    总结:在Struts2框架中,Action是业务逻辑的核心,通过不同的实现方式,如POJO、实现Action接口或继承ActionSupport,可以满足不同层次的需求。同时,Action与页面之间的数据传递、struts.xml的配置以及异常处理机制...

    Java实训教程 Java软件开发实战 Java开发框架介绍 struts2_2_Action详解 共43页.pptx

    3. **继承ActionSupport类**:继承自`com.opensymphony.xwork2.ActionSupport`,重写`execute()`方法。 **推荐方式**:通常建议使用继承`ActionSupport`类的方式,因为它提供了很多常用的方法,比如数据校验、错误...

    搭建好的一个struts2环境

    1.在包com.test.web.action添加类,比如Test1Action.java,该类需要继承ActionSupport 2.在WebRoot/WEB-INF/jsp添加对应的页面Test1.jsp,把Test1Action类名的Action去掉,就是页面的名称 3.然后就可以通过http...

    spring、Struts2、hibernate常见面试题

    * Action 类:Struts1.2 要求 Action 类继承一个基类,而 Struts2.0 Action 要求继承 ActionSupport 基类。 * 线程模式:Struts1.2 Action 是单例模式的,并且必须是线程安全的,而 Struts2.0 Action 为每一个请求...

    Spring整合Struts

    无论是通过ContextLoaderPlugin还是继承ActionSupport类,开发者都可以根据项目的需求选择最合适的整合策略。通过利用Spring的DI和AOP特性,以及Struts的MVC架构,企业级应用的开发变得更加高效、可维护和可扩展。

    Spring集成Struts的三种方案

    1. 方案一(继承ActionSupport)的优点在于Action类可以直接访问Spring Bean,减少了代码的间接性,但可能导致Action类与Spring的耦合度增加。 2. 方案二(委托给Spring Bean)强调了Action的纯粹控制器角色,降低了...

    struts2初学者入门教程

    开发者可以通过继承ActionSupport来简化Action的编写。 #### 三、Struts2开发环境搭建 - **开发工具:** 开发Struts2应用,可以使用MyEclipse、Eclipse配合相应的插件。需要下载Struts2的核心包以及其他依赖库,如...

Global site tag (gtag.js) - Google Analytics