Struts2实现Preparable接口  实现preparable接口,实现public void prepare() throws Exception 方法。当你访问某问action指定方法之前,最先执行prepare()。这里边可以写些准备工作的代码

1 public void prepare() throws Exception {
2
3         request = ServletActionContext.getRequest();
4         requestIp = getIpAddr(request);
5         response = ServletActionContext.getResponse();
6         session = request.getSession();
7         application = ServletActionContext.getServletContext();
8     }

View Code

Struts2继承ActionSupport类
1)如果你的Action类是继承自ActionSupport的话,确切的说是重写了execute方法,ActionSupport里的默认实现就是返回"success"视图。因此,你可以不实现execute方法,只要你的struts.xml里有"success"对应的result即可。

2)如果你的Action类没有继承ActionSupport,而你又没有在struts.xml中对应<action>标签中用method属性指定你自己的方法的话,默认就要找execute方法,这时是必须要实现execute方法的,否则Struts2会找不到对应的方法而报错。

不过,大部分情况下都是继承ActionSupport的(比如输入验证、文件上传等功能就要求必须继承)。还有,不管你写没写execute方法,还是可以用<action>标签的method属性指定其他方法的。

在Struts2中,Action可以不实现任何特殊的接口或者继承特殊的类,仅仅是一个POJO(Plain Old Java Object,简单的Java对象)就可以;也可以实现Xwork2中的Action接口;但是由于Xwork的Action接口非常简单,为程序员提供的帮助有限,因此,在实际开发中,会更多的使用继承ActionSupport类来实现Action的方式,如下所示:

import com.opensymphony.xwork2.ActionSupport;
public class HelloWorldAction extends ActionSupport { //省略了 } 

  ActionSupport类本身实现了Action接口,所以继承ActionSupport类就相当于实现了Action接口。除此之外,ActionSupport类还实现了其它几个接口,来为程序员提供更多使用的功能,这些接口和Struts2的一些其他特性相结合,可以实现基本的数据验证功能和国际化。接口如下所示:

com.opensymphony.xwork2.Validateable;  //提供validate()方法来为Action增加验证的功能
com.opensymphony.xwork2.Validateaware; //提供方法来保存和恢复action或field级的错误信息
com.opensymphony.xwork2.TextProvider;  //提供获取本地信息文本的功能 com.opensymphony.xwork2.LocaleProvider;//提供getLocale()方法来获取本地消息

  1)基本的数据验证

  • 要实现数据验证的功能,只需要在Action类中覆盖实现validate方法即可;在validate方法内部,对请求传递过来的数据进行校验,如果不满足要求,那么添加例外信息到父类用于存放例外的集合中。示例代码如下:

package cn.javass.hello.struts2impl.action;  import com.opensymphony.xwork2.ActionSupport;public class HelloWorldAction extends ActionSupport { private String account; private String password; private String submitFlag; public String execute() throws Exception { this.businessExecute(); return "toWelcome"; } public void validate(){ if(account==null || account.trim().length()==0){ this.addFieldError("account", "账号不可以为空"); } if(password==null || password.trim().length()==0){ this.addFieldError("password", "密码不可以为空"); } if(password!=null && !"".equals(password.trim()) && password.trim().length()<6){ this.addFieldError("password", "密码长度至少为6位"); } } /** * 示例方法,表示可以执行业务逻辑处理的方法, */ public void businessExecute(){ System.out.println("用户输入的参数为==="+"account="+account+",password="+password+",submitFlag="+submitFlag); } public String getAccount() { return account; } public void setAccount(String account) { this.account = account; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public String getSubmitFlag() { return submitFlag; } public void setSubmitFlag(String submitFlag) { this.submitFlag = submitFlag; } } 

  从上面的示例可以看出,在validate方法中,可以对用户请求中传递过来的数据进行验证,同一个数据可以进行多方面的验证。

  如果验证结果是数据不正确,那么就使用父类提供的addFieldError方法来添加验证的错误消息。addFieldError方法有两个参数,前面的是消息的key值,后面是具体的消息。

  • 细心的你肯定发现了,validate方法是没有返回值的,那么当验证后,如果有数据没有通过验证,该返回到什么页面呢?这就需要在struts.xml中的Action配置里面,添加一个名称为input的result配置,也就是说,如果validate方法中,有数据没有通过验证,那么会自动跳转回到该action中名称为input的result所配置的页面。示例如下:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC  "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"  "http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>  <constant name="struts.devMode" value="true" />        <!-- 设置了程序的运行模式 --><constant name="struts.locale" value="zh_CN"/>         <!-- 设置程序运行所使用的locale --><constant name="struts.i18n.encoding" value="utf-8"/>  <!-- 设置程序运行时用的编码方式 --><!-- 正确设置后面两个参数,就可以解决Struts2的中文问题了。 --><package name="helloworld"  extends="struts-default">  <action name="helloworldAction" class="cn.javass.hello.struts2impl.action.HelloWorldAction">  <result name="toWelcome">/s2impl/welcome.jsp</result> <result name="input">/s2impl/login.jsp</result>   </action>  </package>  </struts> 

  • 当输入信息不满足条件的时候,将错误信息显示在前台页面上,代码如下:

<%@ page language="java" contentType="text/html; charset=utf-8"  pageEncoding="utf-8"%>
<%@ taglib prefix="s" uri="/struts-tags"%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; utf-8">
<title>Insert title here</title>
<style type="text/css">
ul,li {list-style-type:none;margin:0px;float:left;
}
</style>
</head>
<body>  <form action="/struts2Deepen2/helloworldAction.action" method="post"> <input type="hidden" name="submitFlag" value="login"/>  <div> <font color=red><s:fielderror fieldName="account"/></font><br/> 账号:<input type="text" name="account"> </div> <div> <font color=red><s:fielderror fieldName="password"/></font> <br/> 密码:<input type="password" name="password"> </div> <input type="submit" value="提交"> </form> </body> </html> 

  在JSP页面中利用<s:fielderror/>标签在相应的字段处输出错误信息。但是,在实际开发中,<s:fielderror/>它会输出全部的错误信息内容。而如果想选择性地输出指定错误信息。我们可以使用如下代码解决:

<!-- 方法一 -->
<s:fielderror> <s:param>username</s:param> <!--显示指定的 username字段的 错误消息--> <s:fielderror/> <!-- 方法二 --> <s:fielderror fieldName="username"/> <!--显示指定的 username字段的 错误消息--> 

  • 通过这个示例,你会发现,validate方法会先于execute方法被执行,只有validate方法执行后,又没有发现验证错误的时候,才会运行execute方法,否则会自动跳转到你所配置的input所对应的页面。

  2)访问本地信息

  在上面的示例中,你会发现在validate方法中,添加验证错误消息的时候,是采用的硬编码方式,也就是直接写死的字符串,这是很不好的:

  ① 不容易修改,比如要改变消息的内容,还得重新修改和编译类;

  ② 不利于国际化,如果要把中文的信息变换成英文的呢,同样要重新修改和编译类。

  可以通过访问本地信息的方式,把这些错误消息放置到Action类外部的配置文件中,在Action类内部只需要按照这些消息的key值去获取消息即可。这样一来,当消息发生变化的时候,只需要修改这个消息的配置文件即可。

  • 先来建立消息的配置文件,在Action类的路径下建立一个同名的properties文件,也就是文件名为HelloWorldAction.properties,然后在里面按照key=value的格式,添加要使用的错误消息。示例如下:
k1=\u5E10\u53F7\u4E0D\u5141\u8BB8\u4E3A\u7A7A
k2=\u5BC6\u7801\u4E0D\u5141\u8BB8\u4E3A\u7A7A
k3=\u5BC6\u7801\u957F\u5EA6\u5FC5\u987B\u57286\u4F4D\u4EE5\u4E0A

  可能你会觉得很奇怪,这都是些什么呀?其实是把中文的消息转换成了相应的unicode编码,比如k1后面的value值,其实就是“帐号不允 许为空”的unicode编码。只有这样,在程序里面读取到这些值的时候才会正确显示中文。有很多工具可以把中文转换成unicode编码,比如,native2ascii工具就可以实现。

  • Action里面,就修改validate方法,原来是直接写的中文字符串,现在应该修改成从配置文件中获取信息了,示例如下:
 public void validate(){  if(account==null || account.trim().length()==0){ this.addFieldError("account", this.getText("k1")); } if(password==null || password.trim().length()==0){ this.addFieldError("password", this.getText("k2")); } if(password!=null && !"".equals(password.trim()) && password.trim().length()<6){ this.addFieldError("password", this.getText("k3")); } } 

Struts2实现Preparable接口和【struts2】继承ActionSupport类相关推荐

  1. Struts2学习日记(二)简单的Struts2登陆实现(Action继承ActionSupport类)

    功能实现:实现登陆功能,输入用户名和密码,如果用户名不为hello或者密码不为world,便返回登陆页并提示错误,否则显示登陆结果. 1.打开MyEclipse,创建一个webProject项目. 2 ...

  2. struts2 中 Preparable 接口实现数据准备

    今天才知道struts还有Preparable接口,实现此接口需要实现其prepare()方法,调用action中其他方法之前会先调用prepare()方法.此接口和方法可以用于初始化一些数据. 测试 ...

  3. java structs 控制器_Struts2 ActionSupport类:业务控制器

    Action 是实现 WebWork 核心组件的业务控制器,一般直接继承 ActionSupport 类.在 ActionSupport 类中包含一个 execute() 方法,但是这个方法不包含任何 ...

  4. Struts2中action接收参数的三种方法及ModelDriven跟Preparable接口结合JAVA反射机制的灵活用法...

    Struts2中action接收参数的三种方法及ModelDriven跟Preparable接口结合JAVA反射机制的灵活用法 www.MyException.Cn   发布于:2012-09-15 ...

  5. Struts2框架中的Action接口和ActionSupport类

    Struts2框架中的Action接口和ActionSupport类 1.Action接口 2.ActionSupport类 3.登录案例 3.1.页面 3.2.控制器 3.3.struts.xml配 ...

  6. java面试准备之---Struts2体系知识点,系统复习,struts2原理,ognl,el支持.---随时更新

    1.MVC 和 JSP Model 2 **   a.:M-Model 模型 包含两部分:业务数据和业务处理逻辑   b.V-View 视图:视图(View)的职责是负责显示界面和用户交互(收集用户信 ...

  7. struts2教程_Struts 2教程– Struts2教程

    struts2教程 Welcome to Struts 2 Tutorial index post. Struts 2 is one of the mostly used Java Web Appli ...

  8. Struts2框架使用(十)之struts2的上传和下载

    Struts2  文件上传 首先是Struts2的上传,Struts2 文件上传是基于 Struts2 拦截器实现的,使用的是fileupload组件: 首先如果想要上传文件,则需要在表单处添加 en ...

  9. struts2学习笔记之十一:struts2的类型转换器

    Struts2的类型转换器 如何实现Struts2的类型转换器? * 继承StrutsTypeConverter * 覆盖convertFromString和convertToString 注册类型转 ...

最新文章

  1. ORA-00600: 内部错误代码,参数: [qctcte1], [0], [], [], [], [], [], []
  2. boost 变量类型转换
  3. 网络一大抄,无耻的网站
  4. FPGA入门基础介绍
  5. python开发怎么成长_成长路线图:如何成为一名Python开发者?
  6. Atitit.spring体系结构大总结 1. Spel表达式解析 1 2. Srping mvc 1 3. Ioc 4 3.1. ApplicationContext在BeanFactory的基础
  7. NB-IOT平台之电信平台FOTA 升级记录
  8. 对于三极管饱和状态的一些浅见——与网友的讨论贴
  9. Oracle Statistic 统计
  10. 【已解决】兼容多个版本CUDA
  11. RL Python练习
  12. 无线电波的波段划分和应用
  13. html水晶按钮图片,利用CSS3 Gradients创建无图片水晶按钮
  14. 安卓中的inflate方法
  15. fopen用java代码实现_C语言基础(20)-文件操作(fopen,getc,fclose)
  16. 20万+网易音乐人图鉴: 95后超70%、女歌手突破5万
  17. html div位于居中元素右边,如何居中一个元素(终结版)
  18. vscode 添加新建文件夹快捷键 (配置 when 属性)
  19. “以卡养卡”是个技术活,一般人玩不了,不一般的人玩的溜
  20. 分布式、高性能和高可用解决方案 (分布式)

热门文章

  1. etcd v3的webui管理界面
  2. JMeter命令行生成监控CPU和内存图片
  3. 高性能智能计算实验——devcloud平台
  4. C++ override使用详解
  5. H.266/VVC SCC技术学习:帧内块拷贝(Intra block copy, IBC)
  6. 一般邮箱的邮件群发数量限制是多少?
  7. hdfs 不通过回收站删除文件
  8. 中望cad文字显示问号怎么办_CAD图纸中的钢筋符号显示成问号,怎么办?
  9. android控件加圆角,android 控件圆角的设置
  10. 圣域书城的项目已正式启动!