1.struts2.0基本配置所需要的包:
commons-logging-api-1.1.jar
freemarker-2.3.8.jar
ognl-2.6.11.jar
struts2-core-2.0.8.jar
xwork-2.0.3.jar
commons-fileupload-1.2.1.jar
2.配置web.xml
原理:struts2.0是通过一个过滤器来分发不同的请求,而不是通过一个servelt.
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>
3.在src目录底下配置struts.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<package name="struts2" extends="struts-default">
<action name="login" class="com.test.action.LoginAction">
<result name="success">/result.jsp</result>
<result name="input">/login.jsp</result>
</action>
</package>
</struts>
注意:struts.xml要建在src目录下。Action标签中name , class属性值还有转向的jsp页面根据自己所建而定。
(1).根据上面struts.xml配置文件为例:如果建一个登陆页面login.jsp.这个页面需要输入用户名和密码,然后登陆成功后转向result.jsp.失败后还返回login.jsp.那么在login.jsp页面上form标签需要这样写:
<form action="login">
username :< input type=”text” name="username" >
password :<input type=”text” name="password" >
<input type=”submit” value=”登陆”>
</form>
(2) 实现控制器类com.test.action.LoginAction
package com.test.action;
import com.bean.Point;
import com.opensymphony.xwork2.ActionSupport;
public class LoginAction extends ActionSupport {
String username;
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;
}
public String execute() throws Exception {
if(){
return "success";
}else{
return "input";
}
}}
实际上,Struts 2 下的控制器不再像 Struts 1 下的控制器,需要继承一个 Action 父类,甚至可以 无需实现任何接口,Struts 2 的控制器就是一个普通的 POJO。 Struts 2 的 Action 就是一个包含 execute 方法的普通 Java 类,该类里包含的多个属性用于封装用户的请求参数。
上面给出的类已经继承了com.opensymphony.xwork2. ActionSupport。返回值可以直接写为 return SUCCESS;类似的还有5 个标准字符串常量: SUCCESS、NONE、ERROR、INPUT 和 LOGIN,分别代表:
SUCCESS:表示Action操作成功
INPUT:表示验证没有成功
NONE:操作Action成功,不显示视图
ERROR:表示一个错误
LOGIN:没有执行成功
它们可以简化 execute 方法的返回值,并可以使用 execute 方法的返回值标准化。
二、struts2.0中标签的使用
1.写jsp页面的时候,在struts2中,用的是s标记,先引入标记:
<%@ taglib prefix="s" uri="/struts-tags"%>
2. struts2的标签分为两大类:非UI标志和UI标志。
(1).UI
UI 标志又可以分为表单UI和非表单UI两部分。表单UI部分基本与Struts 1.x相同,都是对HTML表单元素的包装。
比如:form的用法<s:form action="exampleSubmit" method="post" enctype="multipart/form-data">
<s:textfield label="姓名:" name="name" />
<s:submit />
<s:reset />
</s:form>
其中<s:textfield label="姓名:" name="name" /> name值表示在Action类中属性名字。
如:login.jsp可以更改为:
<s::form action="login">
<s:textfield name="username" label="名字"/>
<s:password name="password1" label="密码"/>
<s:submit name="submit" value="提交"></s:submit>
</s:form>
Struts 2.0加了几个我们经常在项目中用到的控件如:datepicker、doubleselect、timepicker、 optiontransferselect等。没有自学到,不做介绍了
2、非UI
if、elseif和else 描述: 执行基本的条件流转。 参数: 名称必需默认类型描述备注test是Boolean决定标志里内容是否显示的表达式else标志没有这个参数id否Object/String用来标识元素的id。在UI和表单中为HTML的id属性,这儿没有作深入研究。
三、国际化
我们通常为什么把国际化通称I18n呢? 你数数国际化的单词 internationalization有几个字母? 20个! 那头尾各是什么字母? i和n! 20-2=? 18! 所以称为I18n。
1.在SRC目录下新建一个struts.properties文件(功能是:加载资源文件)
struts.custom.i18n.resources=资源类别名称
如:struts.custom.i18n.resources=messageResource
创建编码标签文件messageResource.properties
第一种:创建中文的编码标签文件:messageResource_zh_CN.properties
其中(zh是语言代码,CN是国家代码)中文转码,右击文件属性,修改编码格式为“gbk”
messageResource.properties类文件,包含语言代码和国家代码,存放描述信息,其中一个键值对应一个功能键(即:键值对)
如:
regist.username=用户名
regist.password=密码
regist.submit=点击注册
打开“cmd”,切换到C盘根目录,其他盘也可,语法格式:字符编码转换:native2ascii 原文件 新文件名称 ;如输入:native2ascii messageResource.properties messageResource2.properties,回车即可。
上例native2ascii编译后为:
regist.username=/u7528/u6237/u540d
regist.password=/u5bc6/u7801
regist.submit=/u70b9/u51fb/u6ce8/u518c
第二种:创建英文的编码标签文件:messageResource_en_US.properties
修改当前语言(指当前系统语言):在控制面板-“区域和语言选项”-在“标准和格式”,选择“英语(美国)”确定,在浏览器上即可看到效果,可选择多种语言。
如:
regist.username=UserName
regist.password=PassWord
regist.submit=SubMit
2.访问资源
JSP中使用<s:text name="" />标签
如果Action中继承ActionSupport,可以使用getText(key)
表单元素的Label可以使用key属性。<s:textfield name="username" key="key的名字">
也可以<s:textfield name="username" label="%{getText(' key的名字')}"/>
3.占位符
如welcome=你好{0},现在是{1}!
JSP中在<s:text>中嵌套多个<s:param value="" ></s:param>子标签。
甚至更简单的,<s:text name="validation.required" value0="User Name"/>,使用value0,value1,value2等属性。
Action中使用getText(String key,List args)或者getText(String key,String[ ] args)
除此之外,还有一种替代占位符的方式,即在资源文件中使用EL表达式,如welcome=hello,${username}!
4. 不同范围的资源文件
包范围,package_语言_国籍.properties,注意不是包名。
action范围,action类名_语言_国籍.properties
临时指定,使用<s:i18n name="tmp" >做父标签。它的子标签将临时使用tmp_zh_CN.properties。
5. 业务控制器Action加载资源文件的顺序
资源文件查找顺序
之所以说Struts 2.0的国际化更灵活是因为它可以能根据不同需要配置和获取资源(properties)文件。在Struts 2.0中有下面几种方法:
(1).使用全局的资源文件。这适用于遍布于整个应用程序的国际化字符串,它们在不同的包(package)中被引用,如一些比较共用的出错提示;
(2).使用包范围内的资源文件。做法是在包的根目录下新建名的package.properties和package_xx_XX.properties文件。这就适用于在包中不同类访问的资源;
使用Action范围的资源文件。做法为Action的包下新建文件名(除文件扩展名外)与Action类名同样的资源文件。它只能在该Action中访问。如此一来,我们就可以在不同的Action里使用相同的properties名表示不同的值。例如,在ActonOne中title为“动作一”,而同样用title在ActionTwo表示“动作二”,节省一些命名工夫;
(3).使用<s:i18n>标志访问特定路径的properties文件。在使用这一方法时,请注意<s:i18n>标志的范围。在<s:i18n name="xxxxx">到</s:i18n>之间,所有的国际化字符串都会在名为xxxxx资源文件查找,如果找不到,Struts 2.0就会输出默认值(国际化字符串的名字)。
6.jsp加载资源文件的顺序
7. 用户自行选择语言
Struts 2.0为您提供了一个名i18n的拦截器(Interceptor),并在默认情况下将其注册到拦截器链(Interceptor chain)中。
它的原理为在执行Action方法前,i18n拦截器查找请求中的一个名为"request_locale"的参数。
如果其存在,拦截器就将其作为参数实例化Locale对象,并将其设为用户默认的区域(Locale),
最后,将此Locale对象保存在session的名为“WW_TRANS_I18N_LOCALE”的属性中。
四、输入验证
Struts 2的一个核心工程就是支持Validation(验证)。Struts 2支持包括正则表达式验证,数据类型支持的有conversion、date、double、email、expression、fieldexpression、int、regex、required、requiredstring、stringlength、url和visitor。
使用验证功能,需要在struts.xml中进行配置。同时Struts 2支持服务端和客户端验证。像Ajax验证。可以使用验证来达到检查空字段或是满足特殊要求的form表单的目的。很重要的一点是struts 2支持自定义验证。
验证方法:
方法一.Action类继承ActionSupport,重写validate()方法。该方法在执行execute()之前执行。在对应struts.xml的action中添加需要验证的页面。如:以该笔记开始时的例子为例:
业务控制类LoginAction.java更改为:
package com.test.action;
import com.bean.Point;
import com.opensymphony.xwork2.ActionSupport;
public class LoginAction extends ActionSupport {
String username;
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;
}
public String execute(){
return SUCCESS;
}
public void validate(){
if(username==null || username.trim().equals("")){
addFieldError("username", "用户名不能为空!");
}
if(password1==null || password1.trim().equals("")){
addFieldError("username", "密码不能为空!");
}
} }
给控制类重写validator方法。Login.jsp和struts.xml配置文件都不需要更改。Login.jsp提交表单后,会提交到LoginAction中,会首先调用它的validator方法。验证错误后,会自动返回INPUT,然后根据struts.xml配置文件,又会转到login.jsp页面,并在该页面上显示错误信息。如果验证没有错误,会调用execute方法。返回SUCCESS.最好转到resoult.jsp.
方法二.使用框架校验
在Action同目录下添加Action名—validation.xml,同时将第一种方法中LoginAction.java中的validator方法删除,再通过使用struts2已有的校验器来完成表单校验。如:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE validators PUBLIC "-//OpenSymphony Group//XWork Validator 1.0.2//EN" "http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd">
<validators>
<field name="username">
<!—必填字符串校验器 -->
<field-validator type="requiredstring">
<param name="trim">true</param>
<message >表单校验:用户名不能为空</message>
</field-validator>
<!—字符串长度校验器 -->
<field-validator type="stringlength">
<param name="minLength">4</param>
<param name="maxLength">10</param>
<message>框架校验:用户名称长度为${minLength}到${maxLength}之间</message>
</field-validator>
</field>
<field name="password1">
<field-validator type="stringlength">
<param name="minLength">4</param>
<param name="maxLength">20</param>
<message>框架校验:用户名称长度为${minLength}到${maxLength}之间</message>
</field-validator>
<field-validator type="requiredstring">
<message>框架校验:密码不能为空</message>
</field-validator>
</field>
<field name="password2">
<!—字段表达式校验器 -->
<field-validator type="fieldexpression">
<param name="expression">password1==password2</param>
<message>框架校验:两次输入密码不同!</message>
</field-validator>
</field>
<field name="birthday">
<!—日期校验器 -->
<field-validator type="date">
<param name="min">1990-01-01</param>
<param name="max">2009-01-01</param>
<message>框架校验:生日数据错误!</message>
</field-validator>
</field>
<field name="age">
<!—整数校验器 -->
<field-validator type="int">
<param name="min">10</param>
<param name="max">100</param>
<message>框架校验:年龄为${min}到${max}之间生日数据错误!</message>
</field-validator>
</field>
<field name="myHomepage">
<!—网址校验器 -->
<field-validator type="url">
<message>无效网址</message>
</field-validator>
</field>
<field name="myEmail">
<!—邮件地址校验器 -->
<field-validator type="email">
<message>非法的邮件地址</message>
</field-validator>
</field>
<field name="myField">
<!—类型转换校验器 -->
<field-validator type="conversion">
<message>类型转换错误</message>
</field-validator>
</field>
</validators>
一个field代表一个输入框,field中name属性值代表jsp页面中输入框的name值。
在<s:form action="login">中增加validate="true"属性之后校验就不会再被提交到Action的时候才去进行了,而是客户端完成的,并没有提交到action中,减轻了服务器的负担。
客户端校验还支持以下几种校验:
required,requiredstring,stringlength,regex,email,url,int,double