SpringMVC一个拦截器和文件上传下载的完整程序代码示例以及IDEA2024部署报错 找不到此 Web 模块的 out\artifacts\..问题

一、SpringMVC一个拦截器和文件上传下载的完整程序代码示例

        本文章是一个 SpringMVC拦 截器和文件上传下载的完整程序代码示例,使用的开发工具是 IntelliJ IDEA 2024.1.6 (Ultimate Edition), 开发环境是 OpenJDK-21 java version 21.0.2。Tomcatt版本为9.0.96,整体程序目录结构如下:

        本程序演示了 SpringMVC中的  interceptor 拦截器的使用,基于此拦截器实现对其它控制器如后台控制器中用户管理的操作程序示例。同时在用户管理控制器添加了基于 spring 的 CommonsMultipartResolver 类实现 文件上传和文件下载的代码程序示例。

A、xml 配置文件

1. pom.xml 配置文件

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.kermit</groupId><artifactId>springmvc-05</artifactId><version>1.0-SNAPSHOT</version><properties><maven.compiler.source>21</maven.compiler.source><maven.compiler.target>21</maven.compiler.target><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding></properties><dependencies><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.13</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>5.3.39</version></dependency><dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId><version>3.1.0</version><scope>provided</scope></dependency><dependency><groupId>javax.servlet.jsp</groupId><artifactId>jsp-api</artifactId><version>2.2</version></dependency><dependency><groupId>javax.servlet</groupId><artifactId>jstl</artifactId><version>1.2</version></dependency><dependency><groupId>commons-fileupload</groupId><artifactId>commons-fileupload</artifactId><version>1.4</version></dependency></dependencies><build><resources><resource><directory>src/main/java</directory><includes><include>**/*.properties</include><include>**/*.xml</include></includes><filtering>false</filtering></resource><resource><directory>src/main/resources</directory><includes><include>**/*.properties</include><include>**/*.xml</include></includes><filtering>false</filtering></resource></resources></build></project>

2. web.xml 配置文件

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"version="4.0"><servlet><servlet-name>springmvc</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><init-param><param-name>contextConfigLocation</param-name><param-value>classpath:springmvc.xml</param-value></init-param><load-on-startup>1</load-on-startup></servlet><servlet-mapping><servlet-name>springmvc</servlet-name><url-pattern>/</url-pattern></servlet-mapping></web-app>

3. resource目录下springmvc.xml配置文件

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:mvc="http://www.springframework.org/schema/mvc"xmlns:context="http://www.springframework.org/schema/context"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/mvchttps://www.springframework.org/schema/mvc/spring-mvc.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd"><context:component-scan base-package="com.kermit.controller" /><mvc:default-servlet-handler /><mvc:annotation-driven /><bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="InternalResourceViewResolver"><property name="prefix" value="/WEB-INF/jsp/" /><property name="suffix" value=".jsp" /></bean><!--    文件上传的固定配置,不用修改--><bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver" ><property name="defaultEncoding" value="utf-8" />
<!--        最大上传大小 100M--><property name="maxUploadSize"  value="104857600" /><property name="maxUploadSizePerFile" value="104857600" /><property name="maxInMemorySize" value="10485760" /><property name="uploadTempDir" value="/WEB-INF/tmp" /></bean><!--    拦截器配置,/** 匹配所有, /admin/* 匹配 admin下面的请求。--><mvc:interceptors><mvc:interceptor><mvc:mapping path="/**"/><bean class="com.kermit.interceptor.AdminInterceptor" /></mvc:interceptor></mvc:interceptors></beans>

B、JAVA程序文件

1. controller下的LoginController 控制器程序

package com.kermit.controller;import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;import javax.servlet.http.HttpSession;@Controller
public class LoginController {//测试拦截器,并结合 session 试验登录 退出的基本逻辑。@RequestMapping("/login")public String login(){return "login";}@RequestMapping("/logincheck")public String logincheck(HttpSession session){session.setAttribute("admin", "kermit");return "redirect:/admin/user";}@RequestMapping("/logout")public String logout(HttpSession session){session.setAttribute("admin", null);return "redirect:/login";}
}

2. controller下的UserController 控制器程序

package com.kermit.controller;import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.commons.CommonsMultipartFile;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.net.URLEncoder;@Controller
public class UserController {//试拦截器@RequestMapping("/admin/user")public String index(Model model) {model.addAttribute("message", "Hello World");return "admin/user";}//测试spring 文件上传下载@ResponseBody@RequestMapping("/admin/upload")public String upload(@RequestParam("file") CommonsMultipartFile file, HttpServletRequest request) throws IOException {//处理用户上传的文件// 需要在 spring 配置里写一个 bean配置,固定的。String path = request.getServletContext().getRealPath("/upload");File realPath = new File(path);if (!realPath.exists()) {realPath.mkdirs();}System.out.println("realpath:"+ realPath);file.transferTo(new File(realPath + "/" + file.getOriginalFilename()));return "upload success.";}@ResponseBody@RequestMapping("/admin/download/{filename}")public String download(@PathVariable("filename") String filename, HttpServletRequest request, HttpServletResponse response) throws IOException {String path = request.getServletContext().getRealPath("/upload");if(filename == "") filename = "test.jpg";//清空BUFFER;response.reset();response.setCharacterEncoding("utf-8");response.setContentType("multipart/form-data");response.setHeader("Content-Disposition", "attachment; filename=\"" + URLEncoder.encode(filename, "UTF-8") + "\"");File file = new File(path, filename);InputStream inputStream = new FileInputStream(file);OutputStream outputStream = response.getOutputStream();byte[] buffer = new byte[1024];int index=0;while((index=inputStream.read(buffer))!=-1){outputStream.write(buffer, 0 ,index);outputStream.flush();}outputStream.close();inputStream.close();return "download success.";}
}

3. 拦截器 interceptor 下的 AdminInterceptor

package com.kermit.interceptor;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;public class AdminInterceptor implements HandlerInterceptor {@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {System.out.println("------------------pre-----------------");//登录页允许访问if(request.getRequestURI().contains("login")){return true;}//已登录用户直接放行if(request.getSession().getAttribute("admin") != null) {return true;}//其它页面如果未有 session 跳转request.getRequestDispatcher("/WEB-INF/jsp/login.jsp").forward(request, response);return false;}@Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {//HandlerInterceptor.super.postHandle(request, response, handler, modelAndView);System.out.println("------------------拦截后-----------------");}@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {System.out.println("------------------清理后-----------------");// HandlerInterceptor.super.afterCompletion(request, response, handler, ex);}
}

C、视图文件

1.  jsp下的login.jsp文件

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>登录页面</title>
</head>
<body>
未登录想直接去后台:被阻止
<a href="${pageContext.request.contextPath}/admin/user" ><input type="button" value="直接去后台" />
</a>已输入账号密码登录:<br><br><a href="${pageContext.request.contextPath}/logincheck" ><input type="button" value="跳转验证成功后进入后台" /></a></body>
</html>

2.  jsp下的index.jsp文件

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>Title</title>
</head>
<body>
${message}
</body>
</html>

3.  jsp下admin目录中的user.jsp文件

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>Title</title>
</head>
<body>
<h1>成功进入管理后台-用户页面</h1>
<br><h2>在此页面测试上传一个文件</h2>
<form action="${pageContext.request.contextPath}/admin/upload" method="post" enctype="multipart/form-data">Select file to upload:<input type="file" name="file" id="file"><input type="submit" value="Upload File" name="submit">
</form><h2>使用流下载一个文件</h2>
<a href="${pageContext.request.contextPath}/admin/download/24112.jpg">点击下载</a><br>
清理 session 退出<br><br>
<a href="${pageContext.request.contextPath}/logout" ><input type="button" value="退出后台" />
</a>
</body>
</html>

二、IDEA2024部署找不到此Web模块out\artifacts\等问题

1.  IDEA2024部署报错 找不到此 Web 模块的 out\artifacts\问题

       在使用 IDEA2024 开发项目时,多次修改了项目名称,移动了项目路径,导致出现了一些问题,完整的问题修复已经无法再完整记录。进行了各种尝试,部署都不能成功,报错。

        在这个过程中我删除了工件,然后点击+号重建,期间碰到报错:IDEA 无法保存设置 源根 D:XXXX在模块XXX中重复之类的错误。最后成功的一次是删除工件之后,在新建中选择 WEB应用程序展开型时选择了【基于模块】,最后才成功启动了项目。如下图所示:

最后成功后发现浏览器上的路径也有细微差别:

http://localhost:8080/springmvc_05_war_exploded/login   成功
http://localhost:8080/springmvc_05_Web_exploded/login  失败

         一个是war地址,一个是web地址。这是Web项目部署中,有两种常见的 exploded 形式:Web exploded 和 War exploded。Web exploded 都是将一个已经打包好的 Web 应用(通常是一个 WAR 文件)解压到指定的目录中。但两者有所不同,与 Web exploded的区别在于War exploded 只会将 WAR 文件中的类文件和库文件解压到指定的目录中,而不包括其他资源文件。这应该就是在出现问题的时候发现 jsp目录、web.xml文件都没有在 out 目录中显示。

2. MVN仓库网站 https://mvnrepository.com/ 总是要验证真人烦

        MVN仓库网站 https://mvnrepository.com/ 总是要验证真人烦,真觉得很烦!总是显示:正在验证你是否为真人,请耐心等待!而且我不只碰到过一次,它持续在这个页面循环跳了多次,还出现过失败!我直接浏览器里访问还不是真人吗?可见他的技术也就这个鸟样!这么明显的真人请求都能验错!

3. springmvc开发时getServletContex() 方法报红

        另外在使用 springmvc开发时,一段文件上传的代码里需要  HttpServletRequest request) 
request.getServletContext().getRealPath getServletContex() 方法报红找不到,相关的包也已经导入,是因为导入的包: javax.servlet-api 版本过低,目前使用的是2.5版本,导入 3.1.0 或者4.0.1 最新版都能解决。 

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

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

相关文章

【C++篇】类与对象的秘密(上)

目录 引言 一、类的定义 1.1类定义的基本格式 1.2 成员命名规范 1.3 class与struct的区别 1.4 访问限定符 1.5 类的作用域 二、实例化 2.1 类的实例化 2.2 对象的大小与内存对齐 三、this 指针 3.1 this指针的基本用法 3.2 为什么需要this指针&#xff1f; 3.3 t…

基于SSM+微信小程序的房屋租赁管理系统(房屋2)

&#x1f449;文末查看项目功能视频演示获取源码sql脚本视频导入教程视频 1、项目介绍 基于SSM微信小程序的房屋租赁管理系统实现了有管理员、中介和用户。 1、管理员功能有&#xff0c;个人中心&#xff0c;用户管理&#xff0c;中介管理&#xff0c;房屋信息管理&#xff…

Java基础-IO基础

IO是指input/output&#xff0c;即输入和输出。输入和输出是以内存为中心的&#xff1a; input 从外部往内存输入数据&#xff0c;比如硬盘中的数据写入内存等。 output 从内存往外输出数据&#xff0c;比如内存数据写入硬盘等。 File File类表示一个文件或者一个目录。使用F…

【服务器虚拟化是什么?】

&#x1f3a5;博主&#xff1a;程序员不想YY啊 &#x1f4ab;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f917;点赞&#x1f388;收藏⭐再看&#x1f4ab;养成习惯 ✨希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出…

父子元素中只有子元素设置margin-bottom的问题

问题代码如下所示 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Title</title><style>.div1 {background-color: red;width: 80px;height: 80px;border: 1px solid orange;}.div2 {bac…

【飞腾加固服务器】全国产化解决方案:飞腾FT2000+/64核,赋能关键任务保驾护航

在信息安全和自主可控的时代背景下&#xff0c;国产化设备的需求与日俱增&#xff0c;尤其是在国防、航空航天、能源和其他关键行业。高可靠性和极端环境设计的国产加固服务器&#xff0c;搭载强大的飞腾FT2000/64核处理器&#xff0c;全面满足国产自主可控的严苛要求。 性能强…

光伏电站设计之辐照度效果(threejs实现)

类似 solaredge里面的日照度效果 1、由经纬度和屋顶朝向获取&#xff08;参考pvlib&#xff09;当前地区的辐照度值&#xff0c; 2、根据辐照度值插值获取对应辐照度的颜色。 3、计算片段着色器里面计算每个顶点的遮挡率和紫色混合 4、计算鼠标移动中的投射屋顶位置辐照度&…

Ansible自动化运维管理工具

一、Ansible 1.1、自动化运维管理工具有哪些&#xff1f; 工具架构语言使用情况Ansible无clientpython 协议用ssh95%puppetC/Sruby 协议用http基本不用chefC/Sruby 协议用http基本不用saltstackC/Spython 协议用ssh5% 1.2、Ansible简介 Ansible是一个基于Py…

网易翻译工具解析!这几大翻译器值得一试!

翻译工具的出现&#xff0c;使得跨语言沟通变得更加便捷。本文将为您推荐几款优秀的翻译工具&#xff0c;包括福昕在线翻译、福昕翻译客户端、海鲸AI翻译和网易有道翻译&#xff0c;帮助您在学习、工作和生活中轻松应对语言挑战。 福昕在线翻译 直达链接&#xff08;复制到浏…

c4d渲染和3d渲染有什么区别?c4d和3dmax哪个容易学?

在现代设计和创意产业中&#xff0c;3D渲染技术是不可或缺的一部分。它能够帮助设计师和艺术家将他们的创意转化为逼真的视觉效果&#xff0c;从而更好地展示和传达他们的想法。在众多3D渲染软件中&#xff0c;C4D渲染和3D Max是两款备受关注的软件。 本文将探讨C4D渲染和3D渲…

深度学习领域,你心目中 idea 最惊艳的论文是哪篇?

深度学习发展至今&#xff0c;共经历了三次浪潮&#xff0c;20 世纪40年代到60年代深度学习的雏形出现在控制论(cybernetics)中&#xff0c;20 世纪 80 年代 到 90 年代深度学习表现为 联结主义(connectionism)&#xff0c;直到 2006 年&#xff0c;才真正以深度学习之名复兴。…

Android中的内容提供者

目录 1.创建内容提供者 1--手动创建一个Android应用程序 2--创建自定义的内容提供者 2.访问其他应用程序 1. 解析URI 2. 查询数据 3. 遍历查询结果 3)案例:读取手机通信录 1.声明权限 2.activity_main.xml文件内容 3.my_phone_list.xml文件内容 4.定义PhoneInfo实体 5.定义MyPh…

现代大数据架构Kappa

现代大数据架构中的Kappa架构是一种处理大数据的架构&#xff0c;它作为Lambda架构的替代方案出现&#xff0c;旨在简化数据处理流程。以下是对Kappa架构的详细介绍&#xff1a; 一、核心思想 Kappa架构的核心思想是简化数据处理流程&#xff0c;通过使用单一的流处理层来同时…

就是这个样的粗爆,手搓一个计算器:热量计算器

作为程序员&#xff0c;没有合适的工具&#xff0c;就得手搓一个&#xff0c;PC端&#xff0c;移动端均可适用。废话不多说&#xff0c;直接上代码。 HTML: <div class"calculator"> <label for"weight">体重 (kg):</label> <inpu…

Git之代已修改文件的目录高亮设置

不管Android Studio或者Idea&#xff0c;进入Setting 选择如图所示&#xff0c;并进行勾选 就可以高亮了。

【C++】类的默认成员函数:深入剖析与应用(上)

&#x1f600;在上一篇文章中我们初步了解了C的基础概念&#xff0c;现在我们进行对C类的默认成员函数进行更加深入的理解&#xff01; &#x1f449;【C新手入门指南&#xff1a;从基础概念到实践之路】 目录 &#x1f4af;前言 &#x1f4af;构造函数 一、构造函数的定义…

Ambari-2.7.4和HDP-3.1.4安装(附Ambari和HDP安装包)

1.、环境及软件准备 Ambari-2.7.4和HDP-3.1.4下载 ,提取码:3rwq 环境:CentOS7(我这里使用的是CentOS7.9版本)、三台虚拟机,单节点内存13GB、存储80GB 软件:mysql5.7+、jdk8、ambari-2.7.4.0-centos7.tar.gz、HDP-3.1.4.0-centos7-rpm.tar.gz、HDP-UTILS-1.1.0.22-centos7…

Nodejs使用http模块创建Web服务器接收解析RFID读卡器刷卡数据

本示例使用设备&#xff1a; https://item.taobao.com/item.htm?spma21dvs.23580594.0.0.1d292c1buHvw58&ftt&id22173428704 Javascript源码 //引用http模块创建web服务器&#xff0c;监听指定的端口获取以GET、POST、JSON等方式上传的数据&#xff0c;并回应驱动读卡…

阿里云数据库导出 | 数据管理(兼容数据库备份)

文章目录 1、数据库导出2、操作步骤3、DMS - Data Management Service 1、数据库导出 2、操作步骤 3、DMS - Data Management Service

C#的自定义对话框和提示窗体 - 开源研究系列文章

上次的应用因为需要用到对话框和提示窗体&#xff0c;然后系统自带的MessageBox界面个人又看不上&#xff0c;所以就想自己编写一个自定义的窗体&#xff0c;于是有了本文&#xff0c;具体的已经应用到笔者其它的应用里了。 1、 项目目录&#xff1b; 2、 源码介绍&#xff1b;…