1.ognl在struts2结构中的作用:
数据的流入和流出
数据类型转换
2.数据流入,流出过程中:
action中的值:值栈,parameter,action
值栈:a.struts2框架存数据的区域,有栈的特点:先进后出
b.action实例会被存放到值栈中
struts2存储数据的区域包括:
application,session ,VS值栈,request,attr,parameter
el表达式获得:${变量名}
struts2标签:<S:property >
OGNL访问值栈的过程:
a.按照从上到下的顺序
b.靠近值栈的同名属性会被读取。
例子:
type="chain" 不是type="redirectAction"
index.jsp---Loginaction中(name,pwe)------showaction(name,id)
---ok.jsp(显示name(showaction),pwd(Loginaction),id(showaction))
3.数据类型转换:内置数据转换器
时间类型:页面发送过来的字符串格式:yyyy-mm-dd;yy-mm-dd 都可以转成时间类型
---其他格式字符串发声异常。
boolean类型:页面发送过来的字符串格式,true--转成Boolean类型的true
---其他所有格式字符串--转成Boolean类型的false;
数组/集合类型:当页面发送过来的字符串中出现了同名的字符串,
在action中可以自动转换成数组和集合类型(泛型集合)。
4.自定义数据转换器:
1.jsp页面:
<form action="Login.action" method="post">
用户名:<input type="text" name="uname"/>
时间:<input type="text" name="usj"/>---如果输入的不是时间格式,使用内置数据转换器
会发送异常,需要自己编写自定义数据类型转换器
年龄:<input type="text" name="uage"/>
<input type="submit" value="提交"/>
</form>
2.action中:
private String uname;
private Date usj;----设置成Date类型:java.util.Date
private int uage;
///getter,setter方法正常封装
3.定义自动数据类型转换:
a.创建java类,继承 StrutsTypeConverter 抽象类:
b.现实两个方法:分别是数据的流入,数据的流出
---先定义一个数组,存储多种时间格式:
private static final DateFormat []dfs={
new SimpleDateFormat("yyyy-MM-dd"),
new SimpleDateFormat("yyyy/MM/dd"),
new SimpleDateFormat("yyyy年MM月dd"),
new SimpleDateFormat("yyyy.MM.dd"),
};
【数据流入:】
public Object convertFromString(Map arg0, String[] arg1, Class arg2) {
String str=arg1[0];
Date dt=null;
int i=0;
for(;i<dfs.length;i++){
try {
dt=dfs[i].parse(str);
break;
} catch (ParseException e) {
continue;
}
}
【当输入的字符串都不符合准备的时间格式,那么执行这个if结构】
if(i==dfs.length){
String ss=new SimpleDateFormat("yyyy-MM-dd")
.format(new Date());
try {
dt=new SimpleDateFormat("yyyy-MM-dd").parse(ss);
} catch (ParseException e) {
e.printStackTrace();
}
}
return dt;
}
【数据流出:条件要求页面中使用struts2标签显示数据时,才会调用流出方法】
public String convertToString(Map arg0, Object arg1) {
Date dt=(Date)arg1;
return new SimpleDateFormat("yyyy-MM-dd").format(dt);
}
4.在src目录下,定义文件xwork-conversion.properties。
---设置为全局范围内的数据,都使用自定义的转换器
java.util.Date=org.hdjd.util.ConverToDate
---所有action中的Date类型,都由org.hdjd.util.ConverToDate转换器负责!
5.
服务器端的错误信息显示:
1.页面使用struts2标签表单,有错误信息自动显示
2.普通的html标签,需要使用<s:fielderror>标签输出错误信息
---1.验证action中的普通属性:
A.action中添加方法:
//对流入到action中的数据进行验证:
public void validate() {
if(null==this.getUname()||this.getUname().length()==0){
addFieldError("uname", "用户名不能为空!");
}
}
b.跳转的页面:
1.页面使用struts2标签表单,有错误信息自动显示
2.普通的html标签,需要使用<s:fielderror>标签输出错误信息
----2.当数据类型转换错误时,怎么在页面上显示错误信息:
(1)页面使用struts2标签表单,有错误信息自动显示
xwork.default.invalid.fieldvalue="invalid.fieldvalue.xxx"
(2)自定义错误信息:
a。src目录下添加message.properties文件,
修改xwork.default.invalid.fieldvalue所对应的值
比如:xwork.default.invalid.fieldvalue=
\u5B57\u6BB5{0}\u7684\u503C\u65E0\u6548
b.在struts.xml中添加标签:
<constant name="struts.custom.i18n.resources" value="message"/>
---value值是多对应的资源文件名
数据验证:
1.为每一个独立的请求。编写对应的验证方法
a.在struts.xml中为每一个请求添加独立的方法:
<action name="login" class="org.ecjtu.action.LoginAction" method="dl">
<result>index.jsp</result>
<result name="input">index.jsp</result>
</action>
b.action中,为每一个独立处理方法,添加独立的验证方法。
例子:登录验证
public void validateDl() {
// TODO Auto-generated method stub
if(this.name.length()<3){
addFieldError("name", "用户名小于三位");
}if(this.pwd.length()<3){
addFieldError("pwd", "密码不能小于三位");
}
}
public String dl(){
this.mess="login success";
return SUCCESS;
}
例子2:注册验证
public void validateZc() {
// TODO Auto-generated method stub
if(this.pwd2==null||this.pwd2.equals("")){
addFieldError("pwd", "确认密码不能为空");
}if(!this.pwd.equals(this.pwd2)){
addFieldError("pwd", "密码不一致");
}
}
public String zc(){
this.mess="register success";
return SUCCESS;
}
总体验证:
@Override
public void validate() {
// TODO Auto-generated method stub
if(this.name==null||this.name.length()==0){
addFieldError("name", "用户名不能为空");
}if(this.pwd==null||this.pwd.equals("")){
addFieldError("pwd", "密码不能为空");
}
}
---------要求:如果处理方法名叫dl,那么他所对应的验证方法名叫vaildateDl();---d大写
----执行过程:先执行对应的验证方法,在执行公有的验证方法。
2.验证框架:不需要手动完成,验证代码,方便修改。
使用验证框架的原因:
验证规则复杂时,实现过程繁琐。
导致action代码臃肿。
验证框架
校验器类型 校验器名称 说明
必填校验器 required 字段不能为空
必填字符串校验器 requiredstring 字段值不能为空长度要大于0
整数校验器 int 字段的整数值的范围
字符串长度校验器 stringlength 字段值的长度的范围
正则表达式校验器 regex 字段是否匹配一个正则表达式
字段表达式校验器 fieldexpression 字段必须满足一个逻辑表达式
日期校验器 date 日期输入是否在指定范围内
双精度校验器 double 字段值必须是双精度类型
1.知道验器
2.使用验证框架的步骤
1).编写action
2).配置action
3).编写表单
4).编写验证文件和校验规则。
验证文件要与action放在同一个包下。
命名规则:
1.
2.
LoginAction-validation.xml-------验证文件。
<validators>
<fild name="name">
<field-validator type="requiredstring">
<param name="trim">true</param>----------满足条件,不显示message.
<message>用户名不能为空</message>
</field-validator>
<field-validator type="stringlength">
<param name="maxLength">6</param>
<param name="minLength">2</param>
<message>用户名长度须在${minLength}和
${maxLength}之间</message>
</field-validator>
</fild>
</validators>
国际化:
使程序在不做任何修改的情况下,可以在不同国家或地区和不同语言环境下,按照当地的语言和格式习惯显示字符。
本地化:
在一个国际化程序,当它运行在本地机器时,能够根据本地机器的语言和地区设置显示相应的字符。
3.国际化和本地化
1).配置struts.xml
配置资源文件的基名和地址
<constant name="struts.custom.i18n.resources" value="message"></constant>----value="资源文件名"
资源文件名
如:message.properties,message_zh_CN.properties,message_en_US.properties
2).在项目的src下添加资源文件。
3).使用。
如:<s:text name="name"/>------------name为资源文件所对应的名称。
<s:submit value="%{getText('submit')}"/>
<validators>
<field name="name">
<field-validator type="requiredstring">
<param name="trim">true</param>
<!--<message>用户名不能为空</message>-->
<message key="name.null"></message>
</field-validator>
<field-validator type="stringlength">
<param name="maxLength">6</param>
<param name="minLength">2</param>
<!--<message>用户名长度须在${minLength}和${maxLength}之间</message>-->
<message key="name.length"></message>---------------message中用key值,name.length为资源文件中的名称。
</field-validator>
</field>
</validators>