目录:
文字国际化:指在程序不做任何修改的情况下,就可以在不同国家地区和语言环境下,按照当地习惯修改显示字符。
实现国际化方式
- 以前使用ResourceBundle类中的getBundle()方法绑定指定国家的资源包(资源包规则:包名_语言简写_国家简称.properties)
- jsp页面中:<fmt:setBundle name="包名_语言简写_国家简称.properties"/> 绑定资源<fmt:message key="user"/>
- struts2:
- 准备不同国家的资源包:
- 中国: message_zh_CN.properties
- 美国: message_en_US.properties
- 英国: message_en_GB.properties
- struts.custom.i18n.resources=message。在struts.xml文件中配置相应常量struts.custom.i18n.resources,指定国际化资源文件的基名,服务器在加载struts.xml时回自动加载前缀是message的国际化资源文件。
-
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.5//EN" "http://struts.apache.org/dtds/struts-2.5.dtd"> <struts> <!-- 指定国际化资源包加载的路径 --> <constant name="struts.custom.i18n.resources" value="resources.message"></constant> </struts>
- 准备不同国家的资源包:
- 在页面上使用资源包的内容
- <s:text name="user"/>
-
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%> <%@ taglib uri="/struts-tags" prefix="s"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>国际化资源包</title> </head> <body> <%--获取国际化资源包内容 --%> <form action="#"> <s:text name="user"></s:text><input type="text" name="name"> <s:text name="password"></s:text><input type="password" name="password"> <input type="submit" value='<s:text name="login"></s:text>'> </form> </body> </html>
package i_18i; import com.opensymphony.xwork2.ActionSupport; public class UserAction extends ActionSupport{ @Override public String execute() throws Exception { String name = super.getText("user"); System.out.println(name); return "success"; } }
对异常输入的过滤就是数据校验。
- 数据校验一般分为两种:
- 前台校验:客户端校验,通过javaScript编程方式进行表单数据校验。
- 后台校验:服务器端校验,使用struts2通过xml配置方式进行表单数据校验
struts2给开发者提供了四种方式的后台数据校验:
- 用代码方式对action的所有方法进行验证
- action类继承ActionSupport并重写validate方法 (validate()方法对当前Action下的所有方法都会有效!!!!)
之后会在执行action逻辑代码之前执行validate方法
- 在struts.xml文件中对应的action配置加上input视图,然后struts2就会自动把错误信息转发到input视图的页面上去
- 在input视图页面上,打印出错误信息
-
package b_validate; import com.opensymphony.xwork2.ActionSupport; public class UserAction extends ActionSupport { private User user; /** * 如果validate方法中出现异常,则会返回错误页面 如果validate方法没有出现异常,则直接调用action中的业务逻辑代码 */ @Override public void validate() { // 在这里写表单数据验证逻辑 if (user.getName() == null || user.getName().equals("")) { // 保存错误信息,显示错误信息 super.addFieldError("user.error.requried", "用户名不能为空"); } if (user.getPassword() == null || user.getPassword().equals("")) { // 密码为空 // 把错误信息放入错误信息Map集合 super.addFieldError("password.error.requried", "密码不能为空!"); } } public String register() throws Exception { String name = super.getText("user"); System.out.println("****" + name); return "success"; } public User getUser() { return user; } public void setUser(User user) { this.user = user; } }
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%> <%@ taglib uri="/struts-tags" prefix="s"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>validate</title> </head> <body> <%--打印错误信息 --%> <font color="red"><s:fielderror></s:fielderror></font> <form action="${pageContext.request.contextPath}/validate/user_register" method="post"> <s:text name="user"></s:text><input type="text" name="user.name"> <s:text name="password"></s:text><input type="password" name="user.password"> <input type="submit" value='<s:text name="login"></s:text>'> </form> </body> </html>
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.5//EN" "http://struts.apache.org/dtds/struts-2.5.dtd"> <struts> <package name="validate" extends="struts-default" namespace="/validate"> <global-allowed-methods>register</global-allowed-methods> <action name="user_*" class="b_validate.UserAction" method="{1}"> <result>/success.jsp</result> <result name="input">/register.jsp</result> </action> </package> </struts>
package b_validate; public class User { private String name; private String password; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } }
- action类继承ActionSupport并重写validate方法 (validate()方法对当前Action下的所有方法都会有效!!!!)
- 用代码方式对action的指定方法进行验证
-
方式一中的验证方法名称改为 validate+需要验证的方法名称,只有此处与方式一不同,其他都相同。
例如: validateRegister() -> 只能验证register()方法
-
package b_validate; import com.opensymphony.xwork2.ActionSupport; public class UserAction extends ActionSupport { private User user; public void validateRegister(){ // 在这里写表单数据验证逻辑 if (user.getName() == null || user.getName().equals("")) { // 保存错误信息,显示错误信息 super.addFieldError("user.error.requried", "用户名不能为空"); } if (user.getPassword() == null || user.getPassword().equals("")) { // 密码为空 // 把错误信息放入错误信息Map集合 super.addFieldError("password.error.requried", "密码不能为空!"); } } public String register() throws Exception { String name = super.getText("user"); System.out.println("****" + name); return "success"; } public User getUser() { return user; } public void setUser(User user) { this.user = user; } }
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%> <%@ taglib uri="/struts-tags" prefix="s"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>validate</title> <style type="text/css"> ul, ul li{ display: inline; } </style> </head> <body> <%--打印所有错误信息 --%> <font color="red"><s:fielderror></s:fielderror></font> <form action="${pageContext.request.contextPath}/validate/user_register" method="post"> <s:text name="user"></s:text> <input type="text" name="user.name"> <s:fielderror fieldName="user.error.requried"></s:fielderror><br> <s:text name="password"></s:text> <input type="password" name="user.password"> <s:fielderror fieldName="password.error.requried"></s:fielderror><br> <input type="submit" value='<s:text name="login"></s:text>'> </form> </body> </html>
以上这两种方式都是使用代码在程序写死了!!!------->进行改进:
-
-
- 用xml配置方式对action的所有方法进行验证
- 编写一个xml文件,名称: Action文件名-validation.xml。 该xml文件必须放在Action文件的同一目录
-
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%> <%@ taglib uri="/struts-tags" prefix="s"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>validate</title> <style type="text/css"> ul, ul li{ display: inline; } </style> </head> <body> <form action="${pageContext.request.contextPath}/validate/user_register" method="post"> <s:text name="user"></s:text> <input type="text" name="user.name"> <s:fielderror fieldName="user.name"></s:fielderror><br> <s:text name="password"></s:text> <input type="password" name="user.password"> <s:fielderror fieldName="user.password"></s:fielderror><br> <input type="submit" value='<s:text name="login"></s:text>'> </form> </body> </html>
package b_validate; import com.opensymphony.xwork2.ActionSupport; public class UserAction extends ActionSupport { private User user; public String register() throws Exception { String name = super.getText("user"); System.out.println("****" + name); return "success"; } public User getUser() { return user; } public void setUser(User user) { this.user = user; } }
package b_validate; public class User { private String name; private String password; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } }
<?xml version="1.0" encoding="utf-8"?> <!DOCTYPE validators PUBLIC "-//Apache Struts//XWork Validator 1.0.2//EN" "http://struts.apache.org/dtds/xwork-validator-1.0.2.dtd"> <validators> <!-- 验证用户名 --> <field name="user.name"> <!-- type表示xwork中定义的可以使用的验证类型 (在/com/opensymphony/xwork2/validator/validators/default.xml中查看) --> <field-validator type="requiredstring"> <!-- 当出现错误时的提示信息 --> <message>用户名必须非空</message> </field-validator> </field> <!-- 密码验证 --> <field name="user.password"> <field-validator type="requiredstring"> <message>密码需非空</message> </field-validator> <!-- 4-12位字母或数字 --> <field-validator type="regex"> <!-- 注入正则表达式字符串 --> <param name="regexExpression">^[a-zA-Z0-9]{4,12}$</param> <message>密码需为4-12位字母或数字</message> </field-validator> </field> </validators>
<field-validator type="requiredstring"></field-validator>
中的type属性在下面的包中查看,
一般直接使用type="regex",直接如上述例子所示使用param标签注入regexExpression即可
- 用xml配置方式对action的指定方法进行验证
-
编写一个xml文件,名称: Action文件名-访问方法路径-validation.xml (例如:UserAction-user_register-validation.xml)
-
请求数据封装第三种方式补充说明
- 表单: name -> 基本数据类型: String name
- 表单: user.name -> javabean数据类型: User user (User: String name)
- 表单: name -> javabean数据类型: User user (User: String name) (使用模型驱动方式)这样可以前两种方式的优点,表单可以不用改变名字,后台又可以使用javaBean进行封装。
模型驱动:
action实现ModelDriven接口,后面泛型进行约束,只能封装同一个类型对象
package c_modelDriver; import com.opensymphony.xwork2.ActionSupport; import com.opensymphony.xwork2.ModelDriven; /** * 使用模型驱动获得请求数据 * * @author claire * */ public class UserAction extends ActionSupport implements ModelDriven<User> { // 注意:使用模型驱动的方式,存放数据的模型引用不能为空,之后不需要user的set,get方法 private User user = new User(); /** * 该方法可以把值栈种的请求参数封装到User对象中 */ @Override public User getModel() { // TODO Auto-generated method stub return user; } public String register() throws Exception { System.out.println(user); return "success"; } }
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%> <%@ taglib uri="/struts-tags" prefix="s"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>model</title> </style> </head> <body> <form action="${pageContext.request.contextPath}/model/user_register" method="post"> <s:text name="user"></s:text> <input type="text" name="name"> <s:text name="password"></s:text> <input type="password" name="password"> <input type="submit" value='<s:text name="login"></s:text>'> </form> </body> </html>