nfine框架 上传文件_MVC之Struts2框架--你并不了解的高级应用

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

本书简介

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

本文内容为本书第四章

3a24a1c566f56a9acb3141ea168e4ac1.png

Struts2类型转换

1.Struts2内建的类型转换器

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

boolean和Boolean转换

char和Character转换

int和Integer转换

long和Long转换

float和Float转换

double和Double转换

字符串和Date转换

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

2.基于OGNL的类型转换

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

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形式:

List形式:

3.自定义类型转换

再某些特殊情况下,框架不知道如何把一个字符串转换成对应的复合对象,比如:将字符串abc,xyz转换成一个User实例,其中abc为name,xyz为pass。这时就需要自定义类型转换。

自定义类型转换需要实现TypeConverter或者继承DefaultTypeConverter、StrutsTypeConverter

4a97956f6b421fe1e746ce2f9c932788.png
2de8c46e1f7822974203c946eae97846.png

(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()方法

3353ed42c684e97462fea5ec70abfd8d.png

在validate方法中,一旦校验失败通过addFieldError方法添加进FieldError中。如果FieldError不为空,将自动跳转到input逻辑视图。

2.重写validateXxx()方法

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

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

65f5f402361d8f8c163392361093de16.png

使用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

8a2a0b3d0977fba28074ebb44feea97f.png

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

4.手动实现文件过滤

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

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

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

5.拦截器实现文件过滤

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

beb49e73354a1910c4960d68b8d73270.png

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的结果

67eda86b6cbd7afeb54cd4a85a6c4167.png

属性说明如下:

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

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中使用元素完成配置

参数值

也可以定义拦截器栈,来组合多个拦截器,使用元素

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

4.使用拦截器

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

14cfa3bb1244f9fbb14e8234fa3b90aa.png

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

5.配置默认拦截器

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

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

d4f2719df35700cae532be4f51e6fc4a.png

6.实现拦截器类

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

接口包含3个方法:

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

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

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

如下图:

ff3f8f95e13380f1185c0cd0d1ea7e4b.png

7.拦截方法的拦截器

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

71303963b40de48ed02a43be6215162b.png

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

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

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

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

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

要拦截的方法(多个逗号隔开)

不拦截的方法(多个逗号隔开)

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/557677.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

阿里云服务器ping不通解决办法

阿里云服务器ping不通解决办法 阿里云服务器ping不通解决办法(云服务器搭建完环境访问不了ip解决办法) 问题:这里的服务器我以阿里云为例最近搞服务器,然后Ubuntu16.04下搭建LAMP环境后发现输入ip(http://1XX.XX.XX.…

java移动端接口测试_走进Java接口测试之测试框架TestNG数据驱动(入门篇)

前言我们在前面的文章中,和大家分享过接口自动化测试一些基本的实现方法,但是,你很快就会发现,如果在测试脚本中硬编码测试数据的话,测试脚本灵活性会非常低。而且,对于那些具有重复的请求,而只…

Windows更新右下角出现 天气温度等提示,如何取消

Windows更新后出现桌面下面出现 天气温度等提示,如何取消 解决:点击鼠标右键

经济专业为什么学python_既然有了会计学专业,为什么还要有税收学专业?

很多人说会计学也学税务知识,税务局招收公务员也面向会计,税务师事务所也招会计专业,那还有设置税收学专业的必要吗?按照国际通用说法,税收学只是会计学的组成部分,也可以说是一个方向,考会计师…

解决MongoDB Compass

远程连接mongoDB踩过的坑 我使用的是阿里云的服务器,用在服务器上安装完mongoDB之后,使用mongoDB Compass远程连接,连接不上。防火墙27017端口开放了,阿里云安全组27017端口也开放了,还是无法成功。 最后发现ping我的…

预测回归_回归分析预测技术简介

回归分析的基本概念是用一群变量预测另一个变量的方法。通俗点来讲,就是根据几件事情的相关程度来预测另一件事情发生的概率。回归分析的目的是找到一个联系输入变量和输出变量的最优模型。回归方法有许多种,可通过 3 种方法进行分类:自变量的…

【MongoDB 工具篇】MongoDB Compass介绍与简单使用

MongoDB Compass 是一款GUI工具,用于对MongoDB进行简单管理。 1 软件环境 使用的软件分别为: MongoDB Compass 1.19.12 MongoDB 4.2.0 2 软件介绍 2.1 连接到主机界面 安装完MongoDB Compass后,打开软件,进入连接到主机界面…

计算机网络—一个自治系统有5个局域网,其连接图如图所示。LAN2至LAN5上的主机数分别为:91,150,3,15。该自治系统分配到的IP地址块为30.138.118/23。试给出每一个局域网的地址块

计算机网络:一个自治系统有5个局域网,其连接图如图所示。LAN2至LAN5上的主机数分别为:91,150,3,15。该自治系统分配到的IP地址块为30.138.118/23。试给出每一个局域网的地址块(包括前缀&#xf…

取消语法检测_中考取消了考纲,学生要如何得高分

日前,教育部宣布取消初中学业水平考试大纲。对于广州的考生而言,意味着中考考纲取消。连日来,这一消息引发了学生、家长、老师们的巨大关注。为此,广州日报邀请了广州大学附属中学语文一级教师王琪、数学高级教师罗剑文以及广州广…

某公司为本科以上学历的人重新分配工作,分配原则如下。 (1)如果年龄不满18岁,学历是本科,男性要求报考研究生,女性则担任行政工作; (2)如果年龄满18岁不满5o 岁,学历本科,不分男女,任中层领导

软件测试——决策表 10.某公司为本科以上学历的人重新分配工作,分配原则如下。 (1)如果年龄不满18岁,学历是本科,男性要求报考研究生,女性则担任行政工作; (2)如果年龄满18岁不满5o 岁,学历本科,不分男女&…

.某学校的学生公寓有14栋楼,用A~N这14个大写字母的其中一个代表楼号,每栋楼的层数为6层,用1~6六个数字表示。每层楼有40个房间,编号为01~40。具体表示一个宿舍房间时,用1个字母加3位数字表

软件测试——等价类划分法 1.某学校的学生公寓有14栋楼,用A~N这14个大写字母的其中一个代表楼号,每栋楼的层数为6层,用1~6六个数字表示。每层楼有40个房间,编号为01~40。具体表示一个宿舍房间时…

如何免费下载和安装Windows 11

微软今天放出了 Windows 11 Build 22000.51 预览版,如果你想要尝鲜或者冒险,那么本文分享如何免费下载和安装 Windows 11 的小技巧。再次需要提醒的是,目前 Windows 11 系统极不稳定,充斥着大量 BUG,可能会导致系统崩溃…

北大青鸟消防控制器组网_北大青鸟JBF-61S20防火门监控器控制器接线示意图

北大青鸟JBF-61S20防火门监控器控制器接线示意图一,北大青鸟JBF-61S20防火门监控器控制器接线示意图功能防火门控制及状态 监测功能手动、自动关闭常开防火门;实时监控常开或常闭防火门的状态信息,并进行上报和显示。联网功能监控器可以与青鸟…

sqlserver发布订阅无法初始化快照_SQLServer2008R2 发布订阅及相关问题解决办法

前言:前两天接到领导的任务,将一个系统A的客户数据同步到另一个系统B中,以后客户录入入口只有A系统,B系统不提供录入入口,因为各种原因不能使用接口方式A系统和B系统直接交互同步,只能通过数据库重A库同步到…

怎么在linux上修改mysql端口映射_如何在Linux中更改默认的MySQL / MariaDB端口

在本指南中,我们将学习如何更改MySQL / MariaDB数据库在CentOS 7和基于Debian的Linux发行版中绑定的默认端口。 MySQL数据库服务器在Linux和Unix下运行的默认端口是3306 / TCP 。为了在Linux中更改默认的MySQL / MariaDB数据库端口,请通过执行以下命令打…

hashmap为什么线程不安全_StringBuilder为什么线程不安全?

点击上方“Java知音”,选择“置顶公众号”技术文章第一时间送达!作者:千山juejin.im/post/5d6228046fb9a06add4e37fe引言面试官:StringBuilder和StringBuffer的区别在哪?我:StringBuilder不是线程安全的&am…

JAVA中的那些名词解释

1.JDO: (Java Data Object )是Java对象持久化的新的规范,也是一个用于存取某种数据仓库中的对象的标准化API.作用:用于存取某种数据仓库中的对象 2.JPA: JPA是Java Persistence API的简称,中文名Java持久层API,是JDK 5.0注解或XML描述对象&a…

mysql资质_MySQL语句与Java代码实现按需过滤企业员工的资质证书

在企业ERP中,每位员工拥有多个资质证书,资质证书有种类、名称和登记时间,以及变动时间和结束时间的主要属性;现在有一个需求,员工在系统查看自己的信息之时:同一种类、同一名称、同一登记时间的资质证书&am…

IDEA快捷键调整字体大小 设置 (Ctrl+滚轮) 调整字体大小

IDEA设置Ctrl滚轮调整字体大小 第一步:打开idea 设置界面: 第二步:勾选上下图中红色部分即可实现 保存后,ctrl滚轮就能改变代码字体大小

随机森林特征重要性计算_R语言随机森林模型中具有相关特征的变量重要性

原文链接:http://tecdat.cn/?p13546​tecdat.cn变量重要性图是查看模型中哪些变量有趣的好工具。由于我们通常在随机森林中使用它,因此它看起来非常适合非常大的数据集。大型数据集的问题在于许多特征是“相关的”,在这种情况下,…