昨天通过一个简单的实例程序完成了Struts2的基本功能,但是昨天的那个程序那是相当的丑陋哇,前台部分代码量多不说,还都没加验证,输入用户名密码的地方留空点提交他也木有提示直接验证了,哎,作为一个程序员,怎么能忍受这样滴代码呢?而且现在软件国际化趋势明显,你的程序仅仅支持简体中文出门你都不好意思跟别的程序员打招呼,要是支持上英语、法语、韩语、日语、阿拉伯语、土耳其语……¥#&……*你瞧,倍儿有面子吧!
好啦,依然废话不多说,我们用代码说话。我们将昨天的登录页(index.jsp)使用Struts2中的标签进行改写,改写后的结果如下:
login.jsp
1: <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
2: <%@ taglib prefix="s" uri="/struts-tags" %>
3:
4: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
5: <html>
6: <head>
7: <title>My JSP 'login.jsp' starting page</title>
8: </head>
9:
10: <body>
11: <s:form action="Login">
12: <s:textfield name="username" label="用户名"></s:textfield>
13: <s:textfield name="password" label="密码"></s:textfield>
14: <s:submit label="提交"></s:submit>
15: </s:form>
16: </body>
17: </html>
大家可以看出,无非就是引入了一个taglib,并将表单啊,文本域啊按钮啊全部改写成了Struts2中的标签,怎么样,是不是简洁了不少?嘿嘿,这里只体现出了标签的一个优势,接下来,我们给昨天的登录页增加一个验证功能——若用户输入为空,则给出错误提示,禁止用户提交。在Struts2中,我们有两种方法来实现这种功能,1)实现validate()方法 2)编写验证脚本(*-validation.xml)。要注意的是,无论使用哪种验证方法,我们都必须让我们编写的Action基础ActionSupport父类对象。不然验证会出错的哟~~
在这里,我们着重说下方法2,毕竟这是我们在实际项目中会常常用到的方法,而且因为其验证字符串写于配置文件中,想要修改验证规则的时候,仅仅需要修改配置文件中的规则即可。
LoginAction-validation.xml
1: <?xml version="1.0" encoding="UTF-8"?>
2: <!DOCTYPE validators PUBLIC "-//OpenSymphony Group//XWork Validator 1.0.2//EN"
3: "http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd">
4: <validators>
5: <field name="username">
6: <field-validator type="requiredstring">
7: <message key="user.required"/>
8: </field-validator>
9: </field>
10: <field name="password">
11: <field-validator type="requiredstring">
12: <message key="password.required"/>
13: </field-validator>
14: </field>
15: </validators>
怎么样,这个xml结构是不是非常清晰易懂?使用<filed>段标识我们需要进行验证的字段,使用<filed-validator>中的type字段指定我们需要进行何种验证,而<message>部分则定义了出错时如何显示信息。这里要注意的是,当你使用了Struts2中的验证器之后,你需要给Action增加一个input的映射,此映射应该指向我们最初提交动作发生的页面,如实例中的Login这个Action,我们需要将input指向我们的login.jsp页面。修改后的struts.xml文件如下:
1: <?xml version="1.0" encoding="UTF-8"?>
2: <!DOCTYPE struts PUBLIC
3: "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
4: "http://struts.apache.org/dtds/struts-2.0.dtd">
5: <struts>
6: <package name="struts2" extends="struts-default">
7: <action name="Login" class="com.kaisir.www.struts2demo.LoginAction">
8: <result name="success">/welcome.jsp</result>
9: <result name="error">/error.jsp</result>
10: <result name="input">/login.jsp</result>
11: </action>
12: </package>
13: </struts>
此时我们部署项目,并进行测试,会发现若不填用户名、密码,则系统会给出相应的提示。
小贴士:
当初实现验证的时候我以为不继承ActionSupport即可,但是发现不行,系统会报如下错误:
“严重: Validation error for password:password.required”
所以当你出现类似的错误时,应先检查是否忘记继承ActionSupport类。
说完了验证部分,我们来侃侃国际化部分,Struts2中对国际化的支持几乎是自动的,他会自动的检索你浏览器的首选语言,并按照首选语言来读取相应的语言文件。不说废话,上代码。
首先我们需要完成语言文件,在这里我以中文(zh_CN)及英文(en_US)作为实例语言,其语言文件如下:
messageResource_zh_CN.properties:
loginPage=u767Bu5F55u9875u9762
errorPage=u9519u8BEFu9875u9762
successPage=u767Bu5F55u6210u529F
failTip=u5BF9u4E0Du8D77uFF0Cu4F60u4E0Du80FDu767Bu5F55uFF01
successTip=u6B22u8FCE,{0},u4F60u5DF2u6210u529Fu767Bu5F55u3002
user.required=u7528u6237u540Du5FC5u586B
password.required=u5BC6u7801u5FC5u987Bu586Bu5199
username=u7528u6237u540D
password=u5BC6u7801
在这里,要注意的是,我使用了myeclipse编写配置文件,故他自动的将中文转义了,若是手动编写,需要手工调用native2ascii.exe文件来完成转义工作。
messageResource_en_US.properties
loginPage=LoginPage
errorPage=ErrorPage
successPage=SuccessPage
failTip=Sorry,You can't login in!
successTip=Welcome,{0},you has logged in!
user.required=Require Username!
password.required=Require Password!
username=Username
password=Password
光有语言文件还不够,我们还需要创建一个struts.properties文件来告诉Struts2我们有语言文件可用。
struts.properties
struts.custom.i18n.resources=messageResource
最后剩下的就是改写我们的jsp文件,让他调用语言文件了,主要使用<s:text name=””>这个标签~
login.jsp
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%@ taglib prefix="s" uri="/struts-tags" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title><s:text name="loginPage"/></title>
</head>
<body>
<s:form action="Login">
<s:textfield name="username" label="%{getText('username')}"></s:textfield>
<s:textfield name="password" label="%{getText('password')}"></s:textfield>
<s:submit label="提交"></s:submit>
</s:form>
</body>
</html>
要注意的是,在这里Struts2中不允许标签的嵌套,所以想要在textfield标签中嵌套国际化支持的标签是不行了,但是我们可以变通一下,毕竟国际化的字符串就像全局的资源,故可以使用”%{getText(‘name’)}”这样的形式来调用国际化文件 :)
Ok,部署到Web容器中,看看怎么样?
大过年的,也太努力了点。
也就过年放放假有时间系统的整理整理,别的时候哪有时间啊!