struts2 开发指南


Struts2 开发指南 整理内容来源于 google code 1 / 38 整理者:Matt Zhao Email: mingliangzhao@126.com 目录 资源 .................................................................................................................................................. 2 Struts2Resource ..................................................................................................................... 2 基础 .................................................................................................................................................. 2 Struts2 运行环境和安装说明 Struts2Install ...................................................................... 2 实例 .................................................................................................................................................. 4 创建 Struts2 工程 .................................................................................................................... 4 1.到 Struts2 官方网站下载包 ........................................................................................ 4 2.找到 struts-2.1.8.1\apps\struts2-blank-2.1.8.1.war 解压 ................................... 4 3.在 web.xml 中添加 Struts2 的过滤器(2.0 和 2.1 的过滤器不同) ......................... 4 4.拷贝基础包到工程 ....................................................................................................... 4 5.拷贝 struts.xml(struts2-blank-2.1.8.1\WEB-INF\src\java)到 src 目录下 ........ 5 6.写 Action 类(可以不继承任何类,也可以继承 ActionSupport) ............................. 5 7.写 HelloWorld.jsp 页面,访问 message 参数 ......................................................... 6 8.访问 HelloAction,带 message 参数 ........................................................................ 6 Struts2 在 Action 中访问 request,session,application ...................................................... 6 只需用到 attribute .......................................................................................................... 6 获得 HttpServletRequest ............................................................................................. 6 Struts2Action 中方法的访问 .................................................................................................. 7 默认方法 ........................................................................................................................... 7 访问 Action 中多个方法 .................................................................................................. 8 Struts2 返回类型 ..................................................................................................................... 8 Struts2_OGNL 表达式 ......................................................................................................... 11 Struts2 的 S 标签 .................................................................................................................. 12 Struts2 表单标签 ................................................................................................................... 15 Struts2 文件上传下载 ........................................................................................................... 16 文件上传 ......................................................................................................................... 16 文件下载 ......................................................................................................................... 17 Struts2 返回 JSON ................................................................................................................... 19 Struts2 返回 XML .................................................................................................................... 20 使用 response ............................................................................................................... 20 Struts2 增删改查例子 ............................................................................................................ 20 Struts2 验证框架 .................................................................................................................... 24 1.创建 xml 文件名 ......................................................................................................... 25 2.创建 xml 内容 ............................................................................................................. 25 3.在 action 中验证 ......................................................................................................... 31 4.自定义验证类 ............................................................................................................. 32 Struts2 国际化 ....................................................................................................................... 34 1.定义 properties 文件 .................................................................................................. 34 2.在 jsp 中访问国际化资源文件 .................................................................................. 35 3.在 Action 中访问国际化资源文件,该 Action 继承了 ActionSupport 类 ............... 36 Struts2 开发指南 整理内容来源于 google code 2 / 38 整理者:Matt Zhao Email: mingliangzhao@126.com 4.在输入验证框架访问国际化资源文件 ...................................................................... 36 5.动态改变语言 ............................................................................................................. 36 6.使用类来代替 properties 文件 .................................................................................. 37 资源 Struts2Resource Struts2 资源 网站 Apache Struts 2 http://struts.apache.org/2.x/index.html Opensymphony XWork http://www.opensymphony.com/xwork Opensymphony WebWork http://www.opensymphony.com/webwork 基础 Struts2 运行环境和安装说明 Struts2Install 最低需要:Java5、Servlet2.4、JSP2.0、Tomcat5.5 支持:Java6、Servlet2.5、JSP2.0、Tomcat6.0 以及其他容器 源代码:http://struts.apache.org/download.html struts-VERSION-all.zip 是完全版 struts-VERSION-lib.zip 是必要库版 包中 struts2-core-VERSION 是核心库 其他必备的库文件: Apache Jakarta Common 项目: ognl-VERSION.jar OGNL 引擎 freemarker-VERSION.jar FREEMARKER 模板引擎 xwork-VERSION.jar 其他插件: Struts2 开发指南 整理内容来源于 google code 3 / 38 整理者:Matt Zhao Email: mingliangzhao@126.com struts2-xxx-plugin-VERSION.jar 分版本 2.1 2.0 Struts2AndStruts1 Struts2 和 Struts1 对比 Struts 2 = WebWork 2.2 对比: 1.配置文件:Struts1 配置文件放在 WEB-INF/struts-config.xml(可定制)目录下;Struts2 的配置 文件要放在 WEB-INF/classes 目录下 2.控制器:Struts1 的控制器是一个 ActionServlet 类;Struts2 的控制器是一个过滤器。 3.动作表单:Struts1 的 HTML 表单对应一个 ActionForm 类的实例,动作类可访问对应配置的 ActionForm,操作 ActionForm 进行填充数据传输对象;Struts2 的 HTML 表单直接映射成 POJO, 动作类中可直接访问 POJO,操作对 POJO 的验证。 4.动作类:Struts1 的动作类继承 org.apache.struts.action.Action 类;Struts2 的动作类可以是任 何一个 POJO,但是最好是继承 ActionSupport 类?。 5.显示对象:在 JSP 中 Struts2 使用 OGNL 来显示各种对象模型,JSP 自带的 JSTL 和 EL 中 EL 常用来补充使用。 6.标签库:Struts1 常用 HTML 标签库、Bean 标签库和 Logic 标签库;Struts2 有通用标签库、 表单标签库? 。 为什么最好是继承 ActionSupport 类 ?Struts2 的标签具体有哪些? ActionSupport 类的作用: struts2 不要求我们自己设计的 action 类继承任何的 struts 基类或 struts 接口,但是我们为了方便实现我们 自己的 action,大多数情况下都会继承 com.opensymphony.xwork2.ActionSupport 类,并重写此类里的 public String execute() throws Exception 方法。因为此类中实现了很多的实用借口,提供了很多默认方法,这些默 认方法包括国际化信息的方法、默认的处理用户请求的方法等,这样可以大大的简化 Acion 的开发。 Struts2 中通常直接使用 Action 来封装 HTTP 请求参数,因此,Action 类里还应该包含与请求参数对应的属 性,并且为属性提供对应的 getter 和 setter 方法。 Struts2 的标签具体有哪些: 详见 http://struts.apache.org/2.2.1.1/docs/tag-developers-guide.html Struts2 开发指南 整理内容来源于 google code 4 / 38 整理者:Matt Zhao Email: mingliangzhao@126.com 实例 创建 Struts2 工程 Struts2Hello 1.到 Struts2 官方网站下载包 2.找到 struts-2.1.8.1\apps\struts2-blank-2.1.8.1.war 解压 3.在 web.xml 中添加 Struts2 的过滤器(2.0 和 2.1 的过滤器不同) struts2 org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteF ilter struts2 /* struts2 org.apache.struts2.dispatcher.FilterDispatcher struts2 /* 4.拷贝基础包到工程 struts2-core-2.1.8.1.jar --核心包 xwork-core-2.1.6.jar --xwork 所依赖的核心包,struts2 是在 xwork 基础上开发的 ognl-2.7.3.jar --ognl 表达式包 freemarker-2.3.15.jar --模板引擎包 commons-io-1.3.2.jar --处理 IO 包(可不用加) commons-fileupload-1.2.1.jar --文件上传包 Struts2 开发指南 整理内容来源于 google code 5 / 38 整理者:Matt Zhao Email: mingliangzhao@126.com 5.拷贝 struts.xml(struts2-blank-2.1.8.1\WEB-INF\src\java)到 src 目录下 /helloWorld/HelloWorld.jsp 6.写 Action 类(可以不继承任何类,也可以继承 ActionSupport) //Action public class HelloAction { private String message; // (默认执行方法) public String execute() { System.out.println("world:" + message); // SUCCESS 是 result 的 默 认 值 , 即 result 中没有写 name, 如 /example/HelloWorld.jsp return "success"; } Struts2 开发指南 整理内容来源于 google code 6 / 38 整理者:Matt Zhao Email: mingliangzhao@126.com public String getMessage() { return message; } public void setMessage(String message) { this.message = message; } } 可以继承 Action 接口,里面定义了一些返回的字符串常量(如 SUCCESS,INPUT,ERROR...),和 execute 方法. 或者继承 ActionSupport 类,Actioin 接口的默认实现. 7.写 HelloWorld.jsp 页面,访问 message 参数 <%@ taglib prefix="s" uri="/struts-tags" %>

Message:

8.访问 HelloAction,带 message 参数 HelloWorld Struts2 在 Action 中访问 request,session,application 只需用到 attribute //获取 request ActionContext ctx = ActionContext.getContext(); ctx.put("request", "request"); //获取 Session Map session = ctx.getSession(); session.put("session", "session"); //获取 ServletContext Map appliction = ctx.getApplication(); appliction.put("appliction", "appliction"); 获得 HttpServletRequest 1. 代码获得 Struts2 开发指南 整理内容来源于 google code 7 / 38 整理者:Matt Zhao Email: mingliangzhao@126.com HttpServletRequest request = ServletActionContext.getRequest(); HttpServletResponse response = ServletActionContext.getResponse(); HttpSession session = request.getSession(); //不要在 Action 构造器里调用,可能还没初始化好 ServletContext servletContext = ServletActionContext.getServletContext(); 2. 接口获得 如果有多个 Action 需要用到 request,可以写个 Action 继承接口,使用 request 的 Action 继承再它. /*继承 ServletRequestAware(获得 request),ServletResponseAware(获得 response), ServletContextAware(获得 ServletContext),SessionAware(获得 Session)接口*/ public class FormAction implements ServletRequestAware,ServletResponseAware{ private HttpServletRequest request; private HttpServletResponse response; //拦截器会把 request 注入到变量中 public void setServletRequest(HttpServletRequest req) { this.request = req; } public void setServletResponse(HttpServletResponse res) { this.response = res; } } Struts2Action 中方法的访问 默认方法 //Struts2 中默认访问的是 Action 中 execute 方法 //url:http://127.0.0.1:8080/Struts2Pro/hello.action(访问 hello 指定的 Action 中的 execute 方法) public String execute() { return "success"; } Struts2 开发指南 整理内容来源于 google code 8 / 38 整理者:Matt Zhao Email: mingliangzhao@126.com 访问 Action 中多个方法 1. 动态方法调用 只要在 url 中指定方法名称就可以了 . 如 : 要访问 HelloAction 中的 add() 方法 url:http://127.0.0.1:8080/Struts2Pro/hello!add.action (加!和方法名字) 2. 配置文件中多个方法 1. 配置多个方法 2. 使用通配符调用多个方法 Struts2 返回类型 类型对应的类 Chain(chain) 构成一条动作链 Dispatcher(dispatcher) 默认类型,转发 FreeMarker(freemarker) 用于与 FreeMarker 的集成 HttpHeader(httpheader) 把 HTTP 标头发送回用户 Redirect(redurect) 重定向到另一个 URL RedirectAction(redirectAction) 重定向到另一个 Action Struts2 开发指南 整理内容来源于 google code 9 / 38 整理者:Matt Zhao Email: mingliangzhao@126.com Stream(stream) 把一个 InputStream 流发送给浏览器(下载用) Velocity(Velocity) 用于与 Velocity 技术的集成 XSLT(xslt) 用于与 XML/XSLT 技术的集成 PlainText(plaintext) 发送普通文本,通常用来显示 JSP 页面的源代码 Chain action2 action3 /namespace2 /view.jsp Dispatcher /view.jsp /view.jsp Struts2 开发指南 整理内容来源于 google code 10 / 38 整理者:Matt Zhao Email: mingliangzhao@126.com HttpHeader 404 Redirect /jsp/Product.jsp UserAction.action?userName=${userName} http://www.google.com RedirectAction UserAction UserAction Struts2 开发指南 整理内容来源于 google code 11 / 38 整理者:Matt Zhao Email: mingliangzhao@126.com xyz ga PlainText /jsp/Menu.jsp Struts2_OGNL 表达式 Struts2 标签不支持 el 表达式,只能使用 OGNL. 1.OGNL 分为 Object Stack 和 Context Map. 把动作和相关对象压入 Object Stack. 把各种映射关系(一些 Map 类型的对象)压入 Context Map.(parameters,request,session,application,attr) OGNL 表达式加上一个前缀"#",访问 Context Map. 没加访问 Object Stack. 2.OGNL 访问数组 //String[] colors = {"blue","green","red"}; colors[0]//访问第一个元素 colors.length//访问长度 3.OGNL 访问 List countries[0]//访问第一个元素 countries.size//访问 countries.size() countries.isEmpty//访问 countries.isEmpty() 创建 List {"a","b","c"}//创建一个由 3 个 String 构成的 List 4.OGNL 访问 Map cities["CA"]或者 cities['CA']//访问 cities 中 key 为 CA 的元素 cities.size//访问 cities.size() cities.isEmpty//访问 cities.isEmpty() 创建 Map Struts2 开发指南 整理内容来源于 google code 12 / 38 整理者:Matt Zhao Email: mingliangzhao@126.com {"CA":"S","WA":"O","UT":"ST"} %{}里面的表达式会被求值(%{#request.user.age>40}->true or false,%{1+6}->7) Struts2 的 S 标签

赋值,取值

s:
el:${msg}

--${requestScope.user}||

if 标签: If 标签用来控制基本的条件处理流程,通常和 else 标签或者 elseif 标签连用。(%{}可加可不加)

user!=null
中年人
年轻人
小孩
Struts2 开发指南 整理内容来源于 google code 13 / 38 整理者:Matt Zhao Email: mingliangzhao@126.com
user==null

iterator 标签: 对集合迭代

迭代 List
userList
index:  是否第一个:  是否最后一个:  是否偶数:  是否奇数: 
     
null
迭代 Map
userMap
index:  是否第一个:  是否最后一个:  是否偶数:  是否奇数: 
       
null

append 标签: 对多个集合进行合并


合并 List
index:  是否第一个:  是否最后一个:  是否偶数:  是否奇数: 
     

List 和 Map 合并,结果为 Map
index:  是否第一个:  是否最后一个:  是否偶数:  是否奇数: 
Struts2 开发指南 整理内容来源于 google code 15 / 38 整理者:Matt Zhao Email: mingliangzhao@126.com        
Struts2 表单标签 Struts2 开发指南 整理内容来源于 google code 16 / 38 整理者:Matt Zhao Email: mingliangzhao@126.com Struts2 文件上传下载 文件上传 1.jsp 页面 2.Action //单个文件上传可以用 File files,String filesFileName,String filesContentType //名称要与 jsp 中的 name 相同(三个变量都要生成 get,set) private File[] files; // 要以 File[]变量名开头 private String[] filesFileName; // 要以 File[]变量名开头 private String[] filesContentType; private ServletContext servletContext; //Action 调用的上传文件方法 public String execute() { ServletContext servletContext = Struts2 开发指南 整理内容来源于 google code 17 / 38 整理者:Matt Zhao Email: mingliangzhao@126.com ServletActionContext.getServletContext(); String dataDir = servletContext.getRealPath("/file/upload"); System.out.println(dataDir); for (int i = 0; i < files.length; i++) { File saveFile = new File(dataDir, filesFileName[i]); files[i].renameTo(saveFile); } return "success"; } 3.配置上传文件临时文件夹(在 struts.xml 中配置) 文件下载 1.下载的 url(到 Action) 下载 2.struts.xml 配置 application/octet-stream inputStream attachment;filename="${fileName}" 4096 3.Action //Action 调用的下载文件方法 public String down() { return "down"; } //获得下载文件的内容,可以直接读入一个物理文件或从数据库中获取内容 public InputStream getInputStream() throws Exception { String dir = servletContext.getRealPath("/file/upload"); File file = new File(dir, "icon.png"); if (file.exists()) { //下载文件 return new FileInputStream(file); //和 Servlet 中不一样,这里我们不需对输出的中文转码为 ISO8859-1 //将内容(Struts2 文件下载测试)直接写入文件,下载的文件名必须是文本(txt)类型 //return new ByteArrayInputStream("Struts2 文件下载测试".getBytes()); } return null; } // 对于配置中的 ${fileName}, 获得下载保存时的文件名 public String getFileName() { String fileName ="图标.png"; try { // 中文文件名也是需要转码为 ISO8859-1,否则乱码 return new String(fileName.getBytes(), "ISO8859-1"); } catch (UnsupportedEncodingException e) { return "icon.png"; } } Struts2 开发指南 整理内容来源于 google code 19 / 38 整理者:Matt Zhao Email: mingliangzhao@126.com Struts2 返回 JSON 1.导入 jsonplugin 包 Struts2.16:导入 jsonplugin-0.34.jar 包(下载包)和 commons-logging-1.0.4.jar(Struts2 lib 下有) Struts2.18 导入 struts2-json-plugin-2.1.8.1.jar(Struts2 lib 下有) 2.struts.xml 中 package 中 extends="json-default" 3.result 中 type="json" user\.id user user false Struts2 开发指南 整理内容来源于 google code 20 / 38 整理者:Matt Zhao Email: mingliangzhao@126.com 4.避免使用 get 开头的 action 方法 在属性 get 方法上面加 @JSON(name="newName")json 中的名称 @JSON(serialize=false) 属性不被加入 json @JSON(format="yyyy-MM-dd") 格式化日期 5.在 action 中赋值,返回对应的 result 字符串 Struts2 返回 XML 使用 response //直接调用 responseOut 方法 public void responseOut() throws Exception { StringBuilder sb = new StringBuilder(); sb.append(""); sb.append(""); sb.append(" "); sb.append(" abc"); sb.append(" "); sb.append(""); //得到 response HttpServletResponse response = ServletActionContext.getResponse(); //设置编码 response.setCharacterEncoding("UTF-8"); response.setContentType("text/xml;charset=utf-8"); response.setHeader("Cache-Control", "no-cache"); PrintWriter out = response.getWriter(); out.write(sb.toString()); out.flush(); out.close(); } Struts2 增删改查例子 UserBean //要添加 set,get public class UserBean { private Long id; Struts2 开发指南 整理内容来源于 google code 21 / 38 整理者:Matt Zhao Email: mingliangzhao@126.com private String name; private String password; private int age; private Date birthday; private Long sex; private Set likes; private String des;//描述 } public class LikeBean { private Long id; private String name; } FormAction public class FormAction{ //属性要生成 get,set //标记(添加,修改) private String tip; private UserBean userBean; private List likeList; private List userList; //到列表页面 public String list(){ userList = new ArrayList(); userList.add(new UserBean("abc",19,new Date())); userList.add(new UserBean("def",70,new Date())); userList.add(new UserBean("ghi",40,new Date())); return "list"; } //到添加页面 public String toAdd(){ likeList = new ArrayList(); likeList.add(new LikeBean(new Long(1),"上网")); likeList.add(new LikeBean(new Long(2),"读书")); likeList.add(new LikeBean(new Long(3),"游戏")); tip = "add"; return "info"; } //添加方法,Struts2 会自动把对应的值赋值给 userBean public String add(){ System.out.println(userBean); return "toList"; } Struts2 开发指南 整理内容来源于 google code 22 / 38 整理者:Matt Zhao Email: mingliangzhao@126.com //到更新页面,取出值,设置标记 public String toUpdate(){ likeList = new ArrayList(); likeList.add(new LikeBean(new Long(1),"上网")); likeList.add(new LikeBean(new Long(2),"读书")); likeList.add(new LikeBean(new Long(3),"游戏")); tip = "update"; System.out.println("update name:"+userBean.getName()); userBean = new UserBean("update",100,new Date()); userBean.setId(new Long(101)); userBean.setSex(new Long(2)); userBean.setDes("Struts2 用户"); Set likes = new HashSet(); likes.add(new Long(2)); likes.add(new Long(3)); userBean.setLikes(likes); return "info"; } //更新方法 public String update(){ System.out.println(userBean); return "toList"; } //删除方法 public String delete(){ System.out.println("del name:"+userBean.getName()); return "toList"; } } struts.xml 配置 /form/list.jsp /form/info.jsp Struts2 开发指南 整理内容来源于 google code 23 / 38 整理者:Matt Zhao Email: mingliangzhao@126.com userAction_list ${userBean.name} ${userBean.age} jsp 页面 1.list(列表页面) <%@ taglib prefix="s" uri="/struts-tags" %>
用户列表
           修改      删除
无用户
2.info.jsp(添加和修改页面) Struts2 开发指南 整理内容来源于 google code 24 / 38 整理者:Matt Zhao Email: mingliangzhao@126.com <%@ taglib prefix="s" uri="/struts-tags" %> Struts2 验证框架 Action 配置中一定要设置 input 返回页面 添加验证只要创建验证的 xml 文件 Struts2 开发指南 整理内容来源于 google code 25 / 38 整理者:Matt Zhao Email: mingliangzhao@126.com Action 配置中一定要设置 input 返回页面 添加验证只要创建验证的 xml 文件 1.创建 xml 文件名 验证 Action 中全部方法 在 Action 同包下,创建:Action 类名-validation.xml 如:ValidateAction 创建 ValidateAction-validation.xml 验证 Action 中单个方法 注意事项 注意: 1.要验证的方法不能叫 input. 2.这样配置在 form 表单中要在中 action 写好名称, 不能写 action="validate_",然后 这样会找不到对应的配置文件,跳过验证. 3.如果验证出错,返回 input 页面时,那些存在 ValueStack 中的值会丢失,可以将 Action 实现 Preparable 接口, 然后 prepare()方法里初始化添加页面需要的值. 4.如果使用 Preparable 接口,必须在 action 配置中添加. 这样 prepare()才能得到 form 提交的参数. 2.创建 xml 内容 Struts2 开发指南 整理内容来源于 google code 26 / 38 整理者:Matt Zhao Email: mingliangzhao@126.com true Please enter a mail Invalid MAIL Struts 内建验证程序(type 的值) required 保证字段的值不是空值 null.空字符串不是空值 null. Please enter a user name requiredstring 保证字段不是空值 null,也不是空白(empty). param:trim(boolean) ->true->去除前后空格 true Please enter a user name false Struts2 开发指南 整理内容来源于 google code 27 / 38 整理者:Matt Zhao Email: mingliangzhao@126.com Please enter a password int 验证字段值是否可以转换为一个整数. param: min(int);max(int) 1999 2010 year:1999-2010 date 验证给定日期字段的值是否在一个给定的范围内. param:max(date);min(date) 1999-01-01 2010-01-01 birthday:1999-2010 email 给定的 String 值是否是一个电子邮件地址 Invalid email Struts2 开发指南 整理内容来源于 google code 28 / 38 整理者:Matt Zhao Email: mingliangzhao@126.com url 给定的 String 值是否是一个合法的 URL(要有前缀) Invalid URL expression,fieldexpression 验证给定字段是否满足一个 OGNL 表达式. 区别:expression 不是一个字段验证程序,失败时将生成一个动作错误.(JSP 中调用 才显示出错信息) fieldexpression 是一个字段验证程序,失败时将抛出一个字段错误.(对字段验证) param:expression(String)OGNL 表达式 expression: public class ExpressionTestAction { //属性生成 get,set private int min; private int max; } max > min Maximum temperature must be greater than Minimum temperature fieldexpression: public class FieldExpressionTestAction { //属性生成 get,set private int min; private int max; } Struts2 开发指南 整理内容来源于 google code 29 / 38 整理者:Matt Zhao Email: mingliangzhao@126.com max > min Maximum temperature must be greater than Minimum temperature visitor 把同一个验证程序配置文件用于多个动作(对一个 Bean 写验证文件,每个使用的 Action 只要引 用) //UserBean public class UserBean { //属性 get,set private String name; private int age; } //UserBean-validation.xml(和 UserBean 放在同一个包中) 用户名必须 18 99 Age must be between 18 and 99 //Action 的 validation.xml 用户: Struts2 开发指南 整理内容来源于 google code 30 / 38 整理者:Matt Zhao Email: mingliangzhao@126.com 如果另一个 Action 对 UserBean 使用另一个标准的验证,可以创建新的验证文件 //UserBean-specific-validation.xml 30 50 Age must be between 30 and 50 //另一个 Action 的 validation.xml specific 用户 1: conversion 检查对某个属性进行类型转换是否会导致一个转换错误 An age must be an integer. stringlength 验证一个非空的字段值是不是足够的长度 param:minLength(int);maxLength(int);trim(boolean) 6 14 Struts2 开发指南 整理内容来源于 google code 31 / 38 整理者:Matt Zhao Email: mingliangzhao@126.com length:6-14 regex 给定的值是否与一个给定的正则表达式匹配 param:expression(String)正则表达式;caseSensitive(boolean)是否区别大小写,默认为 true;trim(boolean)是否去除前后空格 Invalid phone number or invalid format 3.在 action 中验证 利用 Validateable 接口实现验证,实现 void validate()方法. ActionSupport 类已经实现了这个接口 //继承 ActionSupport public class User extends ActionSupport { //属性 get,set private String userName; private String password; private static List userNames = new ArrayList(); static { userNames.add("harry"); userNames.add("sally"); } //验证方法 public void validate() { if (userNames.contains(userName)) { //添加出错信息 addFieldError("userName", "'" + userName + "' has been taken."); } Struts2 开发指南 整理内容来源于 google code 32 / 38 整理者:Matt Zhao Email: mingliangzhao@126.com } } 4.自定义验证类 要创建一个普通的验证程序(非字段验证程序),扩展 ValidatorSupport 类.验证失败要从 validate 方法调用 addActionError 方法. 要创建一个字段验证程序,扩展 FieldValidatorSupport 类.验证失败要从 validate 方法调用 addFieldError 方法. 如果要能接受参数,要在类中定义一个相应的属性,并生成 get,set. 编写类 public class StrongPasswordValidator extends FieldValidatorSupport { //属性 private int minLength = -1; public void setMinLength(int minLength) { this.minLength = minLength; } public int getMinLength() { return minLength; } //验证方法 public void validate(Object object) throws ValidationException { String fieldName = getFieldName(); String value = (String) getFieldValue(fieldName, object); if (value == null || value.length() <= 0) { // use a required validator for these return; } if ((minLength > -1) && (value.length() < minLength)) { addFieldError(fieldName, object); } else if (!isPasswordStrong(value)) { addFieldError(fieldName, object); } } private static final String GROUP_1 = "abcdefghijklmnopqrstuvwxyz"; private static final String GROUP_2 = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; private static final String GROUP_3 = "0123456789"; protected boolean isPasswordStrong(String password) { boolean ok1 = false; boolean ok2 = false; Struts2 开发指南 整理内容来源于 google code 33 / 38 整理者:Matt Zhao Email: mingliangzhao@126.com boolean ok3 = false; int length = password.length(); for (int i = 0; i < length; i++) { if (ok1 && ok2 && ok3) { break; } String character = password.substring(i, i + 1); System.out.println("character:" + character); if (GROUP_1.contains(character)) { ok1 = true; continue; } if (GROUP_2.contains(character)) { ok2 = true; continue; } if (GROUP_3.contains(character)) { ok3 = true; } } return (ok1 && ok2 && ok3); } } 注册 xml 在 src 下创建 validators.xml 使用验证 8 Struts2 开发指南 整理内容来源于 google code 34 / 38 整理者:Matt Zhao Email: mingliangzhao@126.com Password must be at least 8 characters long and contains at least one lower case character, one upper case character, and a digit. Struts2 国际化 1.定义 properties 文件 资源文件查找顺序 JAVA 国际化 如果系统同时存在资源文件、类文件,系统将以类文件为主,而不会调用资源文件。 对于简体中文的 Locale,ResourceBundle 搜索资源的顺序是: (1)baseName_zh_CN.class (2)baseName_zh_CN.properties (3)baseName_zh.class (4)baseName_zh.properties (5)baseName.class (6)baseName.properties /* Struts2 找不到对应语言的配置文件时,会先找系统语言对应的配置文件,再找不到才使用 baseName.properties */ 国际化分为三类:全局的,包级别的,类级别的 全局的: 1.在 struts.xml 中的指定 baseName 国际化文件名为:baseName_语言名_国家名.properties (如:message_zh_CN.properties) 2.全局的国际化资源文件放在 src 下面 包级别的: 1.包级别的国际化资源文件放在该包下面 2.命名规则为:package_语言名_国家 名.properties(如:package_zh_CN.properties) 其中 package 不变,不是指的是包名,每个包的国际化文件命名都这样 Struts2 开发指南 整理内容来源于 google code 35 / 38 整理者:Matt Zhao Email: mingliangzhao@126.com 类级别的: 1.与该类放在同一目录中 2.命名规则为:类名_语言名_国家名.properties (如:RegisterAction_zh_CN.properties) 若同一 key 在上面三个国际化文件中都为 value 值则:(优先级)类级别的>包级别的>全局的 2.在 jsp 中访问国际化资源文件 mengya 传参数 定义变量,加 var 属性 mengya 表单国际化: 1.theme不能为simple如:(默认的theme不是simple) 2.使用 key 如: 3.或者使用 getText 方法 Struts2 开发指南 整理内容来源于 google code 36 / 38 整理者:Matt Zhao Email: mingliangzhao@126.com 3.在 Action 中访问国际化资源文件,该 Action 继承了 ActionSupport 类 this.getText("username.invalid") 若该 key 对应的 value 需要参数则: this.getText("username.invalid",new String[]{username}) 或 List list = new ArrayList(); list.add(username); this.getText("username.invalid",list) 如: if (null == username || username.length() < 6 || username.length() > 10) { List list = new ArrayList(); list.add(username); this.addActionError(this.getText("username.invalid",new String[]{username})); } 该国际化资源文件中的 key 和 value 为: username.invalid = \u7528\u6237\u540d "{0}" \u586b\u5199\u4e0d\u6b63\u786e 4.在输入验证框架访问国际化资源文件

pdf贡献者

huanxi1101

贡献于2012-03-07

下载需要 10 金币 [金币充值 ]
亲,您也可以通过 分享原创pdf 来获得金币奖励!