你所不了解的MVC的Struts2框架的高级应用

《“爱读书”–给你讲技术》,我来看书,你来进步,让我们开始吧!本书简介书名为《轻量级JavaEE企业应用实战》,是本人在学习JavaEE框架的时候阅读的第一本

老铁们,大家好,相信还有很多朋友对于你所不了解的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()方法

你所不了解的MVC的Struts2框架的高级应用

如果我们的输入验证只想验证某个处理逻辑,我们需要提供一个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对象

调试:使用开发模式时提供更多调试信息

你所不了解的MVC的Struts2框架的高级应用

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

/拦截器

用户评论

你所不了解的MVC的Struts2框架的高级应用
半梦半醒半疯癫

MVC总感觉就是基础概念,这篇文章写的还挺深的,我之前一直用的spring mvc,但没接触过struts2,现在看明白了高级用法确实很多种啊!

    有10位网友表示赞同!

你所不了解的MVC的Struts2框架的高级应用
抓不住i

写得好!看完之后我对struts2有了更深的认识。原来还有这么多的高级应用技巧,我打算回去好好练习一下。

    有5位网友表示赞同!

你所不了解的MVC的Struts2框架的高级应用
迷路的男人

这篇文章说的没错啊!很多开发人员只停留在MVC的基本概念上,而没有深入了解像struts2这样的框架的更深层级使用方式。真的很赞助。

    有18位网友表示赞同!

你所不了解的MVC的Struts2框架的高级应用
墨染殇雪

Struts2确实是一款老牌的框架,现在用的越来越少了吧?感觉在spring mvc 的时代,它已经不那么流行了,所以很少有人会关心它的高级用法。

    有11位网友表示赞同!

你所不了解的MVC的Struts2框架的高级应用
孤单*无名指

MVC框架那么多,每个都有自己的优缺点,没必要说一个好一个坏,关键看项目的需求和开发者的习惯了!

    有18位网友表示赞同!

你所不了解的MVC的Struts2框架的高级应用
予之欢颜

学习Struts2确实很有挑战,尤其是在数据交互、安全性等方面要求较高。这篇文章帮我打开了新的思路,让我对它的应用场景有了更清楚的认识。

    有16位网友表示赞同!

你所不了解的MVC的Struts2框架的高级应用
岁岁年年

我是学设计模式的,对于框架的使用基本只是用而已,并不会深入研究其高级用法。这篇博客写得很有深度,我从中学到了很多新东西!

    有8位网友表示赞同!

你所不了解的MVC的Struts2框架的高级应用
繁华若梦

感觉这篇文章偏理论,没见过实际应用案例。还是想看一些具体的代码实践例子,把这些高级应用技巧讲清楚一点。

    有8位网友表示赞同!

你所不了解的MVC的Struts2框架的高级应用
十言i

MVC框架确实很强大,可以简化开发流程,提高程序效率,特别是像struts2这样的老牌框架积累的经验也值得借鉴!

    有13位网友表示赞同!

你所不了解的MVC的Struts2框架的高级应用
浮光浅夏ζ

Struts2虽然在现在这个时代已经不是主流框架了,但它仍然是一门值得学习的技术。这篇博客让我对它的高级应用有了更深入的了解,或许在未来的项目中可以派上用场。

    有14位网友表示赞同!

你所不了解的MVC的Struts2框架的高级应用
落花忆梦

我一直觉得mvc框架设计过于复杂 ,对于初学者或者小型项目来说,太重了。还是简单直接的代码更容易理解和维护吧!

    有16位网友表示赞同!

你所不了解的MVC的Struts2框架的高级应用
景忧丶枫涩帘淞幕雨

这篇文章写的深入浅出,将Struts2高级应用技巧解释得非常清晰易懂,受益匪浅!感谢作者的分享!

    有18位网友表示赞同!

你所不了解的MVC的Struts2框架的高级应用
无所谓

以前一直以为Struts2只是个简单的MVC框架 ,现在看来还是太小看它了啊。这篇博客让我看到了它的强大之处。

    有14位网友表示赞同!

你所不了解的MVC的Struts2框架的高级应用
来瓶年的冰泉

很多情况下,对学习新的东西,我更喜欢直接看实战代码案例,而不是枯燥的文字描述。希望作者能够分享一些具体的项目应用例子。

    有10位网友表示赞同!

你所不了解的MVC的Struts2框架的高级应用
别留遗憾

Struts2 确实是一个老牌框架,但它在web applications development 领域占有一定的地位,对于想要深入了解MVC模式,学习传统java开发经验的学生来说依然具有参考价值!

    有15位网友表示赞同!

你所不了解的MVC的Struts2框架的高级应用
打个酱油卖个萌

我觉得现在的web技术发展很快,已经有很多新兴框架出来了。像struts 这样的老框架可能逐渐会被淘汰掉吧?

    有15位网友表示赞同!

你所不了解的MVC的Struts2框架的高级应用
一个人的荒凉

这篇文章让我对Struts2有了新的认识,原来它还有这么丰富的应用场景和高级技巧。我以后一定多关注这一类的文章学习提高!

    有19位网友表示赞同!

原创文章,作者:小su,如若转载,请注明出处:https://www.sudun.com/ask/126687.html

(0)
小su's avatar小su
上一篇 2024年9月1日 下午10:00
下一篇 2024年9月1日 下午10:02

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注