老铁们,大家好,相信还有很多朋友对于你所不了解的MVC的Struts2框架的高级应用和的相关问题不太懂,没关系,今天就由我来为大家分享分享你所不了解的MVC的Struts2框架的高级应用以及的问题,文章篇幅可能偏长,希望可以帮助到大家,下面一起来看看吧!
Struts2类型转换
1. Struts2内置类型转换器
Struts2 内置了字符串类型和以下类之间的转换器
布尔值和布尔转换
char 和字符转换
int 和整数转换
长长转换
浮点型和浮点型转换
双倍和双倍转换
字符串和日期转换
当使用上述类型作为http请求参数时,不需要手动进行类型转换,struts2会自动进行类型转换。
2.基于OGNL的类型转换
Struts2可以将普通请求参数转换为复合类型对象。
s:textfield name=’用户名’/
s:textfield name=’用户.pass’/
只需在Action 类中直接使用与类型匹配的对象即可
公共类登录操作{
私人用户用户;
//setter、getter方法
公共字符串execute()抛出异常{
//待办事项
}
}
(1)由于Struts2会通过反射的方式创建复合类(User)的实例,因此系统必须为复合类提供无参构造函数。
(2)如果要使用user.name请求参数给Action实例的user属性的name赋值,必须为user组合类提供setName()方法,因为struts2赋值通过setter方法。
Action中的匹配类型也可以是Map或List。 OGNL的写法如下:
地图形式:
s:textfield name=’users[‘one’].name’/
s:textfield name=’users[‘two’].name’/
列表表格:
s:textfield name=’users[0].name’/
s:textfield name=’users[1].name’/
3.自定义类型转换
在某些特殊情况下,框架不知道如何将字符串转换为相应的复合对象,例如将字符串abc 和xyz 转换为User 实例,其中abc 是name,xyz 是pass。这时候就需要自定义类型转换了。
自定义类型转换需要实现TypeConverter或者继承DefaultTypeConverter或StrutsTypeConverter
(1)convertValue方法负责完成类型转换。这种转换是双向的。通过判断toType类型即可确定转换方向。 toType类型是需要转换的目标类型。
(2)ConvertValue方法参数,第一个参数:context为类型转换环境的上下文;第二个参数:value为需要转换的参数;第三个参数:toType为转换后的目标类型
(3)convertValue的返回值是类型转换后的值,并且值的类型也会随着转换方向的不同而变化。
(4) 将字符串转换为复合类型时,value是字符串数组
4.寄存器类型转换器
需要在应用程序中注册类型转换器,这样struts框架才能正常使用。
报名方法如下:
(1)注册本地类型转换器:本地类型转换器只对某个Action的属性起作用
添加到文件Action-conversion.properties
需要类型转换的属性=类型转换器的实现类
(2) 注册一个全局类型转换器:全局类型转换器将对所有Action特定的属性生效。
将其添加到文件xwork-conversion.properties (在应用程序的类加载路径中)
需要类型转换的属性=类型转换器的实现类
手动实现输入校验
1.重写validate()方法
在validate方法中,一旦验证失败,就通过addFieldError方法添加到FieldError中。如果FieldError不为空,则会自动跳转到输入逻辑视图。
2. 重写validateXxx()方法
如果我们的输入验证只想验证某个处理逻辑,我们需要提供一个validateXxx()方法,其中xxx是逻辑处理方法的方法名。其他内容同上
下图概括了类型转换和输入验证的整个处理流程:
使用struts2实现文件上传
1.Struts2文件上传
Struts2默认使用Jakarta的Common-FileUpload文件上传框架,需要引入以下两个jar包:commons-io.jar、commons-fileupload.jar
2.实现文件上传的动作
(1)表单enctype属性设置为multipart-form-data
(2) 表单中添加文件上传组件
(3)Action中需要单个属性来封装文件域信息
File类型的xxx属性封装了文件域对应的文件内容。
String类型的xxxFileName属性封装了文件的文件名
String类型的xxxContentType属性封装了文件的文件类型
String类型的savePath属性用于配置文件的存储位置。
3、配置文件上传动作
除了使用param 元素设置savePath 之外,上面的配置与其他操作配置几乎相同。
4.手动实现文件过滤
(1)在Action中定义一个专门用于文件过滤的方法,方法名改为任意即可。
(2)在Action中添加验证文件的一个属性,并使用第一步中的方法来确定该属性的值。
(3)使用struts2输入验证实现验证,如validate或validateXxx
5.Interceptor实现文件过滤
Struts2提供了文件上传拦截器,可以配置它来过滤文件。拦截器名称是fileupload。验证失败后,会自动切换到输入逻辑视图。如下:
allowedTypes:指定允许上传的文件类型。多个文件类型以逗号分隔。
maximunSize:指定允许上传的文件大小,单位为字节
PS:注意必须配置默认拦截器defaultStack
6.输出错误信息
国际资源文件配置:
struts.messages.error.content.type.not.allowed=您上传的文件类型只能是图片
struts.messages.error.file.too.large=您要上传的文件太大
struts.messages.error.uploading=文件上传错误
使用Struts2控制文件下载
1.实现文件下载动作
(1) 在页面中写入文件超链接
(2)在Action中定义一个方法,其返回值类型为InputStream
2. 配置动作
您需要配置类型流的结果
属性说明如下:
contentType:指定下载文件的文件类型
inputName:指定下载文件的入口输入流
contentDisposition:指定下载的文件名
bufferSize:指定下载文件的缓冲区大小
详解Struts2的拦截器机制
1.Struts2中拦截器的作用
Struts2可以理解为一个空容器,内置大量拦截器完成框架的大部分操作。 Struts2拦截器是可插拔的设计。拦截器由配置文件管理,易于扩展和维护。 Struts2框架的大部分功能都是通过拦截器完成的。当StrutsPrepareAndExecuteFilter拦截用户请求时,大量的拦截器会处理用户请求,然后调用用户开发的Action来处理用户请求。
Struts2默认启动了大量具有常用功能的拦截器。只要我们配置Action包继承struts-default包,拦截器就可以工作了。
2.Struts内置拦截器
Struts2内置了大量的拦截器,它们以名称-类对的形式配置在struts-default.xml文件中,其中then是拦截器的名称,class指定拦截器的实现类。如果我们的包继承了Struts2默认的struts-default包,则可以自由使用以下拦截器。
alias:实现不同请求中相似参数别名的转换
autowiring:这是一个自动装配拦截器。在集成struts2和spring时,Struts2可以使用自动组装的方式来访问Spring容器中的bean。
chain:构建一个Action链,使得当前Action可以访问前一个Action的属性
conversionError:负责处理类型转换错误的拦截器
createSession:负责创建HttpSession对象
调试:使用开发模式时提供更多调试信息
execAndWait:在后台执行Action,负责将等待画面发送给用户
异常:负责处理异常并将异常映射到结果
fileUpload:用于文件上传,负责解析表单中的文件字段内容
i18n:国际化拦截器,负责将选择的语言区域放入用户Session中
logger:负责记录日志的拦截器
model-driven:模型驱动的拦截器。当Action 实现ModelDriven 接口时,它负责将getModel() 方法的结果堆栈到值堆栈中。
params:最基本的拦截器,负责解析HTTP请求中的参数,并将参数值设置为Action对应的属性值。
准备:如果Action实现了Preparable接口,那么拦截器的prepare()方法将会被调用。
static-params:拦截器负责将xml中action标签下的param标签中的参数传递到action中
scope:作用域转换拦截器,将Action状态信息保存到HttpSession作用域或ServletContext作用域
servlet-config:通过Action拦截器直接访问Servlet API
timer:拦截器负责输出Action执行时间
token:用于防止重复提交
token-session:用于防止重复提交,将token保存在HttpSession中
验证:通过执行xxxAction-validation.xml中定义的验证器来实现数据验证
工作流程:负责调用Action类中的validate方法。如果验证失败,则返回输入逻辑视图。
3.配置拦截器
使用struts.xml中的interceptor元素完成配置
Interceptor name=’拦截器名称’ class=’拦截器实现类’
param name=’参数名称’参数值/param
/拦截器
您还可以使用interceptor-stack元素定义一个拦截器堆栈来组合多个拦截器
Interceptor-stack name=’拦截器堆栈名称’
Interceptor-ref name=’拦截器名称’/
Interceptor-ref name=’拦截器名称’/
Interceptor-ref name=’拦截器堆栈名称’/
/拦截器堆栈
拦截器堆栈还可以包含拦截器堆栈
4.使用拦截器
拦截器的拦截行为会在Action的请求处理方法之前执行。拦截器的使用如下:
在action元素中配置了三个拦截器defaultStack、mysimple和later。
5.配置默认拦截器
一旦我们显式地为Action应用了拦截器,默认的拦截器将不会生效。如果需要使用默认拦截器,则必须手动配置拦截器。
还可以通过default-interceptor-ref元素配置默认拦截器,让拦截器在包下的所有Action中生效。
6. 实现拦截器类
自定义拦截器需要开发自己的拦截器类并实现Interceptor接口
该接口包含3个方法:
init():该方法用于初始化资源
destroy():该方法用于销毁先前初始化的资源。
Intercept(ActionInvocauincalling):该方法用于实现拦截动作。该方法返回一个字符串作为逻辑视图,并且不会调用拦截到的Action。需要通过invoke方法继续执行。
如下图:
7.拦截方法的拦截器
默认的自定义拦截器会拦截Action中的所有方法。如果只想拦截指定的方法,则需要继承MethodFilterInterceptor。该类提供了一个doIntercept(ActionInitation 调用)抽象方法,可以重写该方法:
在MethodFilterInterceptor类中,额外增加了两个方法,用户自定义拦截Action方法
setExcludeMethods(Stirng exceptMethods):排除需要过滤的方法
setIncludeMethods(String includeMethods):设置需要过滤的方法
如果同时在excludeMethods和includeMethods中列出,则该方法将被拦截
以上两个参数需要在配置拦截器时设置
拦截器引用名称=’mysimple’
param name=’includeMethods’要拦截的方法(多个逗号分隔)/param
param name=’excludeMethods’不被拦截的方法(多个逗号分隔)/param
/拦截器
原创文章,作者:小su,如若转载,请注明出处:https://www.sudun.com/ask/126687.html
用户评论
半梦半醒半疯癫
MVC总感觉就是基础概念,这篇文章写的还挺深的,我之前一直用的spring mvc,但没接触过struts2,现在看明白了高级用法确实很多种啊!
有10位网友表示赞同!
抓不住i
写得好!看完之后我对struts2有了更深的认识。原来还有这么多的高级应用技巧,我打算回去好好练习一下。
有5位网友表示赞同!
迷路的男人
这篇文章说的没错啊!很多开发人员只停留在MVC的基本概念上,而没有深入了解像struts2这样的框架的更深层级使用方式。真的很赞助。
有18位网友表示赞同!
墨染殇雪
Struts2确实是一款老牌的框架,现在用的越来越少了吧?感觉在spring mvc 的时代,它已经不那么流行了,所以很少有人会关心它的高级用法。
有11位网友表示赞同!
孤单*无名指
MVC框架那么多,每个都有自己的优缺点,没必要说一个好一个坏,关键看项目的需求和开发者的习惯了!
有18位网友表示赞同!
予之欢颜
学习Struts2确实很有挑战,尤其是在数据交互、安全性等方面要求较高。这篇文章帮我打开了新的思路,让我对它的应用场景有了更清楚的认识。
有16位网友表示赞同!
岁岁年年
我是学设计模式的,对于框架的使用基本只是用而已,并不会深入研究其高级用法。这篇博客写得很有深度,我从中学到了很多新东西!
有8位网友表示赞同!
繁华若梦
感觉这篇文章偏理论,没见过实际应用案例。还是想看一些具体的代码实践例子,把这些高级应用技巧讲清楚一点。
有8位网友表示赞同!
十言i
MVC框架确实很强大,可以简化开发流程,提高程序效率,特别是像struts2这样的老牌框架积累的经验也值得借鉴!
有13位网友表示赞同!
浮光浅夏ζ
Struts2虽然在现在这个时代已经不是主流框架了,但它仍然是一门值得学习的技术。这篇博客让我对它的高级应用有了更深入的了解,或许在未来的项目中可以派上用场。
有14位网友表示赞同!
落花忆梦
我一直觉得mvc框架设计过于复杂 ,对于初学者或者小型项目来说,太重了。还是简单直接的代码更容易理解和维护吧!
有16位网友表示赞同!
景忧丶枫涩帘淞幕雨
这篇文章写的深入浅出,将Struts2高级应用技巧解释得非常清晰易懂,受益匪浅!感谢作者的分享!
有18位网友表示赞同!
无所谓
以前一直以为Struts2只是个简单的MVC框架 ,现在看来还是太小看它了啊。这篇博客让我看到了它的强大之处。
有14位网友表示赞同!
来瓶年的冰泉
很多情况下,对学习新的东西,我更喜欢直接看实战代码案例,而不是枯燥的文字描述。希望作者能够分享一些具体的项目应用例子。
有10位网友表示赞同!
别留遗憾
Struts2 确实是一个老牌框架,但它在web applications development 领域占有一定的地位,对于想要深入了解MVC模式,学习传统java开发经验的学生来说依然具有参考价值!
有15位网友表示赞同!
打个酱油卖个萌
我觉得现在的web技术发展很快,已经有很多新兴框架出来了。像struts 这样的老框架可能逐渐会被淘汰掉吧?
有15位网友表示赞同!
一个人的荒凉
这篇文章让我对Struts2有了新的认识,原来它还有这么丰富的应用场景和高级技巧。我以后一定多关注这一类的文章学习提高!
有19位网友表示赞同!