struts2.0学习笔记(一)

来源:互联网 发布:淘宝店铺宝贝上架时间 编辑:程序博客网 时间:2024/05/18 22:18

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 个标准字符串常量: SUCCESSNONEERRORINPUT 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加了几个我们经常在项目中用到的控件如:datepickerdoubleselecttimepicker      optiontransferselect等。没有自学到,不做介绍了

2、非UI
if
elseifelse 描述: 执行基本的条件流转。 参数: 名称必需默认类型描述备注testBoolean决定标志里内容是否显示的表达式else标志没有这个参数idObject/String用来标识元素的id。在UI和表单中为HTMLid属性,这儿没有作深入研究。

三、国际化

    我们通常为什么把国际化通称I18n?   数数国际化的单词 internationalization有几个字母?   20!   那头尾各是什么字母?   in!   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.propertiespackage_xx_XX.properties文件。这就适用于在包中不同类访问的资源;

使用Action范围的资源文件。做法为Action的包下新建文件名(除文件扩展名外)与Action类名同样的资源文件。它只能在该Action中访问。如此一来,我们就可以在不同的Action里使用相同的properties名表示不同的值。例如,在ActonOnetitle动作一,而同样用titleActionTwo表示动作二,节省一些命名工夫;

(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支持包括正则表达式验证,数据类型支持的有conversiondatedoubleemailexpressionfieldexpressionintregexrequiredrequiredstringstringlengthurlvisitor 

使用验证功能,需要在struts.xml中进行配置。同时Struts 2支持服务端和客户端验证。像Ajax验证。可以使用验证来达到检查空字段或是满足特殊要求的form表单的目的。很重要的一点是struts 2支持自定义验证。

         验证方法:

方法一Action类继承ActionSupport,重写validate()方法。该方法在执行execute()之前执行。在对应struts.xmlaction中添加需要验证的页面。如:以该笔记开始时的例子为例:

业务控制类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.jspstruts.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代表一个输入框fieldname属性值代表jsp页面中输入框的name值。

<s:form action="login">中增加validate="true"属性之后校验就不会再被提交到Action的时候才去进行了,而是客户端完成的,并没有提交到action中,减轻了服务器的负担。

客户端校验还支持以下几种校验:

requiredrequiredstringstringlength,regex,email,url,int,double

原创粉丝点击