百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

MVC之Struts2框架--你并不了解的高级应用

ccwgpt 2024-10-03 18:27 22 浏览 0 评论

《“爱读书”--给你讲技术》,我来看书,你来进步,让我们开始吧!

本书简介

书名为《轻量级JavaEE企业应用实战》,是本人在学习JavaEE框架的时候阅读的第一本书,本书对于框架及相关基础知识讲述的比较详细和浅显,适合初学者和需要全面了解JavaEE知识的人群。

本文内容为本书第四章


Struts2类型转换

1.Struts2内建的类型转换器

Struts2内建了字符串类型和如下类间的转换器

boolean和Boolean转换

char和Character转换

int和Integer转换

long和Long转换

float和Float转换

double和Double转换

字符串和Date转换

以上类型作为http请求参数时,无须人为进行类型转换,struts2将自动进行类型转换。

2.基于OGNL的类型转换

struts2可以将普通请求参数转换成复合类型的对象。

<s:textfield name="user.name"/>

<s:textfield name="user.pass"/>

Action类中直接使用符合类型的对象即可

public class LoginAction{

private User user;

//setter,getter方法

public String execute() throws exception{

//todo

}

}

(1)因为Struts2将通过反射创建一个复合类(User)的实例,因此系统必须为该复合类提供无参数构造

(2)如果希望使用user.name请求参数的形式为Action实例的user属性的name赋值,则必须为user复合类提供setName()方法,因为struts2是通过setter方法赋值的

Action中的符合类型也可以Map或者List,OGNL书写如下:

Map形式:

<s:textfield name="users['one'].name"/>

<s:textfield name="users['two'].name"/>

List形式:

<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不为空,将自动跳转到input逻辑视图。

2.重写validateXxx()方法

如果我们的输入校验只想验证某个处理逻辑,则需要提供一个validateXxx()方法,其中xxx是逻辑处理方法的方法名。其他内容同上

下图总结了类型转换和输入校验的整个处理流程:

使用struts2实现文件上传

1.struts2的文件上传

struts2默认使用的是Jakarta的Common-FileUpload文件上传框架,需要引入如下两个jar包:commons-io.jar、commons-fileupload.jar

2.实现文件上传的Action

(1)表单enctype属性设置为multipart-form-data

(2)表单中增加file上传组件

(3)Action中需要单个属性来封装文件域信息

类型File的xxx属性封装了该文件域对应的文件内容

类型String的xxxFileName属性封装了该文件的文件名

类型String的xxxContentType属性封装了该文件的文件类型

类型String的savePath属性用来配置文件的存储位置

3.配置文件上传的Action

上面配置除了使用<param>元素设置了savePath外,与其他action配置几乎一样

4.手动实现文件过滤

(1)在Action中定义一个专门用于进行文件过滤的方法,改方法的方法名任意

(2)在Action中增加一个验证文件的属性,第一步中的方法判断这个属性的值

(3)利用struts2输入校验来实现验证,如validate或validateXxx

5.拦截器实现文件过滤

struts2提供了一个文件上传拦截器,通过配置该拦截器可实现文件过滤。拦截器名称fileupload,验证失败后会自动转入input逻辑视图。如下:

allowedTypes:指定允许上传的文件类型,多个文件类型用逗号隔开

maximunSize:制定允许上传的文件大小,单位字节

PS:注意默认拦截器defaultStack必须配置

6.输出错误提示

国际化资源文件配置:

struts.messages.error.content.type.not.allowed=您上传的文件类型只能是图片

struts.messages.error.file.too.large=您要上传的文件太大

struts.messages.error.uploading=文件上传错误

使用Struts2控制文件下载

1.实现文件下载Action

(1)在页面中写入文件超链接

(2)在Action中定义一个返回值类型是InputStream的方法

2.配置Action

需要配置一个类型为stream的结果

属性说明如下:

contentType:指定被下载文件的文件类型

inputName:指定被下载文件的入口输入流

contentDisposition:指定下载的文件名

bufferSize:指定下载文件的缓冲大小

详解Struts2的拦截器机制

1.拦截器在Struts2中的作用

可以把Struts2理解成一个空容器,大量的内建拦截器完成了该框架的大部分操作。Struts2拦截器是可插拔式设计,拦截器有配置文件进行管理,容易扩展和维护。Struts2框架的绝大部分功能都是通过拦截器来完成的,当StrutsPrepareAndExecuteFilter拦截到用户请求后,大量拦截器将会对用户请求进行处理,然后才会调用用户开发的Action来处理用户请求。

Struts2已经默认启动了大量通用功能的拦截器,只要我们配置Action的package继承了struts-default包,拦截器就会起作用。

2.Struts内建的拦截器

Struts2内建了大量的拦截器,这些拦截器以name-class对的形式配置在struts-default.xml文件中,其中那么是拦截器的名字,class指定了拦截器的实现类。如果我们的package继承了Struts2的默认struts-default包,则可以自由使用如下拦截器。

alias:实现在不同请求中相似参数别名的转换

autowiring:这是自动装配拦截器,用于struts2和spring整合时,Struts2可以使用自动装配的方式在来访问Spring容器中的Bean

chain:构建一个Action链,使当前的Action可以访问前一个Action属性

conversionError:负责处理类型转换错误的拦截器

createSession:负责创建一个HttpSession对象

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

execAndWait:后台执行Action,负责将等待画面发送给用户

exception:负责处理异常,将异常映射为结果

fileUpload:用于文件上传,负责解析表单中的文件域内容

i18n:国际化拦截器,负责把所选语言区域放入用户Session

logger:负责日志记录的拦截器

model-driven:用于模型驱动的拦截器,当某个Action实现了ModelDriven接口,它负责把getModel()方法的结果堆入值栈中

params:最基本的拦截器,负责解析HTTP请求中的参数,并将参数值设置成Action对应的属性值

prepare:如果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中

validation:通过执行在xxxAction-validation.xml中定义的校验器,实现数据校验

workflow:负责调用Action类中的validate方法,校验失败则返回input逻辑视图

3.配置拦截器

在struts.xml中使用<interceptor>元素完成配置

<interceptor name="拦截器名" class="拦截器实现类">

<param name="参数名">参数值</param>

</interceptor>

也可以定义拦截器栈,来组合多个拦截器,使用<interceptor-stack>元素

<interceptor-stack name="拦截器栈名">

<interceptor-ref name="拦截器名"/>

<interceptor-ref name="拦截器名"/>

<interceptor-ref name="拦截器栈名"/>

</interceptor-stack>

拦截器栈也可以包含拦截器栈

4.使用拦截器

拦截器的拦截行为将会在Action的请求处理方法之前被执行。拦截器的使用如下:

在<action>元素中配置了三个拦截器defaultStack、mysimple、later

5.配置默认拦截器

一旦我们为某个Action显式应用了某个拦截器,则默认拦截器不会生效,如果需要使用默认拦截器,必须手动配置该拦截器。

也可以通过<default-interceptor-ref>元素来配置默认拦截器,使拦截器在包下所有Action中生效

6.实现拦截器类

自定义拦截器需要开发自己的拦截器类并实现Interceptor接口

接口包含3个方法:

init():该方法用于初始化资源

destroy():该方法用于销毁之前初始化的资源

intercept(ActionInvocation invocation):该方法用于实现拦截动作,该方法返回一个字符串作为逻辑视图,并不会调用被拦截的Action,需通过invoke方法继续执行

如下图:

7.拦截方法的拦截器

默认自定义的拦截器会拦截Action内的所有方法,如果只想拦截指定方法,需要继承MethodFilterInterceptor,类提供了一个doIntercept(ActionInvocation invocation)抽象方法,可重写此方法:

在MethodFilterInterceptor类中,增加了两个额外方法,用户限定拦截的Action方法

setExcludeMethods(Stirng excludeMethods):排除需要过滤的方法

setIncludeMethods(String includeMethods):设置需要过滤的方法

如果同在在excludeMethods和includeMethods中列出,则该方法会被拦截

上面的两个参数需要在配置拦截器时设置

<interceptor-ref name="mysimple">

<param name="includeMethods">要拦截的方法(多个逗号隔开)</param>

<param name="excludeMethods">不拦截的方法(多个逗号隔开)</param>

</interceptor>

8.拦截器链中拦截器的执行顺序

在Action的控制方法执行前,位于拦截器链前面的拦截器先发生作用;在Action的控制方法执行后,位于拦截器链前面的拦截器后发生作用。

相关推荐

用Deepseek扩写土木工程毕业论文实操指南

用Deepseek扩写毕业论文实操指南一、前期准备整理现有论文初稿/提纲列清楚论文核心框架(背景、现状、意义、方法、数据、结论等)梳理好关键文献,明确核心技术路线二、Deepseek扩写核心思路...

985学霸亲授,DeepSeek也能绘6大科研图表,5分钟就出图

在实验数据处理中,高效可视化是每个科研人的必修课。传统绘图软件操作复杂、耗时费力,而智能工具DeepSeek的出现彻底改变了这一现状。本文将详解如何用DeepSeek一键生成六大科研常用图表,从思维导...

AI写论文刷屏?大学生正在丢掉的思考力

一、宿舍深夜:当论文变成"Ctrl+C+V"凌晨两点的大学宿舍,小王对着电脑屏幕叹气。本该三天前开始写的近代史论文,此刻还一片空白。他熟练打开某AI写作网站,输入"论五四运动的...

Grok在辅助论文写作上能不能既“聪明”又“可怕”?!

AcademicIdeas-学境思源AI初稿写作随着人工智能技术的飞速发展,论文写作这一学术任务正迎来新的助力。2025年2月18日,美国xAI公司推出了备受瞩目的Grok3模型,其创始人埃隆·...

大四论文沟通场景!音频转文字难题听脑AI来化解

大四学生都知道,写论文时和导师沟通修改意见,简直是“过关斩将”。电话、语音沟通完,想把导师说的修改方向、重点要求记下来,麻烦事儿可不少。手写记不全,用普通录音转文字工具,转完还得自己慢慢找重点,稍不注...

论文写作 | 技术路线图怎么画?(提供经典优秀模板参考)

技术路线图是一种图表或文字说明,用于描述研究目标、方法和实施计划。它展示了研究的整体框架和步骤,有助于读者理解研究的逻辑和进展。在课题及论文中,技术路线图是常见的一部分,甚至是一个类似心脏一样的中枢器...

25年信息系统项目管理师考试第2批论文题目写作建议思路框架

25年信息系统项目管理师考试第2批论文题目写作建议思路框架--马军老师

微信购物应尽快纳入法律框架(微信购物管辖)

符向军近日,甘肃省工商行政管理局发布《2016年上半年信息分析报告》。报告显示,微信网购纠纷迅猛增长,网络购物投诉呈上升趋势。投诉的主要问题有出售的商品质量不过关、消费者通过微信付款后对方不发货、购买...

泛珠三角区域网络媒体与腾讯微信签署《战略合作框架协议》

新海南客户端、南海网7月14日消息(记者任桐)7月14日上午,参加第四届泛珠三角区域合作网络媒体论坛的区域网络媒体负责人及嘉宾一行到腾讯微信总部座谈交流,并签署《战略合作框架协议》(以下简称《框架协...

离线使用、植入微信-看乐心Mambo手环如何打破框架

从2014年开始智能手环就成功进入人们的生活,至今已经演变出数据监测、信息推送、心率监测等诸多五花八门的功能,人们选择智能手环并不指望其能够改变身体健康情况,更多的是通过数据来正视自身运动情况和身体健...

微信私域电商运营策略与框架(微信私域怎么做)

...

华专网络:如何零基础制作一个网站出来?

#如何零基础制作一个网站出来?#你是不是觉得网站建设很复杂,觉得自己是小白,需求不明确、流程搞不懂、怕被外包公司坑……这些问题我都懂!今天华专网络就用大白话给你捋清楚建站的全流程,让你轻松get网站制...

WAIC2024丨明日上午9点,不见不散!共同探讨智能社会与全球治理框架

大咖云集,硕果闪耀WAIC2024世界人工智能大会智能社会论坛将于7月5日9:00-12:00与你相约直播间WAIC2024上海杨浦同济大学哔哩哔哩多平台同步直播探讨智能社会与全球治理框架WAIC...

约基奇:森林狼换来戈贝尔时大家都在嘲笑 他们的阵容框架很不错

直播吧5月4日讯西部季后赛半决赛,掘金将迎战森林狼,约基奇赛前接受采访。约基奇说道:“当蒂姆-康纳利(森林狼总经理、前掘金总经理&曾选中约基奇)做了那笔交易(换来戈贝尔)时,每个人都在嘲笑他...

视频号带货为什么一个流量都没有?顶级分析框架送给你

视频号带货为什么一个流量都没有?遇到问题,一定是步步来分析内容,视频号带货一个流量都没有,用另外一个意思来讲,就可以说是零播放。为什么视频号带货一个流量都没有?跟你说再多,都不如来个分析框架。1、是否...

取消回复欢迎 发表评论: