Struts2[三]
2019-09-27 / JAVA / 1005 次围观 / 0 次吐槽 /Struts2的国际化
什么是国际化
n 软件的国际化:软件开发时,要使它能同时应对世界不同地区和国家的访问,并针对不同地区和国家的访问,提供相应的、符合来访者阅读习惯的页面或数据
固定文本的国际化
n 例如:消息提示,错误提示和菜单,导航栏等等固定文本。
步骤
第一步:创建一个消息资源包
n 一个资源包由多个文件组成,这些文件名都有命名规范:主要文件名_语言代码_国家代码.properties。
n 语言代码和国家代码:有iso规定的
n 当文件只有主要文件名.properties时,表明它是默认资源包。浏览器会根据不同的语言环境找对应语言环境的资源包
n 当没有时,找默认的。
n 每个资源包的内容都由相同的key和对应语言环境的value组成。
n 比如:
² message_zh_CN.properties
² message_en_US.properties
第二步:读取资源包中的内容
n Java提供ResourceBundle类可以读取资源包的国际化配置文件
第三步:JSP中使用国际化
第四步:使用jstl标签来国际化
n JSP标准标签库(JSTL)是一个JSP标签集合,它封装了JSP应用的通用核心功能。
n JSTL支持通用的、结构化的任务,比如迭代,条件判断,XML文档操作,国际化标签,SQL标签。
n 除了这些,它还提供了一个框架来使用集成JSTL的自定义标签。
首先需要在项目中导入两个jar包
Struts提供的国际化
n 前面的国际化与struts无关
struts国际化实现步骤
(1)、第一步:配置资源包
a、配置全局的资源包
在struts.xml中配置
b、配置包范围的资源包
n 资源包名称命名规范:package_语言代码_国家代码.properties(固定的)。以此种命名方式的资源包能被该包及其子包中的动作类访问。
n 优先级:高于全局消息资源包
c、局部消息资源包
n 资源包名称命名规范:动作类名称_语言代码_国家代码.properties。以此种命名方式的资源包,只为动作类服务。
n 优先级最高(就近原则)。
² Struts2中资源包的搜索顺序:
(2)、第二步:读取资源包内容
a、jsp读取资源包内容
使用struts的标签s:text获取国际化内容
b、Action读取资源包内容
n 使用ActionSupport的getText方法,可以读取到资源包的内容
n 也就是说这个Action一定要继承ActionSupport
n 这种在实际开发中几乎不用
c、自由指定读取资源包
n 在jsp页面可以使用s:i18n标签指向读取的国际资源包文件
Strust2的拦截器
1、拦截器的重要性
n Struts2中的很多功能都是由拦截器完成的。比如:servletConfig,staticParam,params,modelDriven等等。
n Struts默认的拦截器配置在struts-default.xml文件中
n 拦截器是AOP编程思想的一种应用形式。
2、拦截器的执行时机
3、拦截器的部分类结构
4、简单拦截器入门
步骤:单个拦截器
(1)、第一步:
n 创建个拦截器,继承Abastract方法,实现intercept方法
(2)、第二步:
n 在struts.xml中配置拦截器,拦截器需要配置后才可使用
多个拦截器
ActionInvocation.invoke方法返回的就是视图
拦截器中的问题
n 问题:由于我们写了自己的拦截器,默认的拦截器不起作用了。
n 举个简单的例子,就是不可以接收请求参数
a、 把默认拦截器加到配置
b、抽取一个拦截器的分组
c、修改默认的拦截器
n 上面的配置坏处是每一个Action都配置拦截器,我们修改默认的拦截器配置,就可以简便我们的代码
d、过滤不需要登录验证的方法
n 修改的默认的拦截器后,所有的Action方法都会被拦截,而登录方法是不需要拦截的
n 解决需要通过AbstractInterceptor类的子类入手,通过查看发现,该类还有一个子类是抽象的,可以通过MthodFilter过滤方法,如图:
解决步骤:修改拦截器的继承结构
修改struts.xml文件,注册过滤方法
上面遗留的问题:我们在声明时配置了哪些方法需要拦截,哪些方法不需要拦截。但是在没有写动作类和动作方法之前,不确定方法名叫什么。
解决办法:我们需要在使用拦截器的时候给它注入参数。
三、Struts2的文件上传
n Struts也提供了内置标签用于文件上传<s:file>,我们称为文件选择域
n 与html的标签<input tyle=”file”>是一样用的
n 文件上传的必要前提条件
² 表单必须是post方法
² enctype类型必须为multipart/form-data
1、简单文件上传
n 步骤:
第一步:jsp和action的代码
Action接收到的File对象是一个临时文件,后面需要保存到另外一个路径去
第二步:struts.xml的配置
2、文件上传的配置
第一:配置文件上传的大小
n 默认情况下,struts的文件上传只允许在2M内
如果上传一个大于2M的文件,系统会报错,而且必要一个input回显结果
n 修改文件上传大小限制
² 思路在struts.xml中改变default.properties文件中的常量。
第二:限制文件上传的类型
n 思路:通过拦截器设置文件上传的扩展名或者MIME类型
第三:文件上传错误的中文提示
n 默认的错误提示信息是在
struts2-core.jar\org.apache.struts2\struts-message.properties中
n 解决办法:用国际化消息资源包,把对应的key取值改为中文即可。
² 常用的key值
3、多文件上传
n 多文件上传,在Action代码中,只需要把接收的文件字段设置为数组即可
4、文件下载
n 其实就是一种结果类型(Stream)
Action代码
动态设置下载的文件名
contextMap
1、动作类的生命周期
n 明确:
² 动作类是多例的,每次动作访问,动作类都会实例化。所以是线程安全的。
² 与Struts1的区别是,struts1的动作类是单例的。
2、请求数据的存放
n 问题:
² 每次请求时,都会产生一些请求数据,这些数据存放到哪里去了?
n 明确:
² 在每次动作执行前,核心控制器StrutsPrepareAndExecuteFilter都会创建一个ActionContext和ValueStack对象。且每次动作访问都会创建。
² 这两个对象存储了整个动作访问期间用到的数据。
² 并且把数据绑定到了线程局部变量(ThreadLocal)上了。所以是线程安全的。
3、contextMap 存储数据
n Struts2的官方文档对contextMap的说明:
contextMap=ActionContext中存放的主要内容 | ||
Key | Value | 说明 |
value stack (root) | java.util.List | 没有root这个key。它是一个list。 |
application | java.util.Map<String,Object> | ServletContext中的所有属性。 |
session | java.util.Map<String,Object> | HttpSession中的所有属性。 |
request | java.util.Map<String,Object> | ServletRequest中的所有属性。 |
parameters | java.util.Map | 参数 |
attr | java.util.Map | 把页面、请求、会话、应用范围内的所有属性放到一起。 |
n 注意:
² 除了value stack之外,全是map,而contextMap也是一个map。
² 其实就是Map中又封装的Map。(很像dbutils中KeyedHandler封装数据的结构,只是封装数据的结构)
² 使用s:debug查看contextMap的数据
4、测试存储数据
- 上一篇:Struts2[二]
- 下一篇:Struts2[四]
Powered By Cheug's Blog
Copyright Cheug Rights Reserved.