第七章 struts2的上传下载
《开始Struts 2》
第七章
struts2的上传下载
序
文件上传是Web应用经常需要面对的问题,在大部分时候,用户的请求参数是在表单域输入的字符串,但如果为表单元素设置enctype="multipart/form-data”属性,则提交表单时不再以字符串方式提交请求参数,而是以二进制编码的方式提交请求,此时直接通过HttpServletRequest的getParamete:方法无法正常获取请求参数的值,我们可以通过二进制流来获取请求内容—通过这种方式,就可以取得希望上传文件的内容,从而实现文件的上传。
Struts 2 未提供自己的请求解析器,也就是说,Struts 2不会自己去处理multipart/form-data的请求,它需要调用其他请求解析器,将HTTP请求中的表单域解析出来。但Struts 2在原有的上传解析器基础上做了进一步封装,更进一步简化了文件上传。
在Struts 2的struts.properties配置文件中,我们看到了下面的配置代码,它们主要用于配置Struts 2上传文件时的卜传解析器。
#指定使用cos的文件上传解析器
# struts.multipart .parser=cos
#指定使用Pell的文件上传解析器
#struts.multipart.parser=pell
#Struts 2默认使用Jakarta的Common-FileUpload的文件上传解析器
struts.multpart .parser=jakarta
Struts 2默认使用的是Jakarta的Common-FileUpload的文件上传框架,要使用Struts 2的文件上传功能,则需要在Web应用中增加两个commons-io-1.3. l .ja:和commons-fileupload-1.2. jar
文件上传
例子:
上传页面
上传的action
private String fileDesc;//和前台的是同一个
private File file;//这是IO的File,回顾下strust1.x的FormFile
//这两个字段是被注入进来的,前台页面并没有这两个表单域
private String fileFileName;
private String fileContentType;
/**
* 获得保存的路径
*/
private String getSaveDir(){
return
ServletActionContext.getServletContext().getRealPath("/userDatas");
}
@Override
public String execute() throws Exception {
值得注意的是,上面的Action还包含了两个属性:uploadFileName和uploadContentType,这两个属性分别用于封装上传文件的文件名、上传文件的文件类型。这两个属性,体现了Struts 2设计的灵巧、简化之处,Action类直接通过File类型属性直接封装了上传文件的文件内容,但这个File属性无法获取上传文件的文件名和文件类型,所以Struts 2直接将文件域中包含的上传文件名和文件类型的信息封装到fileFileName和fileContentType属性中。可以认为:如果表单中包含一个name属性为xxx的文件域,则对应Action需要使用3个属性来封装该文件域的信息:
?.类型为File的xxx属性封装了该文件域对应的文件内容。这是临时文件,在action调用execute后
临时文件会被删除
?·类型为String的xxxFileName属性封装了该文件域对应的文件的文件名。
?·类型为String的xxxContentType属性封装了该文件域对应的文件的文件类型。
如果要搞清楚struts的上传机制,我们可以打开strust中fileupload拦截器的源代码
上传的其他处理:
1.限制文件的大小
2.限制文件的上传类型
3.上传临时目录的设定
限制文件的大小
在struts2的默认大小是2M,我们可以打开struts.properites,查看相关设置,然后在struts.xml将相关设置覆盖掉:
### Parser to handle HTTP POST requests, encoded using the MIME-type
multipart/form-data
# struts.multipart.parser=cos
# struts.multipart.parser=pell
struts.multipart.parser=jakarta
# uses javax.servlet.context.tempdir by default
struts.multipart.saveDir=
struts.multipart.maxSize=2097152
这里要强调的是,我们虽然设置了文件的临时目录,而且struts2在上传动作完毕后会自动执行删除,但这个自动删除不一定每次都能删除成功的,所以struts2设定了一个filter,用来每隔一段时间检测临时目录,如果有文件
限制文件的类型
在查看fileupload的拦截器源代码时,我们发现如下两个属性:
1.allowedTypes
2.maximumSize
错误信息显示:
当上传文件出现错误时,我们设定了“input”为上传页面,即出现错误的话,回到上传页面,我们在上传页面稍作修改,添加如下代码:
我们上传一个错误类型的文件,发现:
如果要自定义消息内容的话:
我们就要加入消息资源文件了,首先在struts.xml中加入:
关于key的来源和占位符的替代值可以参看fileupload拦截器的源代码的acceptFile方法
同时上传多个文件:
同时上传多个文件和上传单个文件的过程是一模一样的,只不过要满足以下条件:
1.前台可以将多个文件域的name属性设置成一样
2.在action中用数组或List来接收前台的File
3.循环数组或list,对每个File对象进行操作
文件的下载:
Struts下载主要是配置好一个result,这个result的类型是“stream”类型的,可去struts-default.xml查找相应的源代码:这里只贴出下载的代码和配置:
Action
//告诉浏览器数据是以下载的形式接收
private String contentType="application/x-msdownload";
//告诉浏览器数据将要下载的文件的文件名
private String contentDisposition="attachment;filename=";
//设置服务器读取文件的缓冲区大小
private String bufferSize="2048";
//前台提交过来需要下载的文件的文件名、路径
private String fnamepath;
@Override
public String execute() throws Exception {
File temp = new File(fnamepath);
this.contentDisposition+=temp.getName();
return"down";
}
/**
* 此方法将文件多对应的读取流拿到,getFile是和配置文件中inputName对应的
*/
public InputStream getFile(){
return
ServletActionContext.getServletContext().getResourceAsStream("/userDatas/"+fnamepat h);
}
扩展:
下载前检查用户是否登录或者检查用户的下载积分够不够
提示:
在action中execute方法中返回“down”这个result之前,先检查session中user的相关属性
Struts2之输入校验
一、Struts2输入校验介绍 Struts2的输入校验和类型转换都是对请求参数进行处理。 输入校验顾名思义就是请求参数是否能够满足一定的要求; 客户端校验&服务器端校验 客户端校验是指在浏览器这端通过Javascript进行初步校验,为了减轻服务器端的负载;服务器端校验是校验数据的最后一道防线; 在Struts2中,数据校验不需要写任何代码,只需要一个配置文件,配置校验的条件就可以了,非常简单;因此数据校验文件是数据校验的最重要的内容; 二、数据校验规则文件 1.数据校验规则文件规则: 1.此文件中规定了参数的一些校验条件; 2.可以包括字段型校验器和非字段型校验器; 3.命名规则:ActionName-validation.xml,其中ActionName是Action类的名字; 4.每个Action都有一个validation文件,规则文件放在和Action同目录下; 5.在前面我们讲到的配置逻辑action中,如果需要对某个逻辑Action配置数据校验文件,则命名规则为:ActionName-LogicActionName-validation.xml; 6.注意:当需要对逻辑action进行校验时,如果存在一般形式的ActionName-validaton.xml 文件,则也会对此逻辑Action进行校验; 7.输入校验失败后,和类型转换一样,会将错误封装成fieldError,并放入Action Context 中,因此在JSP中添加
Struts2学习笔记
Struts2项目的构建与配置 1.配置struts.xml (1)配置struts.xml可以参考下载的struts-2.3.14.1-all.zip解压后的apps文件夹下的 参考项目的struts.xml文件。 (2)主要的配置如下:
Struts2校验器类型详解
Struts2校验器类型详解 一、Struts2内建校验器 位于xwork-2.0.4.jar压缩包中(com.opensymphony.xwork2.validator.validators)有个文件default.xml ,该文件中定义了Struts2框架内建的校验器。default.xml文件定义了常用的校验器类型。 首先搞清楚: struts2字段校验器与非字段校验器的区别 字段校验器配置格式:
Struts2+Spring3+Hibernate4+Maven整合
Struts2+Spring3+Hibernate4+Maven整合 目录 1.建立Maven工程 2.搭建Spring3 3.搭建Struts2并整合Spring3 4.搭建Hibernate4并整合Spring3 内容 1.建立Maven工程 第一步: 第二步:
第三步:
第四步: 注意:这里的JDK要选择默认的,这样别人在使用的时候,如何JDk不一致的话也不会出错,如下图所示:
第五步: Maven标准目录 src/main/java src/main/resources src/test/java src/test/resources 第六步: 发布项目:Maven install 清除编译过的项目:Maven clean
OK,Mean 工程创建成功! 2. 搭建 Spring3
(1)下载Spring3需要的jar包 1.spring-core 2.spring-context 3.spring-jdbc 4.spring-beans 5.spring-web 6.spring-expression 7.spring-orm 在pom.xml中编写Spring3需要的包,maven会自动下载这些包。
struts2复习题(含答案)
Struts2复习题 1.以下属于struts2的控制器组件是: 2.以下属于struts2的体系结构的是:(多选) 控制器组件配置文件 3.以下属于struts2配置文件中的配置元素是:(多选) A.
Struts2的工作机制原理分析及实例
Struts2的工作机制分析及实例 一、概述 本章讲述Struts2的工作原理。 读者如果曾经学习过Struts1.x或者有过Struts1.x的开发经验,那么千万不要想当然地以为这一章可以跳过。实际上Struts1.x 与Struts2并无我们想象的血缘关系。虽然Struts2的开发小组极力保留Struts1.x的习惯,但因为Struts2的核心设计完全改变,从思想到设计到工作流程,都有了很大的不同。 Struts2是Struts社区和WebWork社区的共同成果,我们甚至可以说,Struts2是WebWork的升级版,他采用的正是WebWork 的核心,所以,Struts2并不是一个不成熟的产品,相反,构建在WebWork基础之上的Struts2是一个运行稳定、性能优异、设计成熟的WEB框架。 本章主要对Struts的源代码进行分析,因为Struts2与WebWork的关系如此密不可分,因此,读者需要下载xwork的源代码,访问https://www.360docs.net/doc/6311469656.html,/xwork/download.action即可自行下载。 下载的Struts2源代码文件是一个名叫struts-2.1.0-src.zip的压缩包,里面的目录和文件非常多,读者可以定位到 struts-2.1.0-src\struts-2.0.10\src\core\src\main\java目录下查看Struts2的源文件,如图14所示。 (图14) 二、主要的包和类 Struts2框架的正常运行,除了占核心地位的xwork的支持以外,Struts2本身也提供了许多类,这些类被分门别类组织到不同的包中。从源代码中发现,基本上每一个Struts2类都访问了WebWork提供的功能,从而也可以看出Struts2与WebWork千丝万缕的联系。但无论如何,Struts2的核心功能比如将请求委托给哪个Action处理都是由xwork完成的,Struts2只是在WebWork 的基础上做了适当的简化、加强和封装,并少量保留Struts1.x中的习惯。
struts2 实验报告
1.系统分析与设计 1.1 系统功能描述 本系统是个非常简单的注册、登录系统。本系统的实现是基于Struts2、Spring、Hibernate 三个框架,系统功能单一,业务逻辑简单。 当用户注册信用户时,就是向系统中增加一个新用户,对应的数据库增加一条记录。 当用户输入注册信息时,系统提供了基本的输入验证判断用户输入是否合法,只有当用户输入满足基本输入要求时,才会被提交到实际的登录系统,进行实际的登录处理。 系统还使用了随机产生的图形验证码来防止刷新,防止用户通过单击浏览器的书安心按钮来重复注册多个用户。 系统还提供了一种Ajax方式来验证用户输入的注册名是否有效,系统要求所有的用户名不能重复。故当用户输完用户名后,系统立即在页面上方提示用户该用户名是否可用,如果系统中没有该用户名,则系统提示该用户名可用;否则提示用户该用户名重复,用户必须重新选择用户名注册。 当用户注册一个新用户名之后,就可以使用系统的登录功能来登录系统了,用户输入登录用的用户名、密码后,系统一样提供了基本的输入校验。 除此之外,系统还采用了随机产生图形验证码来防止恶意用户的暴力破解,系统随机生成一个图形验证码,而用户登录必须输入图形验证码中显示的字符串,只有用户输入的字符串和系统随机生成的验证码字符相同时,系统才允许用户登录。 1.2 系统功能流程
1.3 数据库设计 相关的映射文件:
struts2.3.20环境搭建详解
Create Struts 2 Web Application With Artifacts In WEB-INF lib and Use Ant To Build The Application Edit Page Browse Space Add Page Add News You can download this complete example, Basic_Struts2_Ant, from Google Code - https://www.360docs.net/doc/6311469656.html,/p/struts2-examples/downloads/list. Click on the link for Basic_Struts2_Ant.zip and save the file to your computer. Unzip the file and you should have a folder named Basic_Struts2_Ant. In that folder is a README.txt file with instruction on how to build and run the application. Icon This tutorial assumes you already know how to create a Java web application, use Ant to build the web application archive (war) file, and deploy the war file to a Servlet container such as Tomcat or Jetty. To create a Struts 2 web application with the Struts 2 artifacts added to the the application's class path manually you will need to download the Struts 2 distribution from the Apache Struts website. On the Struts 2 download page, click on the link for the current General Availability release. In that release's section you'll find several links. To get started with a basic Struts 2 web application you need to only download the Essential Dependencies Only zip file, which is approximately 12mb. After downloading this zip file, unzip it. You should have a folder named the same as the current general availability release and in that folder will be a lib folder. The lib folder contains the Struts 2 jar files (e.g. struts2-core-X.X.X.X.jar, where X.X.X.X is the version) and other jar files Struts 2 requires (e.g. xwork-core.X.X.X.jar). As we create our basic Struts 2 web application we will copy from the Struts 2 distribution lib folder just the jar files our application requires. As we add features to our application in future tutorials we will copy other jar files. Step 1 - Create A Basic Java Web Application In your Java IDE create a web application project named Basic_Struts2_Ant. To follow along with this tutorial your web application should have the following folder structure: Remember Struts 2 requires Servlet API 2.4 or higher, JSP 2.0 or higher, and Java 5 or higher. The example project, Basic_Struts2_Ant, which you can download from Google
Struts2校验器类型
Struts2校验器类型 10.3 验证器类型 可以把验证器类型分为两种:字段验证器和动作验证器。其中,字段验证器就像前面演示的那样,只验证提交的表单内的单个字段;而动作验证器一般验证提交的表单内的多个字段的关系,比如,录入产品信息的时候,产品的进价不能高于售价。 无论是哪种验证器,都需要考虑以下几个问题: ?验证谁? ?使用什么条件验证? ?不满足条件显示什么结果? ?不满足验证条件时显示的结果出现在页面的什么位置? 10.3.1字段验证器 字段验证器用来验证提交的表单内的单个字段,如同前面的示例,在验证文件里: java代码: 查看复制到剪贴板打印 1.
Struts 2 异常处理的常用的解决方法
一、第一个异常处理 严重: Servlet.service() for servlet jsp threw exception The Struts dispatcher cannot be found. This is usually caused by using Struts tags without the associated filter. Struts tags are only usable when the request has passed through its servlet filter, which initializes the Struts dispatcher needed for this tag. - [unknown location] at org.apache.struts2.views.jsp.TagUtils.getStack(TagUtils.java:60) at org.apache.struts2.views.jsp.StrutsBodyTagSupport.getStack(StrutsBodyTagSupport.java:44) at https://www.360docs.net/doc/6311469656.html,ponentTagSupport.doStartTag(ComponentTagSupport.java:48) at https://www.360docs.net/doc/6311469656.html,_005fstruts2_005flz.YpxxbQuery_jsp._jspx_meth_s_005fdebug_005f0(Ypxxb Query_jsp.java:108) at https://www.360docs.net/doc/6311469656.html,_005fstruts2_005flz.YpxxbQuery_jsp._jspService(YpxxbQuery_jsp.java:83) 解决的办法:(4种解决方案) 1. web.xml 中添加一个filter
struts2国际化配置
前提条件:strut2的必须架包已经引入,struts2的配置文件全部配置完成 1.首先创建一个struts.properties在src目录下,服务器启动时候会自动加载该文件,在这个文件中写入struts.custom.i18n.resources=globalMessages,服务器会自动选择前缀为globalMessages资源文件。(或者你在你的struts.xml文件中添加
struts2面试题(自己总结)
Struts2面试题 1、struts2工作流程 Struts 2框架本身大致可以分为3个部分: 核心控制器FilterDispatcher、业务控制器Action和用户实现的企业业务逻辑组件。核心控制器FilterDispatcher是Struts 2框架的基础,
包含了框架内部的控制流程和处理机制。 业务控制器Action和业务逻辑组件是需要用户来自己实现的。 用户在开发Action和业务逻辑组件的同时,还需要编写相关的配置文件, 供核心控制器FilterDispatcher来使用。 Struts 2的工作流程相对于Struts 1要简单,与WebWork框架基本相同, 所以说Struts 2是WebWork的升级版本。基本简要流程如下: 1 、客户端初始化一个指向Servlet容器的请求; 2、这个请求经过一系列的过滤器(Filter) (这些过滤器中有一个叫做ActionContextCleanUp的可选过滤器, 这个过滤器对于Struts2和其他框架的集成很有帮助,例如:SiteMesh Plugin) 3 、接着FilterDispatcher被调用, FilterDispatcher询问ActionMapper来决定这个请是否需要调用某个Action 4、如果ActionMapper决定需要调用某个Action, FilterDispatcher把请求的处理交给ActionProxy 5、ActionProxy通过Configuration Manager询问框架的配置文件, 找到需要调用的Action类 6、ActionProxy创建一个ActionInvocation的实例。 7、ActionInvocation实例使用命名模式来调用, 在调用Action的过程前后,涉及到相关拦截器(Intercepter)的调用。 8、一旦Action执行完毕,ActionInvocation负责根据struts.xml中的配置找到对应的返回结果。返回结果通常是(但不总是,也可能是另外的一个Action链)一个需要被表示的JSP 或者FreeMarker的模版。在表示的过程中可以使用Struts2 框架中继承的标签。在这个过程中需要涉及到ActionMapper 9、响应的返回是通过我们在web.xml中配置的过滤器 10、如果ActionContextCleanUp是当前使用的,则FilterDispatecher将不会清理sreadlocal ActionContext;如果ActionContextCleanUp不使用,则将会去清理sreadlocals。 2、说下Struts的设计模式 MVC模式: web应用程序启动时就会加载并初始化ActionServler。用户提交表单时,一个配置好的ActionForm对象被创建,并被填入表单相应的数据,ActionServler根据Struts-config.xml文件配置好的设置决定是否需要表单验证,如果需要就调用ActionForm的Validate()验证后选择将请求发送到哪个Action,如果Action不存在,ActionServlet会先创建这个对象,然后调用Action的execute()方法。Execute()从ActionForm对象中获取数据,完成业务逻辑,返回一个ActionForward对象,ActionServlet再把客户请求转发给ActionForward对象指定的jsp组件,ActionForward对象指定的jsp生 成动态的网页,返回给客户。
Struts 2期末考试
1、MVC模式(View-model-controller) 2、MVC模式的优点: (1)低耦合性。视图层、模型层和控制层分离,很容易改变应用程序的数据层和业务规则,只需改变MVC的模型层就可以了。 (2)高重用性。多个视图可以对应一个模型,这样减少了代码的重复性及维护量,一旦模型发生改变,也易于维护。 (3)可实用性。MVC允许使用各种不同的表现层技术来访问同一个服务器端的代码。如jsp、velocity等。 (4)可维护性。3个模块层相分离,是的web应用更易维护和修改。 3、model2模式下,模型用javaBean充当,视图有jsp页面充当,控制器由servlet充当。 4.struts2是在struts1的基础上发展起来的,以webwork 为核心,采用webwork的设计理念。Struts2是webwork 的升级。 5、webwork是基于MVC架构模式的J2EE Web框架,现在的最新版本被拆分为XWork和WebWork2两个项目。WebWork的优点: (1)action不需要与WebWork耦合,提高了代码的重用率。 (2)支持更多表现层技术,从而有更好的适用性。Webwork的特征: (1)灵活的validation框架。运行开发者在XML文件中定义验证内容,在运行时通过interceptor自动应用,这样可以脱离Action类。 (2)Interceptor。在action处理的前后实现动态拦截,简化action代码。 (3)支持I18N (4)支持OGNL表达式语言 (5)Type Conversion.允许类之间很容易实现对象的转换。(6)允许动态对象图表遍历和方法执行,使用valuestack 透明访问多beans的属性。 (7)Ioc容器。管理组件的生命周期,使客户不需要通过创建注册类获得组件实例。 (8)velocity templates .使UI组件可重用,从而允许开发者很容易地定制Web页面的look&feel。 (9)容易和第三方软件集成。例如hibernate、spring和sitemesh。 (10)支持多种视图技术。如jsp、velosity、freemarker 和xml等。 6、struts2框架的大致处理流程: (1)客户端浏览器发送一个请求。 (2)核心控制器filterdispatcher根据请求决定调用合适的action。 (3)webwork的拦截器链自动对请求应用通过功能,如验证。 (4)回调action的execute()方法,该方法根据请求的参数来执行一定的操作。 (5)execute()方法的处理结果信息将被输出到浏览器中,struts2支持多种形式的视图。如jsp、html。 7、web.xml