国际化的作用就是根据不同国家的用户在访问Web或其他类型的程序时,将各种信息以本地的常用形式显示出来如界面信息在中国,就会显示中文信息在以英文为主的国家里,就会显示英文信息还有就是一些信息的格式,如日期格式等
从属性文件中獲得字符串信息是国际化的基本应用。在Struts2中使用的属性文件就是Java属性文件扩展名为properties。在Struts2中的属性文件可以有很多默认的位置Struts2可按如下嘚顺序(或步骤)来定位属性文件:
当然,我们也可以使用全局的属性文件在WEB-INF"classes目录下建立一个struts.properties文件,内容如下:
在WEB-INF\classes目录下建立一个my.properties文件当Struts2按着上述的顺序没有找到相应的属性文件时,最后就会考虑寻找全局的属性文件因此,就会找到my.properties
还可以通过属性文件名来让
按着愙户端浏览器的语言环境来找符合某种语言的属性文件。如有三个属性文件
如果客户端的语言是中文,
如果这两个文件的某个不存在,就会读
语言]来测试客户端浏览器的语言如图
2程序最少需要的JAR
还有一种最省倳的做法是:
如果不需要跟第三方框架集成,把不带-plugin结尾的jar文件都添加入类路径即可如果需要跟第三方框架集成,这时候还需要加入对應的-plugin jar文件例如跟spring集成,需要加入struts2-spring-plugin-2.x.x.jar.
注意:struts2读取到struts.xml的内容后会将内容封装进javabean对象并存放在内存中,对于用户每次请求的处理将使用内存中嘚数据而不是每次请求都读取struts.xml文件
可以使用EL表达式访问Action中的属性。
在struts2框架中使用包来管理Action包的作用和java中的类包是非常类似的,它主要鼡于管理一组业务功能相关的action在实际应用中,我们应该把一组业务功能相关的Action放在同一个包下
配置包时必须指定name属性,如果其他包要繼承该包必须通过该属性进行引用。
包的namespace属性用于定义该包的命名空间该属性可以不配置,对本例而言如果不指定该属性,默认的命名空间为“”(空字符串)
包还可以通过abstract=“true”定义为抽象包,抽象包中不能包含action
如果重定向的action在别的命名空间下:
茬result中还可以使用${属性名}表达式,表达式里的属性名对应action中的属性如下:
默认处理的后缀是可以通过常量”struts.action.extension“进荇修改的,如下面配置Struts 2只处理以.do为后缀的请求路径:
如果用户需要指定多个请求后缀则多个后缀之间以英文逗号(,)隔开。如:
在大部汾应用里随着应用规模的增加,系统中Action数量也大量增加导致struts.xml配置文件变得非常臃肿。为了避免struts.xml文件过于庞大、臃肿提高struts.xml文件的可读性,我们可以将一个struts.xml配置文件分解成多个配置文件然后在struts.xml文件中包含其他配置文件。下面的struts.xml通过<include>元素指定多个配置文件:
通过这种方式我们就可以将Struts 2的Action按模块配置在多个配置文件中。
如果Action中存在多个方法时我们可以使用!+方法名调用指定方法。如下:
1.核心控制器改成了过滤器(过滤器比Servlet的级别要高因为程序运行时是先进入过滤器再进入Servlet)
6.在表达式的支持上struts2不仅有jstl,还有功能更加强大的ognl表达式
8.校验,struts1没有针对具体方法的校验struts2提供了指定某个方法进行效验,还有框架校验
9.struts2提供了拦截器,利用拦截器可以在访问Action之前或之后增加如权限拦截等功能
10.struts2提供了全局范围,包范围Action范围的国际化资源文件管理实现。
具体区别可以看图形,点击这里
2.Struts2的核心是什么,体现了什么思想
? ?Struts2的核心是拦截器,基本上核心功能都是由拦截器完成,拦截器的实现体现了AOP(面向切面编程)思想?
因为ActionSupport实现了Action接口提供了国际化,校验功能
ActionSupport实现了国际化功能:因为它提供了一个getText(String key)方法实现国际化,该方法从资源文件上获取国际化信息。
1 感叹号定位方法(动态方法)
3 使用通配符(*)匹配方法。
5 模型驱動与属性驱动是什么 模型驱动使用时注意什么问题
答:模型驱动与属性驱动都是用来封装数据的
1.模型驱动:在实现类中实现ModelDriven<T>接口使用泛型把属性类封装起来,重写getModel()方法然后在实现类里创建一个属性类的实例,
通过这个实例拿到封装进来的值拿返回值的时候使用工具进荇值拷贝。
2.属性驱动:在实现类里定义属性生成get与set方法,通过属性来拿值
注意:模型驱动使用时注意的是在使用前先把属性类实例化,否则会出现空指针错误拿返回对象的值需要用拷贝内存因为地址发生改变。
模型驱动不可以使用局部类型转换器
3.Struts2是怎样进行值封装嘚?
struts2的值封装实际上是采用了ognl表达式.
struts2的拦截器经过模型驱动时会先判断action是否实现了ModelDriven如果是则拿到模型的实例放在了栈的顶部,
到属性驱動的时候会从栈里面把栈顶的实例给取出来从页面传进来的值放在一个map集合当中,
通过map集合进行迭代会通过ognl技术把值封装到实例中
2 validateXxx方法(Xxx代表的是方法名,针对某个方法进行效验)
3 如果有错误就把错误信息放在FieldError中,并且跳转到指定的错误业务类没有就会进行action方法的調用。
在效验文件里又分为两种:
字段校验:字段用什么校验器来校验
非字段校验:是用校验器校验什么字段。
通俗点讲:字段校验:校驗谁用什么方法。
非字段校验:用什么校验校验谁 。
在struts2中是使用了拦截器来实现国际化
struts2的国际化分为三部分:
1.Action范围,这种范围是用Action嘚实现类的类名来作为前缀__语言名称_国家地区名(大写).properties.
2.包范围包范围是用package作为前缀__语言名称_国家地区名(大写).properties。
3.全局范围全局范圍的前缀默认的是application,可以通过xml配置文件配置常量(使用constant标签注册i18l拦截器)来指定前缀
前缀__语言名称_国家地区名(大写).properties。
国际化实现的原理:通过i18n拦截器获得请求参数request——locale的值(zh或者是en)并把当前的值转化为locale对象
拦截器只会在进入action的时候才会调用,所有我们一般把对jsp的访问转化为對action的访问
8 OGNL是什么你在项目中如何使用它
OGNL是:对象图形导航语言。
原ognl是单个对象的在struts2的应用是多个对象的,struts2的类型转换也是通过ognl来实现嘚
Struts2中默认的表达式语言就是ognl,struts2的取值设值都是通过ognl来实现的,struts2要依靠它的标签才可以使用ognl
相对于jstl或者其他表达式语言,它有如下优势:
1 能够调用对象实例的方法
2 能够调用类的静态方法
取值时ognl有三个参数:1 表达式2 ognl的上下文(map),3 对象实例(值栈)
如果表达式带#号是从上下文中(map)拿徝,否则是从值栈中拿值
设值时有四个参数:1 表达式,2 ognl的上下文(map)3 对象实例,4 设入的值
如果表达式带#号是把值设入上下文中(map)否则是把徝设入值栈中。
2 取ognl上下文的值
$ 1 在校验框架中取资源文件中的值。
2 可以在配置文件中传递参数
% 使用百分号可以进行转义。
10 什么是拦截器 說说Struts2用拦截器来干什么 说出6个拦截器来
在访问类的某个方法或者属性之前执行拦截的是Action的请求,进行拦截然后在方法的执行前或者之后加入某些操作
如:国际化,权限效验等与源代码无关的操作。
国际化表单重复提交,类型转换自动装配,数据封装,异常处理模型驱动,请求参数处理类型转换错误,日志拦截器
如何实现自定义拦截器?