<"/>
我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Struts2学习笔记(3)--输入校验

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Struts2学习笔记(3)--输入校验

Struts2学习笔记(3)--输入校验
输入校验
=====================================
1.register.jsp

<%@ taglib prefix="s" uri="/struts-tags" %>
<from action="register.action" method="post">
 <s:fielderror></s:fielderror>   用于显示错误信息
 用户名:<input type="text" name="username"/><br/>
 密码:<input type="password" name="password"/><br/>
 确认密码:<input type="password" name="repassword"/><br/>
 年龄:<input type="text" name="age"/><br/>
 生日:<input type="text" name="birthday"/><br/>
 毕业时间:<input type="text" name="graduation"/><br/>
 <input type="submit" value="提交"/>
 <input type="reset" value="重置"/>
</form>
 
=====================================
2.action
public class RegisterAction extends ActionSupport {
 private String username;
 private String password;
 private String repassword;
 private int age;
 private Date birthday;
 private Date graduation; //毕业时间
 //setter...getter...
 @Override
 public String execute() throws Exception {
  return SUCCESS;
 }
}

======================================
3.success.jsp
 用户名: ${ requestScope.username } <br/>
 密码:  ${ requestScope.password } <br/>
 确认密码: ${ requestScope.repassword } <br/>
 年龄:  ${ requestScope.age }  <br/>
 生日:  ${ requestScope.birthday } <br/>
 毕业时间: ${ requestScope.graduation } <br/>
 
=======================================
4.struts.xml
<package name="struts2" extends="struts-default">
 <action name="register" class="com....action.RegisterAction" >
  <result name="success">/success.jsp</result>
  <result name="input">/register.jsp</result>
 </action>
</package>
如果系统发现输入的数据类型有错误的话,就自动到配置文件中找input对应的页面,
如果找不到,则报错。

=======================================
5. 校验

在Action中重写validate()方法,ActionSupport的该方法来自于Validateable接口
struts构架会去找所有实现了Validateable接口的类,然后找到validate()方法进行验证
客户端发出请求后,首先会进入validate()方法校验,成功后进入execute()方法
@Override
public void validate() {
 if( username == null || username.length() < 6 || username.length() > 10 ) {
  //调用这个方法,将把信息包含到一个域里面,页面通过<s:fielderror>标签输出域里所有的信息
  this.addFieldError("username","username invalid");
                  //匹配页面字段名    输出信息
 }
  ......

  if(null != birthday && null != graduation) {
  Calendar c1 = Calendar.getInstance();
  c1.setTime(birthday);
   
  Calendar c2 = Calendar.getInstance();
  c2.setTime(graduation);
   
  //如果生日不在毕业时间前面
  if(!c1.before(c2)) {
   this.addFieldError("birthday","birthday should be before graduation");
  }
 }
}
【初步完成】
=======================================
遇到类型转换错误的时候(也就是说不能进行类型转换),struts2框架自动生成一条错误信息,并且将该错误信息放到addFieldError里面
流程
1. 首先Struts2对客户端传来的数据进行类型转换
2. 类型转换完毕后再进行输入校验
3. 如果类型转换和输入校验都没有错误发生,那么进入execute方法(调用商业逻辑)

注:如果类型转换不成功,也同样要进行输入校验
 
 
=======================================

替换Struts2自动产生的错误信息
=======================================

@@@@@@@@@@@@@@@@@@@@@@@@
  【全局的输入校验】 ----
@@@@@@@@@@@@@@@@@@@@@@@@
struts.xml
<include> 用于包含其他的配置文件
<constant> 在struts框架里使用的常量,这些常量就会替换掉struts中内置的常量
=====替换系统默认的错误信息=====
《1》
<struts>                默认的国际化的资源文件        指定自己定义的资源文件为message.properties
 <constant name="struts.custom.i18n.resources" value="message"></constant>
 <package> ...
 ...
</struts>
《2》
message.properties文件要放在classes下,也就是项目的class="lazy" data-src目录下,同struts.xml目录
内容:
                固定的
 ___________|_____________     错误信息
|                                      |      |
xwork.default.invalid.fieldvalue={0} error
                                            |
                                  表单属性的名字
表示:
当哪个字段发生错误的时候,显示那个字段的名字 和 错误信息

=======================================

@@@@@@@@@@@@@@@@@@@@@@@@@
   【局部的输入校验】
@@@@@@@@@@@@@@@@@@@@@@@@@
要求资源文件要和需要验证的action类在同一个目录下
如:对com....action.RegisterAction进行验证
需要在com....action下创建和Action相同名字的资源文件:RegisterAction.properties
=====替换系统默认的错误信息=====

RegisterAction.properties
内容:
       固定的
 ________|________
|                   |
invailid.fieldvalue.age=age conversion error
                        |   |________________|
                  属性名          |
                               错误信息
表示:
当年龄发生“类型转换”错误的时候,显示age conversion error这个错误信息

=======================================

如果类型转换错误的话,Struts自动将int类型设置成0,将对象类型设置成null
=======================================
 
 

#################################
  相关问题----资源文件中的中文
#################################
jdk\bin\native2ascii.exe 可以将任何一个文件的字符集转换为Unicode
使用方式:
------------------
(1)串方式
------------------
需要转换的串:invailid.fieldvalue.age=年龄信息输入不正确
到cmd命令行,
d:\>native2acsii
invailid.fieldvalue.age=年龄信息输入不正确 【回车】
得到结果
invailid.fieldvalue.age=\ u5e74\ u9f84\ u4fe1...
Ctrl+C 终止
-------------------
(2)文件到文件方式
-------------------
到cmd命令行,
d:\>native2acsii test.txt test.properties
test.txt ---源文件
test.properties ---要转换到的文件
 
 

#################################
   相关问题----输入数据回填
#################################
当发生错误时,如果不使用struts的form标签,回到输入页面,以前输入的数据会消失
可以中EL表达是解决,如:
<input type="text" name="username" value="${username}" />
如果使用struts的form标签,将会自动回填输入信息
注:并且struts的form标签会自动生成一个表格
 
 
@@@@@@@@@@@@@@@@@@@@@@@@@
  输入校验------分类
@@@@@@@@@@@@@@@@@@@@@@@@@
错误校验的级别有2种:
1.Action级别的错误
 通过
 void addActionError(String errorMessage)、
 void addActionMessage(String message)
  方法完成
 actionError的信息实际上放在了一个ArrayList中
2.Field级别的错误
 通过
 void addFieldError(String fieldName, String errorMessage)
 方法完成
 fieldError的信息实际上放在了一个Map中,fieldName作为键,errorMessage作为值
 
----------------------------------------
1》
Action中
public void validate() {
 if( null == username || username.trim().length() < 1 ) {
  this.addActionError("username invalid");
 }
 if( null == password || password.trim().length() < 1 ) {
  this.addActionError("password invalid");
 } 
 ...
}
----------------------------------------
2》
struts的form标签已经内置的错误信息,但只内置的fieldError错误
在jsp的input页面可以通过添加 <s:actionerror/> 标签来显示actionError的信息
该标签将以列表的方式显示出所有的actionError信息
*** 更改错误信息的CSS :<s:actionerror cssStyle="color:red"/>     直接设置css代码
   <s:actionerror cssClass="errorCss"/>      引入一个css定义
---------
  补充1
---------
ValidationAware接口的boolean hasErrors()用于判断错误,返回false,表示验证错误
返回 hasActionError() 或者 hasFieldError()
当这两个方法中有一个为假,说明转换或验证是错误的,返回到input页面
hasActionError()是判断ArrayList,如果该list为空的话,表示验证通过
hasFieldError()是判断Map,如果该Map为空的话,表示验证通过
然后执行execute()方法

---------
  补充2
---------
theme : 主题 (simple | ajax | ...)
<s:textfield name="username" label="username" theme="simple" />
theme设置为simple时,该field将不在struts自动生成的表格中定义
这样的话,label将失效,并且不再在表单中显示错误信息
将<s:form ... theme="simple">
表单的所有field将不在自动生成表格,label将失效,不显示错误信息,会自动回填信息
可以将这些field根据需要添加到自己的表格中。
 
---------
  补充3
---------
在一个action中实现多个业务方法 对应于struts1的DispatchAction的操作
<action name="..." class="..." method="abc">
如果指定了method="abc",将会不在调用action中的execute(),而是调用abc()方法
abc()的写法与execute()相同
public String abc() throw Exception { .... }
----------------------
配置多个 action 的时候:
----------------------
struts.xml中
<action name="register" class="...RegisterAction">
 <result> ... </result>
 ...
</action>
<action name="addUser" class="...RegisterAction" method="add">
 <result> ... </result>
 ...
</action>
<action name="deleteUser" class="...RegisterAction" method="delete">
 <result> ... </result>
 ...
</action>
-----------
对应的,RegisterAction中
public String execute() throws Exception { .... }
public String add() throws Exception { .... }
public String delete() throws Exception { .... }
-----------
每个执行业务逻辑的方法都应对应不同的验证方法
          对应于
execute() ------> public void validate() { ... }
对于自定义的方法,可以写自定义的validate方法:validate + 对应的逻辑方法名
          对应于
add() ----------> public void validateAdd() { ... }
          对应于
delete() -------> public void validateDelete() { ... }

-----------
通过下面的URL调用:
[url]http://..../register.action[/url]
[url]http://..../addUser.action[/url]
[url]http://..../deleteUser.action[/url]
-----------
在有多个业务逻辑方法和验证方法时,
执行顺序:
validateAdd()-->validate()-->add()
不管有多少个验证方法,validate()总会被执行
解决策略:
不重写validate(),让他什么也不执行
用validateExecute()对execute()进行验证

【完成】

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Struts2学习笔记(3)--输入校验

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Struts2学习笔记(3)--输入校验

Struts2学习笔记(3)--输入校验 输入校验=====================================1.register.jsp<%@ taglib prefix="s" uri="/struts-tags" %><
2023-01-31

Python学习笔记整理3之输入输出、python eval函数

1. python中的变量: python中的变量声明不需要像C++、Java那样指定变量数据类型(int、float等),因为python会自动地根据赋给变量的值确定其类型。如 radius = 20,area = radius * ra
2022-06-04

DBA入职指南学习笔记3

1、数据库启动      加载参数文件(spfile、pfile)--nomount状态      加载控制文件(*.ctl)           --mount状态      加载数据文件、Redo log日志文件    ----open状态 2、实例  
DBA入职指南学习笔记3
2019-08-05

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录