struts2学习笔记

Struts2 学习

1.strusts2概念

struts2是在webwork2基础上发展过来的。其优点:

① 在软件设计上Struts2没有像struts1那样跟Servlet API和Struts API有有着紧密的耦合,struts2的应用可以不依赖于servlet API和struts API.Struts2 这种设计属于无嵌入式设计,而Struts1这种设计属于嵌入式设计。

② Struts提供了拦截器,利用拦截器可以进行AOP编程,可以进行权限编程

③ Struts2提供了类型转换器,我么可以把特殊的请求参数转换成需要的类型

④ Struts2提供了多种表现层技术 如:jsp、freeMarke

⑤ Struts2的输入校验可以对指定方法进行校验,解决啦struts1的长久之痛

⑥ 提供了全局范围、包范围和action范围的国际化资源文件管理实现

2.搭建Struts2的开发环境

① 找到开发struts2应用需要使用到jar文件

② 编写struts2的配置文件(默认的配置文件struts.xml),改文件应放在WEB-INF/classes,开发中放在src文件夹里

③ 在web.xml中加入Struts2 MVC的框架启动配置(是通过filter启动的)如果struts2版本是2.1.3之前的则filter类是org.apache.struts2.dispatcher.FilterDispatcher,如果是往后的,则filter是org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter

 3.struts2中配置Struts.xml配置的包介绍

<package name="ali"namespace="/test" extends="struts-default">

    <actionname="helloword" class="" method=”execute”>

       <result name="sucess">/WEB-INF</result>

       </action>

</package>

在struts2框架中使用包来管理action,包的作用和java中的类包非常类似,主要用于管理一组业务功能相关的action.

配置包时必须指定name属性,改name属性值可以任意取名,但必须唯一,如果其它包要继承该包,必须通过该属性进行引用。包的namespace属性必须定义该包的命名空间,命名空间作为访问该包下action的路径的一部分,如访问上面的例子的Action,该访问路径为:/test/helloword.action.namespace属性可以不配置,如果不指定该属性,默认的命名空间是“”.

通常每个包都应该继承struts-default包,因为struts很多核心功能都是拦截器来实现。Struts-default包定义了这些拦截器和result类型。可以这么说,当包继承了struts-default才能使用struts2的核心功能。

4.Action名称的搜索顺序

默认的命名空间,就是属性里不配置namespace属性。

5.Action配置中的各项默认值

l  如果没有为action指定class,默认是Action Support

l  如果没有为action指定method,默认执行action中的execute()方法

l  如果没有指定result的name属性,默认值为success

6.Action中result的各种转发类型

<action name=”helloword” class=”具体Action路径”>

     <resultname=”success”>/WEB-INF/page/hello.jsp</result>

</action>

在result配置类似于struts1中的forward,但struts2中提供了多种结果的类型,常用的类型有:type=”dispatcher”(内部转向)或者redirect(重定向)、redirectAction(Action)、  plainText(原代码呈现)。

在result中还可以使用${属性名}表达式访问action中的属性,表达式里的属性名对应action中的属性。如下:<resulttype=”redirect”>/view.jsp?Id=${id}</result>

如果重定向的action在别的命名空间下:

<result type=”redirectAction”>

     <paramname=”actionName”>helloword</param>

     <paramname =”namespae”>/test</param>

</result>//需要配置另一个包的名字和空间域

一个package中的全局results<global-results></global-results>

为Action的属性注入值,在是在action中配置param如:

<action ....><param name=”xxx”>struts2</action>

需要在action中写上属性xxx,并有getXxx()和setXxx方法();

7.struts2常用的常量

上传文件大小是指上传文件的总的大小,而不是单个的大小。

8.struts2的处理流程

   用户请求

Struts内置的一些拦截器或者用户自定义

 

用户编写的action类

 

类似于struts1中的forward

 

 

 

 

 

 

 

 

 

 

 

 

 


StrutsPrepareAndExecuteFilter是struts2 框架的核心控制器,负责拦截有<url-pattern>/*</url-pattern>指定的所有用户的请求。

当用户请求到达时,该filter会过滤用户的请求。默认情况下,如果请求的路径不带后缀或者后缀以.action结尾,则请求将转入Struts 2框架处理,否则Struts2框架将略过请求的处理。Struts1不同,Struts2对用户的每一次请求都会创建一个action,所以Struts2中的action是线程安全的。

9.为引用指定多个struts配置文件

 

我们可以将一个struts.xml配置文件分解成多个配置文件,然后在struts.xml文件中包含其它配置文件,下面的struts.xml通过<include>元素指定多个配置文件。

<struts>

<include file=”struts-user.xml”>

</struts>

10.动态方法调用和使用通配符

禁止动态方法调用方法(一般建议不适用动态方法):

<constant name=”struts.enable.DynamicMethodInvocation” value=”false”>

使用通配符获取方法:例如:

<action name=”list_*” class=”类的路径” method={1}>//{1}就等于*代表的字符串

11.接收请求参数

采用基本类型接收请求参数(get/post

在Action类中定义与请求参数同名的属性,struts2便能自动接收请求参数并赋予给同名属性。例如:

请求路径:http://locahost:8080/test/view.action?id=78

Public class ProductAction{

Private Integer id;

//get和set方法,不再具体写

Public void setId()

{

 

}

Public void getId()

{

}

}

采用复合类型接收请求参数

Struts2 首先通过反射技术调用类的默认构造器创建类对象,然后通过反射技术调用对象中与请求参数同名的属性的getter方法来获取请求参数的值。

注意:struts2.1.6的版本,会出现参数信息乱码问题,2.1.8以后的版本里已经解决了这个问题。解决参数乱码问题,需要在struts2Filter之前在配置一个编码过滤器。

12.自定义类型转换器

Struts2有两种类型转换器:局部类型转换器和全部类型转换器

局部类型转换器:定义自己的转换器,继承DefaultTypeConverter父类,重写父类的ConvertValue(Map context,Object value,Class toType)方法

对类型转换器进行注册,在Action类的包下放置ActionClassName-conversion.properties文件,ActionClassName是action的类名。后面的conversion.properties是固定写法。

13.文件上传

Enctype=multipart/form-data(必须在上传文件中写)

解决大文件上传:

<constant name=”struts.multipart.maxSize”value=”填入的上传上限”>

多文件上传,要写多个文件上传框,name属性的名字要一致,而且在Action中要定义一个与name属性名字相同属性数组。

14.自定义拦截器

要自定义拦截器需要实现com.opensymphony.xwork2.interceptor.Interceptor接口。

如果想要拦截器继续执行Action中的方法,则用invocation.invoke()这个方法。(下面添加的东西,都是struts2.xml中进行操作)

在Struts.xml中注册拦截器:

<interceptorname="pression"class="com.baidu.struts2.interceptor.PermissonInterceptor"></interceptor>

注册拦截器类(目的是让Action也可以使用默认的拦截器):

<interceptor-stackname="pressionStack">

      <interceptor-refname="defaultStack"></interceptor-ref>

      <interceptor-refname="pression"></interceptor-ref>

</interceptor-stack>

在特定的Action中使用拦截器:

<interceptor-refname="pressionStack"></interceptor-ref>

为一个包指定默认的拦截器:

<default-interceptor-refname="pressionStack"></default-interceptor-ref>

如果为某个action显示的指定了一个拦截器,则这个拦截器会替代默认的拦截器。如果还想用默认的拦截器,则应该也要显示的指定默认的拦截器(且放在另一个拦截器之前)。

15.输入校验

在struts2中,我们可以实现对action的所有方法进行校验或者对action的指定方法进行校验。

 

对于输入校验struts2提供了两种实现方法:

采用手工编写代码实现

对action中的所有方法进行校验:通过重写validate()方法实现,validate()方法会校验action中所有与execute方法签名相同的方法,当某个数据校验失败时,我们应该调用addFiledError()方法往系统的fieldErrors添加校验失败信息(为了使用addFiledError方法,action可以继承ActionSupport)如果系统的fieldErrors包含失败信息,struts2将会将请求转发到名为input的result.在input视图中可以通过<s:fielderror/>显示失败信息。

手机号的正则表达式:^1[358]\\d{9}$

对action中的指定的方法进行校验:是重写validateXXX()方法。Xxx是action中的方法,且第一个字母要大写。如:action中含有add()方法,如果是重写

validateAdd()方法,则只对add()方法进行校验。其余的过程和上述的相同。

基于xml配置方式实现

对action中的所有方法进行校验:使用基于xml配置方式实现输入校验时,action也需要继承ActionSupport,并且提供校验文件,校验文件和action类放在同一个包下,文件的取名格式为:ActionClassName-validation.xml.ActionClassName为action的简单类名,-validation为固定写法。如果Action类的cn.itcast.UserAction,那么该文件的取名应为:UserAction-validation.xml。下面是校验文件的模板:

<!DOCTYPE validators PUBLIC

        "-//ApacheStruts//XWork Validator 1.0.2//EN"

       "http://struts.apache.org/dtds/xwork-validator-1.0.2.dtd">

<validators>

    <fieldname="username">

       <field-validator type="requiredstring">

           <message key="requiredstring"/>

        </field-validator>

   </field>

    <fieldname="password">

       <field-validator type="requiredstring">

           <message key="requiredstring"/>

       </field-validator>

   </field>

</validators>

<field>指定action中校验的属性,<field-validator>指定校验器,type属性指定校验器类型。系统系统了能满足大部分验证需求的校验器,这些校验器的定义可以在xwork-2.x.jar中的com.opensymphony.xwork2.validator.validators下的default.xml中找到。

<message>为校验失败后的提示信息,如果需要国际化,可以为message指定key属性,key的值为资源文件中的key.

系统的提供校验器:

校验器例子:

其中的正则表达式校验器,在一些版本中:name=”expression”要写成name=”regex”

对action中的指定的方法进行校验:只需要改变校验文件的取名即可,改为:

ActionClassName-ActionName-validation.xml,其中,ActionName为struts.xml中的action名称。

基于XML校验的一些特点:

15.输入校验流程

Ø 类型转换器对请求参数执行类型转换,并把转换后的值赋给action中的属性

Ø 如果在执行类型转换的过程中出现异常,系统将会将异常信息保存在ActionContext,conversionError拦截器将异常信息添加到fieldErrors里。不管类型转换是否出现异常,都将会进入第三步

Ø 系统通过反射技术先调用action中的validateXxx()方法,Xxx为方法名。

Ø 再调用action中的validate()方法。

Ø 经过上面4步,如果系统中的fieldErrors存在错误信息,系统自动将请求转发至名称为input的视图。如果系统fieldErrors没有任何错误信息系统将执行action中的处理方法。

16.国际化

准备资源文件,资源文件的命名格式如下:

baseName_language_country.properties

baseName_language.properties

baseName.properties

其中baseName是资源文件的基本名,我们可以自定义,但是language和country必须是国家。如:

中国大陆:baseName_zh_CN.properties

美国:baseName_en_US.propertie

 

对于中文的属性文件,我们编写好后,应该使用jdk提供的native2ascii命令把文件转换为unicode编码的文件,命令使用的使用方式如下:

Native2ascii 源文件。Properties目标文件.properties(一般的开发工具都支持这个转换)

配置全局资源与输出国际化信息:当准备好资源文件后,我们可以在struts.xml中通过struts.custom.i18n.resources常量把资源文件定义为全局资源文件,如下:

<constant name=”struts.custom.i18n.resource” value=”itcast”/>

Itcast为资源文件的基本名

在页面或在action中访问国际化信息:

在jsp页面中使用<s:text name=””/>标签输出国际化信息,name为资源文件中的key。带有占位符的国家化信息,则应该写:<s:text name=””><param>李明</param></s:text>

在表单标签中,通过key属性指定资源文件中的key,如:

<s:textfield name=”” key=””>;

在Action类中,我们可以继承ActionSupport,使用getText()方法得到国际化信息,该方法的第一个参数用于指定资源文件中的key.第二个参数提供占位符的值。

包范围的资源文件

在java的包下放置package_language_country.properties资源文件,package为固定写法,处于该包及子包下的action都可以访问该资源。当查找指定的key的消息时,系统会先从package资源文件查找,当找不到对应的key时,才会从

struts.custom.i18n.resources指定的资源文件中寻找。

l Action范围资源文件

在Action类所在的包下,放置ActionClassName_language_country.properties资源文件,ActionClassName为action类的不带后缀的名称

 

Package为包的baseName的名称

17.OGNL表达式(大部分用jstl和el表达式)

OGNL是Object Graphic NavigationLanguage(对象图导航语言)的缩写。

相对于EL表达式,它提供啦平时我们需要的一些功能,如:

l 支持对象方法的调用,如:xxx.sayHello

l 支持类静态方法的调用和值访问,表达式的格式为@[类全名(包含包路径)]@[方法名|值名],例如:@java.lang.String@format(‘foo%s’,’bar’)或者@cn.itcast.Constant@APP_NAME;

l 操作集合对象

 

Struts2 中的OGNL Context实现者为ActionContext,它结构示意图如下:

当Struts接受一个请求时,会迅速创建一个ActionContext,ValueStack,action,然后把action存放进ValueStack,所以action的实例变量可以被OGNL访问。

 

访问上下文中的对象需要使用#符号标准命名空间,如#application、#session

另外OGNL会设定一个跟对象(root对象),在struts2中跟对象就是ValueStack(值栈),访问其属性,不需要加 #命名空间。

在root变量中处于第一位的对象叫栈顶对象。通常我们在OGNL表达式里直接写上属性的名称即可访问root变量里对象的属性,搜索顺序是从栈顶对象开始寻找,以此往下。

注意:struts2 中,OGNL表达式需要配合Struts标签才可以使用。如:<s:property value=”name”/>.

OGNL判断对象是否在集合中

OGNL的投影功能

18.Struts的标签

iterator标签:迭代器标签

If标签

Url标签:

 

Checkboxlist标签

单选框标签

19.防止表单重复提交

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值