通过实例学习Struts2 - 从struts-blank开始 (2)

struts2国际化-getText()方法 随着全球经济的一体化,软件开发者应该开发出支持多国语言、国际化的Web应用。对于Web应用来说,同样的页面在不同的语言环境下需要显示不同的效果。 i18n是国际化的简称来源是英文单词 internationalization的首末字符i 和n。18为中间的字符数。 那么,如果我们要设计一篇国际化的框架要怎么做呢? 1首先我们要先创建一个Web Project,           ... 阅读详情

最近发现一些网站在Copy&Paste我的文章, 请尊重我的劳动成果,在转载的时候注明出处,谢谢。

接上一篇 《通过实例学习Struts2  - 从struts-blank开始(1) 》

在Action中支持通配符

在example.xml 中,我们能看到这样的定义:

<action name="Login_*" method="{1}" class="example.Login">
            <result name="input">/example/Login.jsp</result>
            <result type="redirectAction">Menu</result>

 </action>

大胆的猜测一下,这个定义应该支持Login_execute, Login_test 等Action名称,  而method="{1}" 中的{1} 应该是 第一个通配符的值, 例如execute, test, 

也就是说要执行java 类Login 中的execute,input方法。

实验一下:http://localhost:8080/struts2-blank/example/Login_excute,   注意namespace 是/example

果然登录界面出现了:


再尝试一下http://localhost:8080/struts2-blank/example/Login_test , 报错了:

Exception:

java.lang.NoSuchMethodException: example.Login.test()

Stack trace:

        java.lang.NoSuchMethodException: example.Login.test()
	at java.lang.Class.throwNoSuchMethodException(Class.java:286)
	at java.lang.Class.getMethod(Class.java:845)
	at org.apache.struts2.interceptor.validation.AnnotationValidationInterceptor.getActionMethod(AnnotationValidationInterceptor.java:75)
	at org.apache.struts2.interceptor.validation.AnnotationValidationInterceptor.doIntercept(AnnotationValidationInterceptor.java:47)
	at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:98)
	at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:246)
	at com.opensymphony.xwork2.interceptor.ConversionErrorInterceptor.intercept(ConversionErrorInterceptor.java:138)
	at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:246)
	at com.opensymphony.xwork2.interceptor.ParametersInterceptor.doIntercept(ParametersInterceptor.java:239)
	at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:98)
	at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:246)
	at com.opensymphony.xwork2.interceptor.ParametersInterceptor.doIntercept(ParametersInterceptor.java:239)

还记得之前定义Global error page 吗, 很明显上面的界面是由error.jsp 渲染出来的,使用struts2提供的tag library ,很方便

<html>
<head><title>Simple jsp page</title></head>
<body>
    <h3>Exception:</h3>
    <s:property value="exception"/>

    <h3>Stack trace:</h3>
    <pre>
        <s:property value="exceptionStack"/>
    </pre>
</body>
</html>


ActionForm在哪儿?

在Struts1 中,是使用ActionForm 来封装从浏览器中来的数据,每个Action 都需要写一个ActionForm,, 用起来虽然比较麻烦,但是比较清晰。

在Struts2中,我们似乎并没有看到类似的概念,只看到在Action中的一些getter和setter方法,例如class Login 中的username,password

    private String username;    
    private String password;

 public String getUsername() { return username; }
public void setUsername(String username) { this.username = username; }
public String getPassword() { return password; }
public void setPassword(String password) { this.password = password; }
而在负责登陆的jsp中是这样的:

<s:form action="Login">
    <s:textfield key="username"/>  <--- 肯定是和class Login 中的username 绑定
    <s:password key="password" />  <--- 肯定是和class Login 中的password 绑定
    <s:submit/>
</s:form>

各位同学不妨试验一下,在setUsername,和setPassword 中加入一些System.out ,在控制台输出用户名和密码,看看(1) 什么时候调用 (2) 和界面是用户输入的关系


试验的结果会表明: 在Struts2中, Form 和 Action是混到一起了,Action中可以有实例变量,并且可以被框架自动赋值(当然是通过setter方法),至于通过getter暴露出的属性值,在jsp中可以引用。

既然Action中有实例变量,那就意味着Struts2会为每一个http request 创建一个新的Action实例(Struts1不是这样的),所以你不用担心线程安全问题


扩展思考: 为什么要混合ActionForm和Action?

 根据我在Struts1中的开发体验,为每个Action开发一个ActionForm确实是一件不那么Happy的事情,需要额外的工作建立一个额外ActionForm的类, 并且这个类只能用在相关的Action上。

Struts2 则把Action和ActionForm合并为一了, 咋一看感觉比较乱,但用起来就会发现,确实是极大的减少了开发量,通过简单的getter/setter就能获取界面上的数据。

虽然在设计上看起来不够优雅和完美,但实用性十足,这就够了。

对于那些追求完美的同学, 我相信struts2 还是能支持ActionForm 的, 我们慢慢看。


如何做输入验证?

输入验证可能是Web application最基本的功能了, struts2 当然需要完美支持, 观察一下项目中的Login_validator.xml, 你能猜到什么?

<validators>
    <field name="username">
        <field-validator type="requiredstring">
            <message key="requiredstring"/>
        </field-validator>
    </field>
    <field name="password">
        <field-validator type="requiredstring">
            <message key="requiredstring"/>
        </field-validator>
    </field>
</validators>
(1) 这是对两个field做验证,分别对应Login 中的username和password

(2) 验证器是requiredstring , 从字面意思来猜应该是这个field 是字符串类型,并且不能为空

(3) 如果验证失败,显示的出错消息是应该在resource文件中定义, 消息的key 是requriedstring

(4) 输入验证的配置文件,格式应该是<ActionName>_validator.xml ,  很明显,这个文件应该和Action 类是紧紧绑定的,应该放在同一个package下面。

我们来看一下前面提到的package.properties

requiredstring = ${getText(fieldName)} is required.
password = Password
username = User Name

其中的requiredstring 定义看起来比较奇怪 : ${getText(fieldName)} is required.

fieldName 应该就是当前要验证的filed的名称,例如"username", "password"

而getText() 应该是struts2提供的方法,估计是为了多语言处理的,如果当前的field 是"username" , 那么 getText(“username”) 在这个例子中就是“User Name”.

错误信息怎么显示?

验证失败,肯定要在jsp 中输入错误信息,这一点Struts2的tag library已经给我们封装好了, 当然是高度封装:

<s:form action="Login">
    <s:textfield key="username"/>
    <s:password key="password" />
    <s:submit/>
</s:form>

如果username 或者password没有输入, struts2就会在每一个输入域的上方显示错误消息。

注意  <s:textfield key="username"/>  用的是key = xxx , 你可以试一下 name=xxxx, 就可以发现 其中的奥秘:

使用key =xxx , 最终的html中既有label ,又有input field,  使用name=xxx,只会输出 input filed ,需要自己来写label 了。

扩展思考: 我只能通过xml文件类配置输入验证吗?

有时候确实需要复杂的基于业务逻辑的验证, 仅仅依靠xml是不够的

观察一下Login这个类, 它最终扩展了ActionSupport ,这个类有很多和验证相关的方法,例如addFieldError (),validate()等等,我们尝试一下在class Login中覆盖validate方法:

public void validate(){
    	if(!"andy".equals(getUsername())){
    		addFieldError("username",getText("user.incorrect"));
    	}
    	if(!"pass4andy".equals(getPassword())){
    		addFieldError("password",getText("password.incorrect"));
    	}
    }

当然要记得在package.properties 新添加两个message

user.incorrect=User name is not correct

password.incorrect=Password is not correct

试着登陆一下,你就会发现我们的validate开始工作了,是不是很easy ?


今天到此为止,明天来看看国际化怎么做



struts2-blank.war 这里上传的是struts-2.3.37-all里面的空白模板struts2-blank,解压后里面有Struts2运行所需要的基础jar包 立即下载

相关推荐

1173:阶乘和

1173:阶乘和 时间限制: 1000 ms 内存限制: 65536 KB 提交数: 6010 通过数: 3049 【题目描述】 用高精度计算出S=1!+2!+3!+…+n!(n≤50),其中“!”表示阶乘,例如:5!=5×4×3×2×1。 输入正整数n,输出计算结果S。 【输入】 一个正整数n。 【输出】 计算结果S。 【输入样例】 5 【输出样例】 153 思路: ...

zqhf123的博客 1260

sturts 2的getText用法

[code="jsp"][/code] [code="struts.properties"] #该常量指定Struts 2应用所需要的国际化资源文件 struts.custom.i18n.resources=propertieName [/code] [code="propertieName.properties"] name=... [/code]...

翔飞 250

电压抬升电路设计

一、实验目的 掌握集成运放电压放大电路设计基本方法。 掌握基本仪器使用方法(电源、信号发生器、示波器)。 二、实验内容及结果 实验内容 基于集成运放设计一传感器信号采集电路。传感器输出信号在±50mV,频率为100Hz以内,模数转换器允许输入电压在0~5V,要求设计传感器与模数转换器之间的信号采集电路,实现传感器信号放大10倍,并适合模数转换器的输入。模数转换器的输入电阻为1KHz,设计电路时,可使用1KHz电阻作为信号采集电路负载,代替模数转换器。 实验具体要求如下: (1)确定电路形式,说明电压转

Safaearth的博客 4万+

Struts2国际化

 一:简单理解     国际化简称i18n,其来源是英文单词 internationalization的首末字符i 和n。18为中间的字符数。     随着全球经济的一体化,软件开发者应该开发出支持多国语言、国际化的Web应用。对于Web应用来说,同样的页面在不同的语言环境下需要显示不同的效果。     国际化文件的命名规则:           1、基本名.properties 如:me...

weixin_34367257的博客 172

特斯拉 Model 3解析(八)全面拆解特斯拉自动驾驶大脑:AP控制器硬核技术解析

算力极限:双FSD = 144 TOPS,专为AI推理优化。存储架构:LPDDR4 + NAND + NOR,保证高速/可靠启动。通信架构:以太网传视频,CAN传控制,TSN保障实时性。感知输入:多路摄像头 + 高速SerDes,满足全景感知。电源设计:功率模块+被动元件海洋,稳定性优先。功能安全:双芯片冗余 + GPS + 紧急呼叫,容错率极高。🎯 在我看来,特斯拉AP控制器就是一台“车载超算”,它在电源设计、存储架构和功能安全上远超一般新势力方案。

weixin_43199439的博客 1440

生物信息学投稿避坑指南:如何根据影响因子和审稿速度选择最适合的期刊

本文为生物信息学研究者提供全面的期刊投稿策略,重点解析影响因子、审稿速度等关键指标,帮助选择最适合的期刊。涵盖算法开发类和应用型研究的投稿路径,分析不同出版社特点及开放获取的利弊,并提供投稿全流程优化建议,助力高效发表研究成果。

weixin_42652674的博客 378

再次认识Struts2(三)

Struts2国际化 同一款软件 可以为不同的用户 提供不同语言界面 需要一个语言资源包 (里面有properties文件,每个properties文件针对每一个语言)通过java程序根据来访者语言,自动读取不同的properties文件 资源包命名规则:基本名称_语言(小写)_国家(大写).properties 如  messages_zh_CN.properties        me

Slark的博客 322

数字IC后端设计实现OCC(On-chip Clock Controller)电路介绍及时钟树综合案例

数字IC后端设计实现OCC(On-chip Clock Controller)电路介绍及时钟树综合案例

weixin_37584728的博客 4735

Struts2输入校验

由于Struts2框架总是把用户的输入信息封装到Action的属性中,所以若果要进行输入校验

秋水の歌的专栏 610

NVIDIA Jetson Orin系列 - 使用SDK Manager安装JetPack全流程解析

本文详细解析了使用NVIDIA官方SDK Manager为Jetson Orin系列开发板安装JetPack系统的完整流程。从环境准备、设备进入恢复模式,到SDK Manager图形化界面的分步操作指南,提供了新手友好的全流程解析,并分享了安装后的验证方法及常见问题解决方案,帮助开发者高效搭建稳定的边缘AI开发环境。

nn3456的博客 406

Google Earth Engine:LandTrendr (Landsat Collection 2)全更新使用(代码调用+UI交互)

本文介绍了使用Landsat Collection 2进行连续变化监测的分析方法,包含代码实现和可视化界面两部分。代码部分通过Google Earth Engine平台运行LandTrendr算法,设置参数包括时间范围、光谱指数、变化检测阈值等,最终生成变化幅度和检测年份的可视化图层,并将结果导出至Google Drive。可视化界面部分展示了基于LandTrendr的土地覆盖变化结果,结合Landsat影像进行分析。整个方法实现了从数据处理到结果展示的完整流程,适用于森林覆盖等环境变化监测。

此星光明博客 211

通过实例学习Struts2 - 从struts-blank开始 (1)

前言 一直用Struts1 , 现在新的项目要转向Struts2了, 先研究学习一下,做点技术储备。 我一直认为计算机软件行业是一个实践性非常强的行业,书读了多少都不管用, 一定要卷起袖子,亲自动手,才能学到一门技术的精髓,才能谈得上精通。 否则浮在表面,只懂概念,夸夸奇谈,一进入真正的项目就傻眼了。 但是自己完全从零开始来学习一个技术还是太慢了,一定要找到一个切入点, 就像打仗一样,

Be yourself and Beyond yourself 1万+

华为OD机考双机位C卷 - 补种未成活胡杨 (Java & Python& JS & C/C++ & GO )

华为OD机考双机位C卷 - 补种未成活胡杨(OD上机考试双机位C卷)。提供在线OJ刷题。Java、C++、Python、GO语言、C语言、JavaScript题解,并提供完整思路讲解。

算法大师! 2418

通过实例学习Struts2 - 从struts-blank开始 (3)

接上一篇《通过实例学习Struts2 (2)》 国际化 国际化通俗点讲就是支持多语言,在Struts2中我们要解决两个问题 1. 如何告诉Struts2 当前的Locale 是什么 2. Struts2是如何寻找不同Locale的resource文件的 设置Locale 在我们的struts-blank 项目中,HelloWorld.jsp中有这样的代码: La

Be yourself and Beyond yourself 4045

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

struts2原文件struts2-blank.war学习

最近又在学习SSH框架,不间断的学习让自己对各个单独的框架又有了进一步的学习。现在学习的是struts2的源文件,在此和大家一起分享。(其实源文件才是我们学习一手资料呢!) 1.   首先下载struts-2.3.4.1-all.zip ,版本都可以。 2.   解压,打开,我们看到有apps,docs,lib,src四个文件夹,见名知意,我就不翻译了。这里我只看了apps里面的内

keep innocent 3163

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

java struts2 例子_Struts2学习进阶(实例篇一)——struts2-blank-2.0.8实例学习

说明:本文经过笔者对struts2.0.8自带的实例struts2-blank-2.0.8学习而写,对该例子进行了部分修改,希望对广大象要学习struts2的朋友有所帮助。一.实例说明本例是Struts2的简单实例,通过本工程的学习,我们将会对struts2的表单以及表单验证有一个初步的认识、了解struts2的配置以及初探Struts2的本地化输出。二.编码准备1.包的引入在MyEclipse或...

weixin_29435115的博客 276

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

Struts2学习笔记(一) struts2的下载以及jar包的导入

一、struts2的下载 struts2下载地址:https://struts.apache.org 进入后点击download即可进入下载页面 在这里我们可以选择不同版本的struts2进入下载 下载时我们选择第一个,第一个中包括了下面所有的 这里我们以2.3.37版本为例,下载完成后我们对压缩包进行解压 二、struts2的基本jar包导入 在这之后我们就可以去创建一个Dynamic ...

showadwalker的博客 6448

使用嵌入式jetty在Eclipse中部署struts2示例程序struts2-blank

使用内嵌jetty在Eclipse中部署struts2示例

yangkunlin的专栏 1352

Struts2学习进阶(实例篇一)——struts2-blank-2.0.8实例学习

说明:本文经过笔者对struts2.0.8自带的实例struts2-blank-2.0.8学习而写,对该例子进行了部分修改,希望对广大象要学习struts2的朋友有所帮助。一.             实例说明 本例是Struts2的简单实例,通过本工程的学习,我们将会对struts2的表单以及表单验证有一个初步的认识、了解struts2的配置以及初探Struts2的本地化输出。二. 

1138

struts2初步学习路线

1,下载官网的struts2的程序包,下载那个all的包: http://struts.apache.org/download.cgi#struts233-SNAPSHOT 2,eclipse中新建一个web project工程,设置其中的相关参数: java jdk设置; server-tomcat的设置; 3,解压struts2包:struts-2.3.1.2-all.zip ,获得...

weixin_33733810的博客 137

MQTT over QUIC:移动弱网下如何让IoT长连接不再掉线

在物联网通信中,TCP长连接在移动切网和弱网环境下容易因IP变化而断开,导致设备离线、消息延迟。QUIC协议通过连接迁移和0-RTT机制,在传输层实现了连接身份与网络路径的解耦,能在网络切换后快速恢复会话,减少重连等待。MQTT over QUIC将这些特性与MQTT的会话恢复、QoS机制结合,能显著降低断线重连时延,避免遗嘱误触发,特别适合车联网、智能硬件、巡检等移动性强的IoT场景。本文从传输层协议原理出发,分析TCP在弱网下的困境,对比QUIC的连接迁移、快速握手及多流优势,并探讨落地架构与工程取舍,

weixin_34357928的博客 322

OFDM信号如何同时“说话”和“看东西”?深入浅出解析雷达通信一体化原理

本文深入解析OFDM雷达通信一体化技术,揭示其如何通过子载波和时频转换实现通信与雷达功能的完美结合。探讨了系统同步、匹配滤波等关键技术,并介绍了GNU Radio与USRP在软件定义无线电中的实际应用,为雷达通信系统设计提供实用指导。

weixin_33695450的博客 575

struts2-blank

说明:本文经过笔者对struts2.0.8自带的实例struts2-blank-2.0.8学习而写,对该例子进行了部分修改,希望对广大象要学习struts2的朋友有所帮助。 一.             实例说明  本例是Struts2的简单实例,通过本工程的学习,我们将会对struts2的表单以及表单验证有一个初步的认识、了解struts2的配置以及初探Struts2的本地化输出。 二.

a468903507的专栏 749
上一篇: 通过实例学习Struts2 - 从struts-blank开始 (1)
下一篇: 通过实例学习Struts2 - 从struts-blank开始 (3)
Andy
博客等级 码龄26年 115粉丝 31原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值