校验浅谈

本文深入探讨了Struts2输入校验的原理与实践,包括手动输入校验、配置XML文件使用校验框架、使用校验注解等方法,以及类型转换与校验流程。详细解释了如何在Struts2框架中实现输入数据的有效性校验与错误提示,以及如何通过校验框架减少服务器端负载。
 

在Web应用程序中,为了防止客户端传过来的数据引发程序的异常,我们需要对用户输入的数据进行校验。对用户输入数据进行校验分为两个部分:一是校验输入数据的有效性;二是在用户输入了无效的数据后向用户提示错误消息。
Struts2输入校验是建立在类型转换的基础之上,即先进行类型转换,再进行输入校验。它同时支持服务器端校验与客户端校验。客户端校验一方面可以为服务器端过滤数据,另一方面可以减少网络流量,降低服务器端程序的运行负载。服务器端校验除了要重复客户端的校验,还可以包括数据逻辑的校验,例如注册用户名是否重复、验证码是否匹配等。

Struts2输入校验的实现方式:
Ⅰ、编写Java代码进行手动输入校验
Ⅱ、配置XML文件使用校验框架
Ⅲ、使用校验注解

 

第一种方式:编写Java代码进行手动输入校验。

当使用Struts2框架提供的校验机制时,自定义的Action需要继承com.opensymphony.xwork2.ActionSupport。

1、在Action的execute()方法中进行校验
.........//省略了部分代码
this.addFieldError(String fieldName, String errorMessage)
.........//省略了部分代码
if(this.hasFieldErrors()){
 return INPUT;
}
.........//省略了部分代码


2、重写Action的validate()方法进行校验。
.........//省略了部分代码
this.addFieldError(String fieldName, String errorMessage)
.........//省略了部分代码

对校验提示消息国际化:
getText(资源文件中的key);
getText(资源文件中的key, 资源文件中value需要传递的参数值);

执行convertFromString方法。。。。。。。。
执行validate方法。。。。。。。。
执行execute方法。。。。。。。。

当执行完validate()方法后,如果校验通过就会调用execute()方法。此外用户可以自定义业务逻辑方法代替execute()方法。


3、使用自定义业务逻辑方法时,可以编写validateXxx()方法进行校验。

自定义业务逻辑方法时需要在struts.xml中配置action的method属性。例如action中自定义了myTest()方法,在struts.xml中配置如下:

<action name="register" class="com.struts2.action.RegisterAction" method="myTest">

当客户端向register.action发出请求之后,系统就会自动调用RegisterAction类的myTest()方法进行相应的业务逻辑处理。因此在一个action中可以处理多个业务逻辑。

当action中封装了不同的业务逻辑方法时,对不同的业务逻辑方法可以提供不同的校验规则,Struts2支持这种机制的实现。校验方法的命名规则:

校验方法以validate开头,加上对应业务逻辑方法的方法名,方法名的第一个字母大写。

例如:action中有一个业务逻辑方法是myTest(),则可以对应的提供一个validateMyTest()方法对其进行校验。

validateXxx()方法是由DefaultWorkFlowInterceptor拦截器(已包含在defaultStack拦截器栈中)调用的。


4、类型转换与输入校验的流程
执行convertValue()方法........类型转换
执行validateMyTest()方法......相应业务逻辑方法的校验
执行validate()方法............父类中的校验
执行myTest()方法..............执行业务逻辑方法

(1)、类型转换器负责对字符串的请求参数执行类型转换(type conversion),并将这些值设置成action的属性值;

(2)、在转换过程中若出现类型转换错误,则将错误消息保存到ActionContext中,conversionError拦截器将消息封装到fielderror中;
 
(3)、类型转换完成后再进行输入校验,输入校验时通过反射调用validateXxx()方法;

(4)、然后调用validate()方法;

(5)、如果校验未出现错误,则转入用户请求的处理方法(比如execute()方法、myTest()方法);如果出现错误,则转入input视图所指定的页面(所以,对于校验的方法必须要在配置文件中为其指定input result)。

【注意的几点】
a:如果类型转换错误,同样会进行输入校验。

b:遇到类型转换错误的时候(也就是说不能成功进行类型转换),Struts2框架会自动生成一条错误消息,并且将该错误消息放到fielderror中。

c:当把错误消息存放在fielderror中,如果使用的是HTML form,则需要在input视图所指定的页面中添加<s:fielderror/>标签;如果使用的是Struts2 form标签,并且form中的theme属性为xhtml(默认值),则无需添加<s:fielderror/>标签。当把错误消息存放在actionerror中时,不管使用的是何种form表单,都需要在input视图所指定的页面中添加<s:actionerror/>标签。

d:当action中提供了validate()方法时,不管有没有其它的校验方法,validate()方法都将会执行。

e:如果不需要每次都执行validate()方法,而又要保证execute()方法也有对应的校验方法,可以在action中删除validate()方法,提供validateExecute()方法。


5、actionerror、actionmessage和fielderror标签
actionerror:输出action级别的错误消息 <s:actionerror>
actionmessage:输出action级别的一般性消息 <s:actionmessage>
fielderror:输出action中全部字段或者指定字段的错误消息 <s:fielderror>
<s:fielderror fieldName="fieldName"/>
<s:fielderror><s:param value="'fieldName'"/></s:fielderror>


6、关于Struts2中form标签的theme(主题)属性:

(1)、form标签的theme属性用于设置Struts2中form的主题,默认为xhtml,还包括simple和ajax。

theme=xhtml时:默认会额外生成table、tr、td。

theme=simple时:会生成标签所对应的html标签形式。

在默认情况下,表单元素是分布在不同行的。如下代码:

<s:form action="login">
    <s:textfield name="username" label="用户名"/>
    <s:password name="password" label="密码"/>
    <s:submit label="提交"/>
</s:form>

以上的代码跟HTML代码差不多,但是因为Struts2表单默认将表单内的每一个元素都分在单独的一行,label属性就如同我们HTML中在<input type="text"/>前面的文字标签一样。如果我们不想让它自动换行,那就应该写成如下格式:

<s:form action="login" theme="simple">
    <s:textfield name="username" label="用户名"/>
    <s:password name="password" label="密码"/>
    <s:submit label="提交"/>
</s:form>

但在设置theme="simple"后,表单元素的label属性将失效,这时我们就需要在表单元素前面加入要显示的文字。如下代码:

<s:form action="login" theme="simple">
      用户名:<s:textfield name="username" label="用户名"/><br/>
      密码:<s:password name="password" label="密码"/><br/>
    <s:submit label="提交" value="提交"/>
</s:form>

此时不会显示label属性的值,而是显示表单元素前面的文字。提交按钮如果没有指定value属性则显示它原来的默认值:Submit。

(2)、修改form标签theme属性值的两种方法:

在html页面中使用Struts2的UI(User Interface,用户界面)tag时一般可把theme设置为simple。如果在每个tag都如此设置比较麻烦,此时可以采用以下两种方法修改theme属性的默认值:

①:在struts.xml文件中修改struts.ui.theme的默认值:<constant name="struts.ui.theme" value="simple"/>

②:在类路径下面新建struts.properties,并添加如下内容:struts.ui.theme=simple

或者将struts-core*.jar文件中的template解压出来,然后把它放到项目的WEB-INF下,在struts.properties添加以下内容:
struts.ui.theme=simple
struts.ui.templateDir=WEB-INF/template
修改simple下的fielderror.ftl文件,将该文件中的<li>和</li>删除。


7、类型转换错误提示消息与表单输入校验提示消息同时出现的问题:

将Struts2中form标签的theme属性值设为simple,从actionerror中获取提示消息。

### 串口通讯协议设计规范与最佳实践 #### 设计规范 串口通信作为一种常见的数据传输方式,在硬件和软件层面都需要遵循一定的设计规范,以确保系统的可靠性和稳定性。 1. **波特率设置** 波特率决定了每秒传输的数据位数。为了保证双方设备之间的同步性,必须严格匹配波特率参数[^2]。通常情况下,常用的波特率为9600、115200等标准化数值。 2. **数据帧结构** 数据帧由起始位、数据位、奇偶校验位(可选)、停止位组成。具体配置如下: - 起始位:固定为低电平,表示一帧数据的开始。 - 数据位:一般为7到8位,取决于实际需求。 - 奇偶校验位:用于检测传输错误,可以选择无校验、奇校验或偶校验。 - 停止位:高电平持续时间,可以是一倍或多倍于比特周期。 3. **超时机制** 在长时间未接收到有效数据时,应引入超时机制来防止死锁现象的发生。这可以通过定时器实现,并结合事件驱动模型提升程序响应效率[^1]。 4. **流控策略** 实现软硬件握手功能非常重要。常用的方法包括XON/XOFF字符控制或者RTS/CTS信号线管理流量方向及速率调整。 #### 最佳实践 除了基本的设计原则之外,还有一些经过验证的最佳实践经验可以帮助优化整个过程: 1. **CRC校验增强可靠性** 循环冗余检验(CRC)算法被广泛应用于保障消息完整性方面。特别是在噪声环境较为恶劣条件下尤为必要[^2]。 2. **采用异步模式减少耦合度** 使用UART这样的通用异步接收发送装置(UART),可以在不依赖外部时钟源的前提下完成高效的信息交换操作[^4]。 3. **模块化编码提高维护便利性** 将复杂的逻辑分解成独立的功能单元分别处理,比如初始化函数单独封装;读写操作各自定义接口形式等等做法均有利于后期升级迭代工作开展顺利进行下去。 4. **充分考虑边界条件测试覆盖范围广** 对极端情况下的行为表现给予特别关注,例如缓冲区溢出保护措施安排合理与否直接影响整体性能指标达成效果如何评估等问题都要仔细考量清楚才行。 ```python import serial from time import sleep def init_serial(port='/dev/ttyUSB0', baudrate=115200, timeout=1): ser = serial.Serial( port=port, baudrate=baudrate, parity=serial.PARITY_NONE, stopbits=serial.STOPBITS_ONE, bytesize=serial.EIGHTBITS, timeout=timeout ) if not ser.is_open: raise Exception(f"Failed to open {port}") return ser def send_data(ser, data): try: ser.write(data.encode()) sleep(0.1) # Allow some delay for transmission except Exception as e: print(e) def read_response(ser): response = "" while True: byte = ser.read().decode('utf-8') if not byte or byte == '\n': break response += byte return response.strip() ``` 以上代码片段展示了如何利用Python中的`pyserial`库创建一个简单的串口通信应用程序实例。其中包括了端口打开、数据发送以及响应读取等功能部分演示说明[^2]。 #### 标准参考 不同领域可能会有不同的特定要求和技术规格书可供查阅学习借鉴之处很多。例如工业自动化场景下经常涉及到Modbus RTU/TCP协议栈构建任务就需要参照官方文档指南执行相应步骤动作序列组合起来形成最终解决方案成果展示出来供大家交流讨论共同进步成长壮大队伍规模扩大影响力范围延伸出去影响更多人群受益匪浅值得推荐尝试一下看看效果怎样再做进一步改进完善细节方面的不足之处加以弥补修正过来达到预期目标为止结束本次话题分享环节谢谢大家的支持配合共同努力创造美好未来前景无限光明灿烂辉煌明天等着我们一起去开创属于自己的传奇故事篇章吧! ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值