Struts 2讲义 (5)

更新时间:2023-08-13 17:06:01 阅读量: IT计算机 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

Struts 2 讲义(5)

--Struts2特性

一、国际化

国际化的步骤:

1) 建立一个中文资源文件,globalMessages.properties。用文本编辑器输入,内容

如下:

#定义国际化资源文件

HelloWorld=你好,世界! name=用户名称 pass=用户密码 username=用户名 password1=密码 password2=确认密码 birthday=生日

2) 在Dos中执行下面命令:

native2ascii globalMessages.properties globalMessages_zh_CN.properties

3)中文资源文件名:globalMessages_zh_CN.properties。转换内容为: #\u5b9a\u4e49\u56fd\u9645\u5316\u8d44\u6e90\u6587\u4ef6 HelloWorld=\u4f60\u597d\uff0c\u4e16\u754c\uff01 name=\u7528\u6237\u540d\u79f0 pass=\u7528\u6237\u5bc6\u7801 username=\u7528\u6237\u540d password1=\u5bc6\u7801

password2=\u786e\u8ba4\u5bc6\u7801 birthday=\u751f\u65e5

4)建立一个英文资源文件内容为:globalMessages_en_US.properties

HelloWorld=Hell World! name=username pass=password username=Your Name password1=Password

password2=confirm Password birthday=Birthday

5)上述两个文件保存到WEB-INF\classes目录中

6)创建struts.properties 中,保存到WEB-INF\classes目录下,内容如下:

struts.custom.i18n.resources=globalMessages

7)创建reg.jsp

<%@ page language="java" pageEncoding="UTF-8"%> <%@ taglib prefix="s" uri="/struts-tags" %> <html> <head>

<title>UI Tags Example</title>

<s:head/> <!-- 这句很重要,如果没有时间与日期就不能正确显示 --> </head> <body> <table>

<s:form id="id" action="reg">

<s:textfield name="username" label="用户名"/> <s:textfield name="password1" label="密码"/> <s:textfield name="password2" label="确认密码"/> <s:datetimepicker name="birthday" label="生日 " displayFormat="yyyy-MM-dd" /> <s:submit value="注册"/> </s:form> </table> </body> </html>

8)创建reg_ok_local.jsp代码如下所示:

<%@ page language="java" pageEncoding="UTF-8"%> <%@ taglib prefix="s" uri="/struts-tags" %> <html> <head>

<title>注册成功</title>

</head> <body>

欢迎<s:property value="username"/>注册成功! <h2><s:text name="HelloWorld"/></h2> <h2><s:text name="username"/></h2> <h2><s:text name="password1"/></h2> <h2><s:text name="password2"/></h2> <h2><s:text name="birthday"/></h2> </body> </html>

9)创建Reg.java

package com.my.inter;

import java.util.Date;

import com.opensymphony.xwork2.Action; public class Reg implements Action { }

private String username; private String password1; private String password2; private Date birthday;

public Reg(){ }

public String getUsername() { }

public void setUsername(String username) { }

public String getPassword1() { }

public void setPassword1(String password1) { }

public String getPassword2() { }

public void setPassword2(String password2) { }

public Date getBirthday() { }

public void setBirthday(Date birthday) { }

public String execute() throws Exception { return SUCCESS; }

this.birthday = birthday; return birthday;

this.password2 = password2; return password2;

this.password1 = password1; return password1;

ername = username; return username;

9)配置struts.xml

<action name="reg" class="com.my.inter.Reg">

执行结果如下:

<result name="success">/reg_ok_local.jsp</result>

</action>

改进reg_tag.jsp

Struts2 可以在label值中访问国际化资源文件。

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <%@ taglib prefix="s" uri="/struts-tags" %> <html> <head>

<title>UI Tags Example</title> <s:head/>

</head> <body> <table>

<s:form id="id" action="Reg">

<s:textfield name="username" label="%{getText('username')}"/> <s:textfield name="password1" label="%{getText('password1')}"/> <s:textfield name="password2" label="%{getText('password2')}"/> <s:datetimepicker name="birthday" label="%{getText('birthday')} " displayFormat="yyyy-MM-dd" /> <s:submit value="注册"/> </s:form> </table> </body> </html>

运行结果如下图所示:

二、 数据校验

1.输入校验简介

在 Web 系统项目中有大量的视图页面需要用户自行输入很多数据。这些数据的类型有很多种。为了防止某些客户的恶意输入以及对 Web 项目的恶意破坏。必须引入输入校验像 Windows 操作系统中的防火墙一样把一些“垃圾”数据过滤,挡在 Web 系统之外。Struts2 的输入校验是以类型转换为基础。而且输入校验一般和 Web 系统的业务逻辑息息相关。

1.使用validate方法进行校验

Struts2 对输入校验这方面采用的最基本方法是在每个Action 里继承ActionSupport 类,并且重写它的输入校验方法 validate()。在注册页面中输入各种校验将所有不符合输入校验规则的错误信息都由 ActionSupport 类中另一个方法 addFieldError 方法将错误信息加入到表单错误信息,并且在输入数据的页面显示,而不会再由 Action 导航到注册成功页面。 【例3-4】使用validate方法进行校验实例。

⑴ 注册页面:register.jsp

<%@ page language="java" pageEncoding="gb2312"%> <%@ taglib prefix="s" uri="/struts-tags"%> <html> <head> <title>注册页面</title> <s:head/> </head> <body> <!-- 用户信息注册form表单 --> <s:form action="Register.action" validate="true"> <table width="60%" height="76" border="0"> <!-- 各标签定义 --> <s:textfield name="username" label="用户名"/> <s:password name="password" label="密 码" /> <s:password name="repassword" label="密 码确认" /> <s:textfield name="birthday" label="生日"/> <s:textfield name="mobile" label="手机号码"/> <s:textfield name="age" label="年龄"/> <s:submit value="注册" align="center"/> </table> </s:form> </body> </html>

⑵ 注册控制类:RegisterAction.java package it;

import com.opensymphony.xwork2.ActionSupport; import java.util.Date;

public class RegisterAction extends ActionSupport { // Action类公用私有变量,用来做页面导航标志 private static String FORWARD = null; private String username; // 用户名属性 private String password; // 密码属性 private String repassword; // 确认密码属性 private Date birthday; // 生日属性 private String mobile; // 手机号码属性 private int age; // 年龄属性 public String getUsername() { // 取得用户名值 return username; } public void setUsername(String username) { // 设置用户名值 ername = username; } public String getPassword() { // 取得密码值 return password; } public void setPassword(String password) { // 设置密码值 this.password = password; } public String getRepassword() { // 取得确认密码值 return repassword;

}

public void setRepassword(String repassword) { // 设置确认密码值 this.repassword = repassword; }

public Date getBirthday() { // 取得生日值 return birthday; }

public void setBirthday(Date birthday) { // 设置生日值 this.birthday = birthday; }

public String getMobile() { // 取得手机号码值 return mobile; }

public void setMobile(String mobile) { // 设置手机号码值 this.mobile = mobile; }

public int getAge() { // 取得年龄值 return age; }

public void setAge(int age) { // 设置年龄值 this.age = age; }

public String execute() throws Exception { // 执行注册方法 FORWARD = "success"; return FORWARD; }

public void validate() { // 校验方法,用来输入校验 // 校验是否输入用户名 if (getUsername() == null || getUsername().trim().equals("")) { addFieldError("username", "请输入用户名"); } // 校验是否输入生日 if(getBirthday()==null){ addFieldError("birthday", "请输入生日日期"); }else // 校验是否输入正确的生日日期 if(getBirthday().after(new Date())){ addFieldError("birthday", "请不要输入未来日期"); } // 校验是否输入密码 if (getPassword() == null || getPassword().trim().equals("")) { addFieldError("password", "请输入密码"); } // 校验是否输入确认密码 if (getRepassword() == null || getRepassword().trim().equals("")) { addFieldError("repassword", "请输入确认密码"); } // 校验输入的密码和确认密码是否一致 if (!getPassword().equals(getRepassword())) { addFieldError("repassword", "确认密码和密码输入不一致"); }

// 校验输入的手机号码长度是否正确 if (getMobile().length()!=11) { addFieldError("mobile", "请输入正确的手机号码"); } // 校验输入的年龄是否正确 if (getAge()<1||getAge()>99) { addFieldError("age", "请输入您的真实年龄"); } } }

⑶注册成功页面:register1.jsp

<%@ page language="java" pageEncoding="gb2312"%> <%@ taglib prefix="s" uri="/struts-tags"%> <html> <head> <title>注册页面</title> <s:head/> </head> <body> <!-- 用户信息注册form表单 --> <s:form action="Register.action" validate="true"> <table width="60%" height="76" border="0"> <!-- 各标签定义 --> <s:textfield name="username" label="用户名"/> <s:password name="password" label="密 码" /> <s:password name="repassword" label="密 码确认" /> <s:textfield name="birthday" label="生日"/> <s:textfield name="mobile" label="手机号码"/> <s:textfield name="age" label="年龄"/> <s:submit value="注册" align="center"/> </table> </s:form> </body> </html>

运行结果如图3-8、3-9所示。

图3-8没有输入数据校验

图3-9 校验输入密码不一致

2.使用validateXXX方法进行校验

Struts2 中除了 validate 方法之外它还有一种validateXXX 方法针对 Action 中某一特定方法进行各种字段的输入校验。其中 XXX 就是该特定方法名。 【注】:如果使用 validateRegister 方法,那最好不要再使用 validate 方法。validate 方法是对所有 Action 中方法的输入校验都进行校验,validateRegister 方法只对 Register 方法进行校验。因此两者不能重复使用,都使用会造成两个方法都进行了校验的结果。执行顺序是先

validateRegister后validate。如果 validateRegister 方法有特殊的输入校验则就会被 validate 方法“覆盖”,因此达不到预期的输入校验目的。 【例3-5】使用validateXXX方法进行校验实例。

⑴ 注册页面:register1.jsp

<%@ page language="java" pageEncoding="gb2312"%> <%@taglib prefix="s" uri="/struts-tags"%> <html> <head> <title>注册页面</title> </head> <body>

<!-- fielderror标签显示所有校验错误信息 --> <s:fielderror></s:fielderror> <!-- 用户信息注册form表单 --> <s:form action="Register1!Register.action"> <table width="60%" height="76" border="0"> <!-- 各标签定义 --> <s:textfield name="username" label="用户名"/> <s:password name="password" label="密 码" /> <s:password name="repassword" label="密 码确认" /> <s:textfield name="birthday" label="生日"/> <s:textfield name="mobile" label="手机号码"/> <s:textfield name="age" label="年龄"/> <s:submit value="注册" align="center"/> </table> </s:form> </body> </html>

⑵ 注册控制类:RegisterAction1.java package it;

import java.util.Date;

import com.opensymphony.xwork2.ActionSupport;

public class RegisterAction1 extends ActionSupport { private static String FORWARD = null; private String username; // 用户名属性 private String password; // 密码属性 private String repassword; // 确认密码属性 private Date birthday; // 生日属性 private String mobile; // 手机号码属性 private int age; // 年龄属性 public String getUsername() { // 取得用户名值 return username; } public void setUsername(String username) { // 设置用户名值 ername = username; } public String getPassword() { // 取得密码值 return password; }

public void setPassword(String password) { // 设置密码值 this.password = password; }

public String getRepassword() { // 取得确认密码值 return repassword; }

public void setRepassword(String repassword) { // 设置确认密码值 this.repassword = repassword; }

public Date getBirthday() { // 取得生日值 return birthday; }

public void setBirthday(Date birthday) { // 设置生日值 this.birthday = birthday; }

public String getMobile() { // 取得手机号码值 return mobile; }

public void setMobile(String mobile) { // 设置手机号码值 this.mobile = mobile; }

public int getAge() { // 取得年龄值 return age; }

public void setAge(int age) { // 设置年龄值 this.age = age; }

// 执行注册方法

public String Register() throws Exception { FORWARD = "success"; return FORWARD; }

public void validateRegister() { // 校验方法,用来输入校验 // 校验是否输入用户名 if (getUsername() == null || getUsername().trim().equals("")) { addFieldError("username", "请输入用户名"); } // 校验是否输入生日 if (getBirthday() == null) { addFieldError("birthday", "请输入生日日期"); } else // 校验是否输入正确的生日日期 if (getBirthday().after(new Date())) { addFieldError("birthday", "请不要输入未来日期"); } // 校验是否输入密码 if (getPassword() == null || getPassword().trim().equals("")) { addFieldError("password", "请输入密码"); } // 校验是否输入确认密码 if (getRepassword() == null || getRepassword().trim().equals("")) { addFieldError("repassword", "请输入确认密码");

}

// 校验输入的密码和确认密码是否一致

if (!getPassword().equals(getRepassword())) { addFieldError("repassword", "确认密码和密码输入不一致"); } if (getMobile().length() != 11) { // 校验输入的手机号码长度是否正确 addFieldError("mobile", "请输入正确的手机号码"); } if (getAge() < 1 || getAge() > 99) { // 校验输入的年龄是否正确 addFieldError("age", "请输入您的真实年龄"); } } } 运行结果如图3-10所示。

图3-10 validateXXX方法校验没有输入数据

2.使用Struts2框架校验

Struts2框架提供了一种基于框架文件的输入校验方式,将校验规则保存在特定的框架

文件中,这样就使输入校验同Action实现分离,提高了系统的维护性。

Struts2使用配置文件来完成输入校验方式步骤:首先在 Action 代码中去除所有 validate与validateXXX 方法的代码。然后在和 Action 类文件同一级目录下增加 XXX-validation.xml 配置文件。这里“XXX ”是 Action 类文件名字,表示该 XML 文件中所有输入校验的规则定义和错误信息显示方式都只针对该 Action 有效。

1.Struts2 字段校验

Struts2字段校验是在<validators>和</validators>之间使用<field>来对输入界面表单中每一个字段进行输入校验规制定义和错误定义。<field>中的name属性就是字段名字。它包含<field-validator>标签,它的 type 属性表明是何种类型的输入校验。这些输入校验的 type 都是在 Struts2 中缺省定义的,被称之为校验器。在 <field-validator> 标签内可以有 2 种标签,一种是 <param> 标签,该标签定义了一些输入校验规则需要用到的参数。这些参数更可以以“ ${ 参数名 } ”格式显示在视图页面上。除此之外还有 <message> 标签,该标签定义的是输入校验出错后的出错信息。这些信息是可以显示在试图界面上的。 【例3-6】使用Struts2字段校验实例。

(1) 注册页面:register2.jsp

<%@ page language="java" pageEncoding="gb2312"%> <%@taglib prefix="s" uri="/struts-tags"%> <html> <head> <title>注册页面</title> <s:head/> </head> <body> <!-- 用户信息注册form表单 --> <s:form action="Register2.action" validate="true"> <table width="60%" height="76" border="0"> <!-- 各标签定义 --> <s:textfield name="username" label="用户名"/> <s:password name="password" label="密 码" /> <s:password name="repassword" label="密 码确认" /> <s:textfield name="birthday" label="生日"/> <s:textfield name="mobile" label="手机号码"/> <s:textfield name="age" label="年龄"/> <s:submit value="注册" align="center"/> </table> </s:form> </body> </html>

(2) 注册控制类:RegisterAction2.java package it;

import java.util.Date;

import com.opensymphony.xwork2.ActionSupport; public class RegisterAction2 extends ActionSupport { private static String FORWARD = null; private String username; // 用户名属性 private String password; // 密码属性

}

private String repassword; // 确认密码属性 private Date birthday; // 生日属性 private String mobile; // 手机号码属性 private int age; // 年龄属性

public String getUsername() { // 取得用户名值 return username; }

public void setUsername(String username) { // 设置用户名值 ername = username; }

public String getPassword() { // 取得密码值 return password; }

public void setPassword(String password) { // 设置密码值 this.password = password; }

public String getRepassword() { // 取得确认密码值 return repassword; }

public void setRepassword(String repassword) { // 设置确认密码值 this.repassword = repassword; }

public Date getBirthday() { // 取得生日值 return birthday; }

public void setBirthday(Date birthday) { // 设置生日值 this.birthday = birthday; }

public String getMobile() { // 取得手机号码值 return mobile; }

public void setMobile(String mobile) { // 设置手机号码值 this.mobile = mobile; }

public int getAge() { // 取得年龄值 return age; }

public void setAge(int age) { // 设置年龄值 this.age = age; }

// 执行注册方法

public String Register() throws Exception { FORWARD = "success"; return FORWARD; }

(3) 字段校验配置文件:RegisterAction2-validation.xml <?xml version="1.0" encoding="gb2312"?> <!DOCTYPE validators PUBLIC

"-//OpenSymphony Group//XWork Validator 1.0.2//EN"

"/xwork/xwork-validator-1.0.2.dtd"> <validators>

<field name="username"> <field-validator type="stringlength"> <param name="minLength">6</param> <param name="maxLength">8</param> <message>用户名长度必须在${minLength}-${maxLength}位之间</message> </field-validator> <field-validator type="requiredstring"> <message>请输入用户名</message> </field-validator> </field>

<field name="password"> <field-validator type="stringlength"> <param name="minLength">6</param> <param name="maxLength">8</param> <message>密码长度必须在${minLength}-${maxLength}位之间</message> </field-validator> <field-validator type="requiredstring"> <message>请输入密码</message> </field-validator> </field>

<field name="repassword"> <field-validator type="stringlength"> <param name="minLength">6</param> <param name="maxLength">8</param> <message>确认密码长度必须在${minLength}-${maxLength}位之间</message> </field-validator> <field-validator type="requiredstring"> <message>请输入确认密码</message> </field-validator> <field-validator type="fieldexpression"> <param name="expression">password==repassword</param> <message>确认密码和密码输入不一致</message> </field-validator> </field>

<field name="birthday"> <field-validator type="required"> <message>请输入生日日期</message> </field-validator> <field-validator type="date"> <param name="min">1928-01-01</param> <param name="max">2004-01-01</param> <message>输入生日日期无效</message> </field-validator> </field>

<field name="mobile"> <field-validator type="requiredstring"> <message>请输入手机号码</message> </field-validator> <field-validator type="stringlength"> <param name="minLength">11</param> <message>请输入正确的手机号码,号码位数必须为11位</message> </field-validator> </field>

<field name="age"> <field-validator type="required">

<message>请输入年龄</message> </field-validator> <field-validator type="int"> <param name="min">1</param> <param name="max">80</param> <message>年龄必须在${min}-${max}岁之间</message> </field-validator> </field> </validators> 运行结果与例3-5相似。

2. Struts2 非字段校验

非字段格式的输入校验方式与上字段校验相比主要是它的书写格式不是像之前在 <validators>和</validators> 之间包含<field>标签,而是 <validator>标签。每个<validator> 标签定义的 type 属性还是 Struts2 自带的输入校验器的类型格式。

在<validator>标签之内包含的还是<param>和<message>两种标签。但是在<param>中多定义了一个 fieldName 属性。这个属性定义的就是输入校验的表单字段名字。其他和之前字段格式都类似。

【例3-7】使用Struts2非字段校验实例。 ⑴ 注册页面与注册控制类与例3-5一致。 ⑵ 非字段校验配置文件:RegisterAction3-validation.xml <?xml version="1.0" encoding="gb2312"?> <!DOCTYPE validators PUBLIC

"-//OpenSymphony Group//XWork Validator 1.0.2//EN"

"/xwork/xwork-validator-1.0.2.dtd"> <validators> <validator type="stringlength"> <param name="fieldName">username</param> <param name="minLength">6</param> <param name="maxLength">8</param> <message>用户名长度必须在${minLength}-${maxLength}位之间</message> </validator> <validator type="requiredstring"> <param name="fieldName">username</param> <message>请输入用户名</message> </validator> <validator type="stringlength"> <param name="fieldName">password</param> <param name="minLength">6</param> <param name="maxLength">8</param> <message>密码长度必须在${minLength}-${maxLength}位之间</message> </validator> <validator type="requiredstring"> <param name="fieldName">password</param> <message>请输入密码</message> </validator> <validator type="stringlength"> <param name="fieldName">repassword</param>

<param name="minLength">6</param> <param name="maxLength">8</param> <message>确认密码长度必须在${minLength}-${maxLength}位之间</message> </validator> <validator type="requiredstring"> <param name="fieldName">repassword</param> <message>请输入确认密码</message> </validator> <validator type="fieldexpression"> <param name="fieldName">password</param> <param name="fieldName">repassword</param> <param name="expression">password==repassword</param> <message>确认密码和密码输入不一致</message> </validator> <validator type="required"> <param name="fieldName">birthday</param> <message>请输入生日日期</message> </validator> <validator type="date"> <param name="fieldName">birthday</param> <param name="min">1928-01-01</param> <param name="max">2004-01-01</param> <message>输入生日日期无效</message> </validator> <validator type="requiredstring"> <param name="fieldName">mobile</param> <message>请输入手机号码</message> </validator> <validator type="stringlength"> <param name="fieldName">mobile</param> <message>请输入正确的手机号码,号码位数必须为11位</message> </validator> <validator type="required"> <param name="fieldName">age</param> <message>请输入年龄</message> </validator> <validator type="int"> <param name="fieldName">age</param> <param name="min">1</param> <param name="max">80</param> <message>年龄必须在${min}-${max}岁之间</message> </validator> </validators>

三、拦截器

1.1.1 拦截器简介

拦截器,在AOP(Aspect-Oriented Programming)中用于在某个方法或字段被访问之前,进行拦截然后在之前或之后加入某些操作。拦截是AOP的一种实现策略。

拦截器(Interceptor)是动态拦截Action调用的对象,类似于Servlet中的过滤器。在执行Action的业务逻辑处理方法(execute())之前,Struts2会首先执行在struts.xml中引用的拦截器。拦截器是struts2的一个重要特性。Struts2框架的大多数核心功能都是通过拦截器来实现的,如避免表单重复提交、类型转换、对象组装、验证、文件上传等,都是在拦截器的帮助下实现的。

拦截器之所以称为“拦截器”,是因为它可以在Action执行之前和执行之后拦截调用。Struts2将它的核心功能放到拦截器中实现,而不是分散到Action中实现,有利于系统的解耦,使得功能的实现类似于个人电脑的组装,变成了可插拔的,需要某个功能就“插入”一个拦截器,不需要某个功能就“拔出”一个拦截器。你可以任意组合拦截器来为Action提供附加的功能,而不需要修改Action的代码。拦截器围绕着Action和Result的执行,其工作方式如图3-1所示。

图3-1 Struts2拦截器工作方式

从图中可以看到,在Action和Result执行之前,为Action配置的拦截器将首先被执行,在Action和Result执行之后,拦截器将重新获得控制权,然后按照与先前调用相反的顺序依次执行。在整个执行过程中,任何一个拦截器都可以选择直接返回,从而终止余下的拦截器、Action和Result的执行。例如:当一个未授权的用户访问受保护的资源时,执行身份验证的拦截器可以直接返回。

1.1.2 Struts2拦截器

Struts2内置了大量的拦截器,这些拦截器以name-class对的形式配置在struts-default.xml文件中,其中name是拦截器的名字,就是以后使用该拦截器的唯一标识;class则指定了该拦截器的实现类,如果定义的package继承了Struts2的struts-default包,则可以自由使用下面定义的拦截器,否则必须自己定义这些拦截器。

表3-1 Struts2内置拦截器

大部分时候,开发者无需手动控制这些拦截器,因为struts-default.xml文件中已经配置

了这些拦截器,只要我们定义的包继承了系统的struts-default包,就可以直接使用这些拦截器。

1.定义拦截器

Struts2 拦截器定义格式为:

<interceptor name="拦截器A" class="拦截器实现类A">

<!--定义拦截器参数-->

<param name="参数A">参数A初始化值</param> <param name="参数B">参数B初始化值</param>

……

</interceptor>

2.拦截器栈

拦截器栈:就是由多个拦截器组成的一个拦截器组,来实现一个特定的拦截功能。例如,可以可以将用户安全认证拦截器、日志拦截器、密码加密组成一个拦截器栈,在一个业务控制Action执行之前使用,比如用户注册Action,在执行该Action前来执行该拦截器栈,进行一系列公共功能方面的处理。

拦截器栈的定义:

<interceptor-stack name="basicStack"> <interceptor-ref name="exeption"/> <interceptor-ref name="servletConfig"/> <interceptor-ref name="prepare"/> <interceptor-ref name="checkbox"/> <interceptor-ref name="param"/>

<interceptor-ref name="conversionError"/> </interceptor-stack> 在拦截器栈定义的<interceptor-ref../>元素中,name除了可以是一个拦截器名称,同时也可以是一个其它拦截器栈的名称,即该拦截器栈包含了其它拦截器栈,同时包含了该拦截器栈中所有的拦截器定义。

3.编写拦截器类

在struts2中要编写拦截器类,必须实现com.opensymphony.xwork2.interceptor.Interceptor接口,该接口定义了如下的三个方法:

void init():该方法在拦截器实例创建后、intercept()方法被调用之前调用,用于初始

化拦截器所需要的资源,例如数据库连接的初始化。该方法只执行一次。

void destroy():该方法在拦截器实例被销毁之前调用,用于释放在init()方法中分配

的资源。该方法只执行一次。

String intercept(ActionInvocation invocation) throws Exception:该方法在Action执行

之前被调用,拦截器为Action提供的附加功能在该方法中实现。利用invocation参数,可以获取action执行的状态。在intercept()方法中,如果要继续执行后续的部分(包括余下的应用于Action的拦截器、Action和Result),可以调用invocation.invoke()。如果要终止后续的执行,可以直接返回一个结果码,框架将根据这个结果码来呈现对应的结果视图。

【例3-1】HelloWorld拦截器实例。

⑴ 建立一个业务控制器Reg Reg.java

package it;

import com.opensymphony.xwork2.ActionSupport; import java.util.Date;

public class Reg extends ActionSupport{ private String username; //用户名 private String password1; //密码 private String password2; //确认密码 private Date birthday; //生日 public Date getBirthday() {

}

}

public void setBirthday(Date birthday) { this.birthday = birthday; }

public String getPassword1() { return password1; }

public void setPassword1(String password1) { this.password1 = password1; }

public String getPassword2() { return password2; }

public void setPassword2(String password2) { this.password2 = password2; }

public String getUsername() { return username; }

public void setUsername(String username) { ername = username; }

public String execute() throws Exception { if(username!=null && getPassword1().equals(getPassword2())

&&!getUsername().trim().equals("")){

System.out.println("Action 信息:正在执行Action......"); return SUCCESS; }else{ return INPUT; } }

⑵ 建立一个拦截器类Myinterceptor Myinterceptor.java package it;

import com.opensymphony.xwork2.ActionInvocation;

import com.opensymphony.xwork2.interceptor.AbstractInterceptor;

public class Myinterceptor extends AbstractInterceptor { public String intercept(ActionInvocation arg0) throws Exception { Reg reg=(Reg)arg0.getAction(); System.out.println("拦截器信息:HelloWorld拦截器!"); String result=arg0.invoke();//执行Action或者下一个拦截器 System.out.println("拦截器信息:Action执行完毕!"); return result; } }

⑶ HelloWorld 拦截器配置文件 <interceptors> <interceptor name="Myinterceptor" class="it.Myinterceptor"> </interceptor>

本文来源:https://www.bwwdw.com/article/uihj.html

Top