通过Struts2的拦截器实现文件上传/上传文件功能

struts.xml配置内容如下:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN""http://struts.apache.org/dtds/struts-2.3.dtd">
<struts><!-- 是否启用开发模式 --><constant name="struts.devMode" value="true"/><!--<constant name="struts.i18n.encoding" value="utf-8"/>--><package name="interceptor" extends="struts-default" namespace=""><!-- http://localhost:8080/sf/uploadform.action --><action name="uploadform"><result name="success">/WEB-INF/jsp/uploadform.jsp</result></action><action name="upload" class="priv.lwx.struts2.fileupload.web.UploadAction"><!--这个拦截器负责将客户端上传的文件存储到临时的缓存目录下,并且获取临时文件的路径、名称以及文件类型。--><interceptor-ref name="fileUpload"><!--设定上传的文件最大字节数为1M--><param name="maximumSize">1048576</param></interceptor-ref><interceptor-ref name="basicStack"/><!--basicStack这个拦截器栈含有将参数值注入到Action中相应的属性中的拦截器--><result name="success">/WEB-INF/jsp/uploadimage.jsp</result></action></package>
</struts>

BaseAction的代码如下:

package priv.lwx.struts2.fileupload.web;import org.apache.struts2.interceptor.ServletRequestAware;
import org.apache.struts2.interceptor.ServletResponseAware;
import org.apache.struts2.interceptor.SessionAware;
import org.apache.struts2.util.ServletContextAware;import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.Map;/*** description** @author liaowenxiong* @date 2022/5/9 09:36*/public class BaseAction implements SessionAware, ServletRequestAware, ServletResponseAware, ServletContextAware {protected Map<String, Object> session;protected HttpServletRequest request;protected HttpServletResponse response;protected ServletContext application;@Overridepublic void setServletRequest(HttpServletRequest httpServletRequest) {this.request = httpServletRequest;}@Overridepublic void setServletResponse(HttpServletResponse httpServletResponse) {this.response = httpServletResponse;}@Overridepublic void setSession(Map<String, Object> map) {this.session = map;}@Overridepublic void setServletContext(ServletContext context) {this.application = context;}
}

UploadAction的代码如下:

package priv.lwx.struts2.fileupload.web;import org.apache.commons.io.IOUtils;import java.io.*;/*** 实现文件上传功能** @author liaowenxiong* @date 2022/5/13 15:02*/public class UploadAction extends BaseAction {/* 注意:属性 xxxFileName、xxxContentType 是固定的写法,如在 jsp 页面<s:file label="File" name="some" />中的 name=“some”,那么在 UploadAction 中对应的 File 属性名为 some。但是,如果想取到文件名,那么需要写 someFileName,如果想取到文件类型,那么需要写 someContentType。*/private File some;private String someFileName;private String someContentType;private String imagePath;public String execute() throws IOException {System.out.println(application);System.out.println("缓存文件路径:" + this.some);System.out.println("源文件名:" + someFileName);System.out.println("文件类型:" + someContentType);// 生成随机的文件名String imageName = "file_" + System.currentTimeMillis() + someFileName.substring(someFileName.lastIndexOf("."));System.out.println("随机文件名:" + imageName);// 这个值在JSP页面中链接到图片时会使用到imagePath = "upload-image/" + imageName;System.out.println("imagePath:" + imagePath);// 获取目录upload-image的绝对路径String uploadPath = application.getRealPath("upload-image");// 判断目录upload-image是否存在,否则创建该目录File file = new File(uploadPath);if (!file.exists()) {file.mkdirs();}// 将imagePath存储到request对象中// request.setAttribute("imagePath", imagePath);// 将imagePath存储到application对象中application.setAttribute("imagePath", imagePath);// 获取目标文件在服务器主机中的绝对路径String realPath = application.getRealPath(imagePath);System.out.println("文件的绝对路径:" + realPath);// 从缓存中读取图片BufferedInputStream bis = new BufferedInputStream(new FileInputStream(this.some));// 构造指向目标文件的字节输出流对象,用来向目标文件写入数据BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(realPath));// 写入数据到目标文件中IOUtils.copy(bis, bos);bis.close();bos.close();return "success";}public String test() {String imageName = "file_1652507858364.JPG";imagePath = "upload-image/" + imageName;System.out.println("imagePath:" + imagePath);return "success";}public String test1() throws IOException {return execute();}public File getSome() {return some;}public void setSome(File some) {this.some = some;}public String getSomeFileName() {return someFileName;}public void setSomeFileName(String someFileName) {this.someFileName = someFileName;}public String getSomeContentType() {return someContentType;}public void setSomeContentType(String someContentType) {this.someContentType = someContentType;}public String getImagePath() {return imagePath;}public void setImagePath(String imagePath) {this.imagePath = imagePath;}
}

uploadform.jsp 的代码如下:

<%@ taglib prefix="s" uri="/struts-tags" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>文件上传</title>
</head>
<body>
<h1>文件上传
</h1>
<s:form action="upload" method="post" theme="xhtml" enctype="multipart/form-data"><s:file label="File" name="some"/><s:submit value="提交"/>
</s:form>
<br/>
<br/>
<br/>
</body>
</html>

uploadimage.jsp 的代码如下:

<%@ page import="java.util.Enumeration" %>
<%@ taglib prefix="s" uri="/struts-tags" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>Title</title>
</head>
<body>
<h1>文件上传成功
</h1>
<%Enumeration<String> attributeNames = request.getAttributeNames();while (attributeNames.hasMoreElements()) {String attributeName = attributeNames.nextElement();System.out.println(attributeName);}
%>
<%--这个EL表达式是去ValueStack中的root对象中获取属性imagePath的值--%>
<img src="${imagePath}"/>
<br/>
<img src="${applicationScope.imagePath}"/>
<br/>
<%--这个OGNL表达式是去ValueStack中的context对象中获取到ServletContext对象,然后再获取该对象中的属性imagePath的值--%>
<img src="<s:property value="#application.imagePath"/>"/>
<br/>
<%--这个OGNL表达式是去ValueStack中的root对象中获取属性imagePath的值--%>
<img src="<s:property value = 'imagePath'/>"/>
<br/>
<%--<s:debug/>--%>
<br/>
<br/>
</body>
</html>

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

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

相关文章

java获取ram_Java:ChronicleMap第2部分,超级RAM映射

java获取ram诸如无处不在的HashMap类的标准Java Map最终受到可用RAM的限制。 阅读本文并了解如何创建几乎无限大小甚至超过目标计算机RAM大小的Java Map。 内置的Map实现&#xff0c;例如HashMap和ConcurrentHashMap &#xff0c;只要它们相对较小&#xff0c;就可以正常工作。…

lifi与wifi的论文_Wifi_(毕业论文).doc

Wifi_(毕业论文)绪论2第一章 Wi-Fi技术概述31.1 无线局域网络31.1.1 IEEE 802.11系列标准31.1.2 无线局域网络概述31.2 Wi-Fi概念的引入41.2.1 Wi-Fi技术41.2.2 怎样使用Wi-Fi41.2.3 谁可以使用Wi-Fi5第二章 Wi-Fi技术的分析62.1 Wi-Fi与其他技术的对比分析6参 考 文 献8绪论Wi…

os引导程序boot从扇区拷贝os加载程序loader文件到内存(boot copy kernel to mem in the same method)

【0】README 0.1&#xff09; 本代码旨在演示 在boot 代码中&#xff0c;如何 通过 loader文件所在根目录条目 找出该文件的 在 软盘所有全局扇区号&#xff08;簇号&#xff09;&#xff0c;并执行内存中的 loader 代码&#xff1b;0.2&#xff09; 此代码非常重要&#xff0…

Struts2的资源文件和国际化(i18n)

文章目录资源文件的命名资源文件基名的指定struts.xml 文件指定资源文件的基名struts.properties 文件指定资源文件的基名通过标签 i18n 指定资源文件的基名资源文件的位置包级资源文件类级资源文件全局级资源文件默认资源文件资源文件的加载顺序Action 中加载资源文件在 JSP 中…

java设计模式之装饰模式_Java中的装饰器设计模式

java设计模式之装饰模式装饰器设计模式允许在运行时将附加职责或行为动态附加到对象。 它是一种结构模式&#xff0c;利用聚合来组合这些行为。 在本教程中&#xff0c;我们将学习实现装饰器模式。 UML图&#xff1a; 让我们从装饰器模式的UML表示开始&#xff1a; Concrete…

qml 自定义消息框_Qt qml 自定义消息提示框

版权声明&#xff1a;本文为博主原创文章&#xff0c;遵循 CC 4.0 BY-SA 版权协议&#xff0c;转载请附上原文出处链接和本声明。本文链接&#xff1a;https://blog.csdn.net/a844651990/article/details/78376767Qt qml 自定义消息提示框QtQuick有提供比较传统的信息提示框Mes…

计算机器内存数量+引入和显示ARDS成员

【1】README 1.1&#xff09; 本代码在于读取内存中多个 内存段的地址范围描述符结构体&#xff08;ARDS&#xff09;&#xff0c;有多少个内存段可以用&#xff1b;1.2&#xff09; source code and images in the blog from orange’s implemention of a os 1.3&#xff09;…

Maven Java 项目中,pom.xml 文件的依赖标签作用解读(<dependency/>)

该标签会让 Maven 自动到本地仓库或远程仓库去查找构件&#xff0c;找到后会自动创建项目级别的资源库&#xff0c;然后会将资源库同步到依赖此构件的模块的 classpath 中&#xff0c;也就是模块的依赖库中&#xff0c;如下图所示&#xff1a; classpath 就是类路径&#xff0…

自我审视记录本_春天重新审视战略模式

自我审视记录本这篇博客文章希望展示另一种方法&#xff0c;该方法如何通过依赖注入实现策略模式。 作为DI框架&#xff0c;我选择Spring框架 首先&#xff0c;让我们看一下如何以经典方式实施策略模式。 作为起点&#xff0c;我们有一个HeroController &#xff0c;应该在He…

如何用python编程机器人培训_机器人编程怎么入门?

打个广告(更新于2017.03.30)坐标上海&#xff0c;上海微创医疗器械(集团)有限公司&#xff0c;机器人子公司在研产品主要是腹腔镜手术机器人、骨科手术机器人等招聘&#xff1a;机器人算法工程师软件工程师机器人控制工程师具体岗位要求&#xff0c;请移步另一个回答&#xff1…

Struts2的校验器详解/验证框架详解/校验框架详解

文章目录简介使用校验器步骤演示案例常用校验器requiredrequiredstringstringlengthregexintdoublefieldexpressionemailurldateconversionvisitorexpression参考简介 Struts2 的校验器是在后端对前端提交的数据进行校验&#xff0c;在调用 Action 的指定方法前会先调用校验器…

os引导程序boot 在根目录区寻找os加载程序文件loader 对应的根目录条目

【0】README 0.0&#xff09; source code from orange’s implemention of a os and for complete code , please visit https://github.com/pacosonTang/Orange-s-OS/blob/master/boot.asm0.1&#xff09;本代码仅用于在 根目录区条目中寻找 与 boot代码定义的LoaderFileName…

lambda层保存模型出错_保存您的lambda,以备不时之需-保存到文件

lambda层保存模型出错介绍 简短的帖子&#xff0c;描述了如何将Java lambda持久化到文件中以在不同的过程中重复使用。 序列化Lambda Java 8中引入的Lambda使函数成为Java语言的一等公民&#xff08;几乎&#xff09;。 他们不需要专门的类来保存函数。 但是&#xff0c;这是如…

angular4更改表单中显示的值_angular4 Form表单相关

ng4中&#xff0c;有两种方式去声明一个表单一&#xff1a;Template-Driven Forms - 模板驱动式表单 [引入FormsModule]1.ngForm赋值[可以方便的获取表单的值]nameusername[(ngModel)]login.usernamerequired>Name is required.2.ngModel绑定[ngModel会自动关联表单控件na…

A20地址线问题

【0】README text description from Zhaojiong’s perfect analysis of Linux kernel . 【1】A20地址线问题&#xff08;干货来了&#xff09; 1981年8月&#xff0c;IBM公司最初推出的个人计算机IBM PC 使用的CPU 是 Intel 8088。在该微机中地址线只有20根&#xff08;A0~A1…

java观察者设计模式_Java中的观察者设计模式

java观察者设计模式在本教程中&#xff0c;我们将讨论Observer设计模式。 观察者模式有两个主要方面- 主题和观察者 。 当我们的系统有多个对象&#xff08;称为观察者&#xff09;时 &#xff0c;将使用一个模式&#xff0c;即依赖于一个特定对象&#xff08; 主体&#xff0…

MacOS好用的截图工具

iShot 可以截取长图 高级功能需要付费 jietu 可以截图、录gif、MP4等等&#xff0c;自定义区域、全屏或者窗口&#xff0c;简直不要太方便。 Shottr 介绍地址&#xff1a; https://sspai.com/post/71485 https://www.appinn.com/shottr-for-macos/ cleanshot x Snipaste X…

js截取url问号前面_js截取url问号后参数并转化为对象

题目&#xff1a;js截取url问号后参数并转化为对象&#xff1b;function urlToObj(str){var obj {};var arr1 str.split("?");var arr2 arr1[1].split("&");for(var i0 ; i < arr2.length; i){var res arr2[i].split("");obj[res[0]…

HashMap的学习

文章目录HashMap特点原理示意图常用方法遍历元素LinkedHashMapHashMap 特点 1.世界上查询速度最快的数据结构 2.增删速度也很快 3.加载因子是集合存放的元素数量和散列数组长度的比值&#xff0c;建议加载因子 0.75&#xff0c;超过会自动扩容并且重新散列&#xff08;旧的数…

特权级概述(哥子就想知道CPU是如何验证特权级的)GATE+TSS

【0】README text description from orange’s implemention of a os . 【1】特权级概述 当当前代码段试图访问一个段或者门时&#xff0c;目标段的DPL将会和 CPL 以及段或门选择子的RPL相比较&#xff0c;如何比较&#xff1a;&#xff08;这里是干货&#xff09; &#xf…