strust3(国际化,拦截器,文件上传,OGNL)

一、Struts2的国际化

1.1、什么是国际化

软件的国际化:软件开发时,要使它能同时应对世界不同地区和国家的访问,并针对不同地区和国家的访问,提供相应的、符合来访者阅读习惯的页面或数据

1.2、国际化使用的场景

苹果英文网:https://www.apple.com/
苹果中文网:https://www.apple.com/cn
苹果香港网:https://www.apple.com/hk
苹果日本网https://www.apple.com/jp/

1.3、固定文本的国际化

例如:消息提示,错误提示和菜单,导航栏等等固定文本。
步骤

第一步:创建一个消息资源包
一个资源包由多个文件组成,这些文件名都有命名规范:主要文件名语言代码国家代码.properties。
语言代码和国家代码:有iso规定的
当文件只有主要文件名.properties时,表明它是默认资源包。浏览器会根据不同的语言环境找对应语言环境的资源包
当没有时,找默认的。
每个资源包的内容都由相同的key和对应语言环境的value组成。
比如:
message_zh_CN.properties
message_zh_HK.properties
message_en_US.properties

17535584-dc840ef4dbad2eb3.png
图片1.png

第二步:读取资源包中的内容
Java提供ResourceBundle类可以读取资源包的国际化配置文件


17535584-e5b762140c35084b.png
图片2.png

第三步:JSP中使用国际化


17535584-71f618bb971be20f.png
图片3.png

第四步:使用jstl标签来国际化
JSP标准标签库(JSTL)是一个JSP标签集合,它封装了JSP应用的通用核心功能。
JSTL支持通用的、结构化的任务,比如迭代,条件判断,XML文档操作,国际化标签,SQL标签。
除了这些,它还提供了一个框架来使用集成JSTL的自定义标签。
首先需要在项目中导入两个jar包


17535584-f5a7e6a5692bb65a.png
图片4.png

Jsp中代码如下


17535584-c258d144f0152a72.png
图片5.png

1.4、Struts提供的国际化

前面的国际化与struts无关
struts国际化实现步骤
(1)、第一步:配置资源包
a、配置全局的资源包
在struts.xml中配置


17535584-1377be4c42ee532a.png
图片6.png

17535584-78a947a12922bfc9.png
图片7.png

b、配置包范围的资源包
资源包名称命名规范:package_语言代码_国家代码.properties(固定的)。以此种命名方式的资源包能被该包及其子包中的动作类访问。
优先级:高于全局消息资源包

17535584-b10444c4f1972878.png
图片8.png

b、配置包范围的资源包
资源包名称命名规范:package_语言代码_国家代码.properties(固定的)。以此种命名方式的资源包能被该包及其子包中的动作类访问。
优先级:高于全局消息资源包

17535584-b0fba513b6b92eaa.png
图片9.png

Struts2中资源包的搜索顺序


17535584-318469839937e3c4.png
图片10.png

(2)、第二步:读取资源包内容
a、jsp读取资源包内容
使用struts的标签s:text获取国际化内容


17535584-a364b3baf316f15a.png
图片11.png

b、Action读取资源包内容
使用ActionSupport的getText方法,可以读取到资源包的内容
也就是说这个Action一定要继承ActionSupport
这种在实际开发中几乎不用


17535584-e2fd2d0e17414771.png
图片12.png

二、Strust2的拦截器

2.1、拦截器的重要性

Struts2中的很多功能都是由拦截器完成的。比如:servletConfig,staticParam,params,modelDriven等等。
Struts默认的拦截器配置在struts-default.xml文件中
拦截器是AOP编程思想的一种应用形式。

2.2、拦截器的执行时机

17535584-d7d968087488e10d.png
图片13.png

2.3、拦截器的部分类结构

17535584-ade9e5df1e1a32bc.png
图片14.png

2.4、简单拦截器入门

步骤:单个拦截器
(1)、第一步:
创建个拦截器,继承Abastract方法,实现intercept方法


17535584-e3393d229ba0e50d.png
图片15.png

(2)、第二步:
在struts.xml中配置拦截器,拦截器需要配置后才可使用
struts.xml


17535584-b494e23935519a7d.png
图片16.png

Demo01Action.java


17535584-bb7eac41bd90a359.png
图片17.png

Demo01Action.java
步骤:多个拦截器
invocation.invoke方法返回的就是视图


17535584-e064a82e76feac76.png
图片18.png

2.5、拦截器的应用场景【登录】

首先准备四个login.jsp,main.jsp, studentList.jsp, teacherList.jsp 页面
当登录成功后,跳转到main.jsp,main.jsp的内容可以跳转到学生和老师列表

UserAction

17535584-db37604ba33d6811.png
图片19.png

登录验证拦截器

17535584-a92a2d4cf3f12b24.png
图片20.png

拦截器配置
Struts.xml

17535584-7e3b1e1849315f9b.png
图片21.png

如果没有登录,直接访问 <u>http://localhost:8080/day03_struts2_demo04/teacherList.action</u>会回到登录页面

案例中的问题
问题:由于我们写了自己的拦截器,默认的拦截器不起作用了。
举个简单的例子,就是不可以接收请求参数
解决办法
a、把默认拦截器加到配置

17535584-d4cd20a77f2cdd39.png
图片22.png

b、抽取一个拦截器的分组


17535584-0c38899d9a26d919.png
图片23.png

c、修改默认的拦截器
上面的配置坏处是每一个Action都配置拦截器,我们修改默认的拦截器配置,就可以简便我们的代码


17535584-cbc8d86edd4908f8.png
图片24.png

d、过滤不需要登录验证的方法
修改的默认的拦截器后,所有的Action方法都会被拦截,而登录方法是不需要拦截的
解决需要通过AbstractInterceptor类的子类入手,通过查看发现,该类还有一个子类是抽象的,可以通过MthodFilter过滤方法,如图:


17535584-497df3e292af3a1c.png
图片25.png

解决步骤:
修改拦截器的继承结构


17535584-f7dd01ad99059b49.png
图片26.png

修改struts.xml文件,注册过滤方法


17535584-1745c80889f93316.png
图片27.png

上面遗留的问题:我们在声明时配置了哪些方法需要拦截,哪些方法不需要拦截。但是在没有写动作类和动作方法之前,不确定方法名叫什么。
解决办法:我们需要在使用拦截器的时候给它注入参数。

17535584-9d655be1ac343097.png
图片29.png

三、Struts2的文件上传

Struts也提供了内置标签用于文件上传<s:file>,我们称为文件选择域
与html的标签<input tyle=”file”>是一样用的
文件上传的必要前提条件
表单必须是post方法
enctype类型必须为multipart/form-data

3.1、简单文件上传

步骤:
第一步:jsp和action的代码
Jsp


17535584-3d5c4d0d8da7d4bb.png
图片30.png

Action接收到的File对象是一个临时文件,后面需要保存到另外一个路径去


17535584-fb32ac9fa6db8340.png
图片31.png

第二步:struts.xml的配置


17535584-96ef5dd55f62be81.png
图片32.png

3.2、文件上传的配置

第一:配置文件上传的大小
默认情况下,struts的文件上传只允许在2M内
如果上传一个大于2M的文件,系统会报错,而且必要一个input回显结果

修改struts.xml文件


17535584-eef2c49c71952022.png
图片33.png

修改jsp文件


17535584-395b6c558ce7a9c3.png
图片34.png

文件上传失败结果


17535584-aa98048ccbcdeb96.png
图片35.png

修改文件上传大小限制
思路在struts.xml中改变default.properties文件中的常量。


17535584-47d51450d409ef72.png
图片36.png

第二:限制文件上传的类型

思路:通过拦截器设置文件上传的扩展名或者MIME类型


17535584-c5893789120d82dd.png
图片37.png

扩展名的错误提示


17535584-8178288e676fd0a1.png
图片38.png

MIME的错误提示


17535584-3d6eb5badf64bea8.png
图片39.png

17535584-f4b017d0121391bb.png
图片40.png

17535584-c1e8f2b4b27fd586.png
图片41.png

第三:文件上传错误的中文提示

默认的错误提示信息是在

struts2-core.jar\org.apache.struts2\struts-message.properties中


17535584-d953a3ecf740309d.png
图片42.png

解决办法:用国际化消息资源包,把对应的key取值改为中文即可。
常用的key值


17535584-01f29f48935fd787.png
图片43.png

步骤:

第一步:在src目录创建一个fileuploadmessage.properties文件


17535584-20afc160ffeff2c2.png
图片44.png

第二步:在struts.xml配置国际化


17535584-9e0f68554358650e.png
图片45.png

3/3、多文件上传

多文件上传,在Action代码中,只需要把接收的文件字段设置为数组即可
jsp


17535584-7c49f654700aa868.png
图片46.png

Action


17535584-d1a52b5582911a3d.png
图片47.png

3.4、文件下载

其实就是一种结果类型(Stream)
Action代码


17535584-51959fa3f23fc44c.png
图片48.png

Struts.xml代码


17535584-84b70b853b7f9c8a.png
图片49.png

测试下载路径
http://localhost:8080/day03_struts2_demo05/download
动态设置下载的文件名
Struts.xml

17535584-0dcced60c7c4e9b6.png
图片50.png

Action


17535584-26bd202d183c5ad1.png
图片51.png

四、struts的OGNL

4.1、OGNL简介

OGNL是Object Graphic Navigation Language(对象图导航语言)的缩写,
它是一个单独的开源项目。 Struts2框架使用OGNL作为默认的表达式语言。
OGNL是struts2整合的一个开源项目,所以在struts2中,要想使用OGNL表达式,必须使用Struts2标签库
OGNL相当 于EL表示式,从作用域取数据

4.2、OGNL的简单使用

s:property类型于JSP的表达式,把value的值直接输出到页面
jsp表达式:【<jsp:setProperty property="" name=""/>】
value的值就是一个OGNL表达式,它不是一个字符串
如果想把value的值当字符串输出,加单引号即可

17535584-ceb470de874103af.png
图片52.png

4.3、OGNL的功能

访问对象方法
比如字符串的length方法
访问静态属性
访问静态方法
默认OGNL是禁止静态方法访问的,在default.properties中有个struts.ognl.allowStaticMethodAccess=false,如想使用,需要在struts.xml文件中配置允许访问静态方法

17535584-ac9081310fbda0ae.png
图片53.png

封装list数据

17535584-7c6d72937d69f697.png
图片54.png

17535584-ff729897cc0a859c.png
图片55.png

封装Map数据

17535584-e0ca89699aa4100b.png
图片56.png

17535584-f2d5d506c3b8b273.png
图片57.png

struts.xml中写OGNL
前面的文件下载就是一个OGNL表达式


17535584-58aaf4991946bb32.png
图片58.png

修改
Action


17535584-01aa3285f5484270.png
图片59.png

Struts.xml


17535584-038cf76c17605d66.png
图片60.png

17535584-8bebaacffadfec0c.png
图片61.png

五、contextMap

5.1、动作类的生命周期

明确:
动作类是多例的,每次动作访问,动作类都会实例化。所以是线程安全的。
与Struts1的区别是,struts1的动作类是单例的。

5.2、请求数据的存放

问题:
每次请求时,都会产生一些请求数据,这些数据存放到哪里去了?
明确:
在每次动作执行前,核心控制器StrutsPrepareAndExecuteFilter都会创建一个ActionContext和ValueStack对象。且每次动作访问都会创建。
这两个对象存储了整个动作访问期间用到的数据。
并且把数据绑定到了线程局部变量(ThreadLocal)上了。所以是线程安全的。

17535584-855d1826bb3706ef.png
图片62.png

17535584-f62ca17d173da0a8.png
图片63.png

5.3、contextMap 存储数据

Struts2的官方文档对contextMap的说明:


17535584-63aeda52acf81d9b.png
图片64.png

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 把页面、请求、会话、应用范围内的所有属性放到一起。

注意:
除了value stack之外,全是map,而contextMap也是一个map。
其实就是Map中又封装的Map。(很像dbutils中KeyedHandler封装数据的结构,只是封装数据的结构)
使用s:debug查看contextMap的数据

17535584-9417994762076821.png
图片65.png

17535584-785fd1f46b2fd27b.png
图片66.png

4、测试存储数据


17535584-d7c0e4fbcccb8cde.png
图片67.png

17535584-d6ae4ba1f2d0ba3d.png
图片68.png

17535584-e66a788cdc9dfa1c.png
图片69.png

转载于:https://www.jianshu.com/p/fd7e557b6143

猜你喜欢

转载自blog.csdn.net/weixin_33670713/article/details/91152790