目录 一、SpringMvc入门1、回顾MVC模式1.1 概念1.2 优缺点1.2.1 优点1.2.2 缺点 2、SpringMVC概念1、概念2、优点 3、第一个Spring MVC程序3.1 使用步骤3.1.
MVC 设计模式一般指 MVC 框架,M(Model)指数据模型层,V(View)指视图层,C(Controller)指控制层。使用 MVC 的目的是将 M 和 V 的实现代码分离,使同一个程序可以有不同的表现形式。其中,View 的定义比较清晰,就是用户界面。
在 WEB 项目的开发中,能够及时、正确地响应用户的请求是非常重要的。用户在网页上单击一个 URL 路径,这对 Web 服务器来说,相当于用户发送了一个请求。而获取请求后如何解析用户的输入,并执行相关处理逻辑,最终跳转至正确的页面显示反馈结果,这些工作往往是控制层(Controller)来完成的。
在请求的过程中,用户的信息被封装在 User 实体类中,该实体类在 Web 项目中属于数据模型层(Model)。
在请求显示阶段,跳转的结果网页就属于视图层(View)。
像这样,控制层负责前台与后台的交互,数据模型层封装用户的输入/输出数据,视图层选择恰当的视图来显示最终的执行结果,这样的层次分明的软件开发和处理流程被称为 MVC 模式。
在学习 Servlet 及 jsP 开发时,JavaBean 相当于 Model,Servlet 相当于 Controller,JSP 相当于 View。
总结如下:
任何一件事都有利有弊,下面来了解一下 MVC 的优缺点。
总之,我们通过 MVC 设计模式最终可以打造出一个松耦合+高可重用性+高可适用性的完美架构。
4.0.2.RELEASE 1.7.7 1.2.17 junit junit 4.12 jstl jstl 1.2 javax.servlet javax.servlet-api 3.1.0 javax.servlet.jsp javax.servlet.jsp-api 2.3.1 org.codehaus.jackson jackson-core-asl 1.9.4 org.codehaus.jackson jackson-mapper-asl 1.9.4 org.springframework spring-core ${spring.version} org.springframework spring-web ${spring.version} org.springframework spring-oxm ${spring.version} org.springframework spring-tx ${spring.version} org.springframework spring-jdbc ${spring.version} org.springframework spring-webmvc ${spring.version} org.springframework spring-aop ${spring.version} org.springframework spring-context-support ${spring.version} org.springframework spring-test ${spring.version} log4j log4j ${log4j.version} com.alibaba fastJSON 1.1.41 org.slf4j slf4j-api ${slf4j.version} org.slf4j slf4j-log4j12 ${slf4j.version} org.projectlombok lombok 1.18.12 commons-io commons-io 2.4 commons-fileupload commons-fileupload 1.2.2 src/main/java src/main/resources org.springframework.boot spring-boot-Maven-plugin org.apache.maven.plugins maven-surefire-plugin true
Spring MVC 是基于 Servlet 的,DispatcherServlet 是整个 Spring MVC 框架的核心,主要负责截获请求并将其分派给相应的处理器处理。所以配置 Spring MVC,首先要定义 DispatcherServlet。跟所有 Servlet 一样,用户必须在 web.xml 中进行配置。
在main目录下创建java和resource目录。
springmvc org.springframework.web.servlet.DispatcherServlet contextConfigLocation classpath:config/springmvc-servlet.xml 1 true springmvc /
注意事项:
springmvc org.springframework.web.servlet.DispatcherServlet contextConfigLocation classpath:config/springmvc-servlet.xml 1 springmvc /
在 src 目录下创建 com.hqyj.cl.controller 包,并在该包中创建 ReGISterController 和 LoginController 两个传统风格的控制器类(实现 Controller 接口),分别处理首页中“注册”和“登录”超链接的请求。Controller 是控制器接口,接口中只有一个方法 handleRequest,用于处理请求和返回 ModelAndView。
public class LoginController implements Controller { public ModelAndView handleRequest(httpservletRequest arg0, HttpServletResponse arg1) throws Exception { return new ModelAndView("/WEB-INF/jsp/login.jsp"); //注意文件路径是否在WEB-INF文件夹中 }}
public class RegisterController implements Controller { public ModelAndView handleRequest(HttpServletRequest arg0, HttpServletResponse arg1) throws Exception { return new ModelAndView("/WEB-INF/jsp/register.jsp"); }}
创建 springmvc-servlet.xml 文件
<%@ page contentType="text/html;charset=UTF-8" language="java" %> Hello World!
未注册的用户,请 注册!
已注册的用户,去 登录!
<%@ page contentType="text/html;charset=UTF-8" language="java" %> login login
<%@ page contentType="text/html;charset=UTF-8" language="java" %> register register
略
略
视图解析器(ViewResolver)是 Spring MVC 的重要组成部分,负责将逻辑视图名解析为具体的视图对象。
UrlBasedViewResolver 是对 ViewResolver 的一种简单实现,主要提供了一种拼接 URL 的方式来解析视图。
UrlBasedViewResolver 通过 prefix 属性指定前缀,suffix 属性指定后缀。当 ModelAndView 对象返回具体的 View 名称时,它会将前缀 prefix 和后缀 suffix 与具体的视图名称拼接,得到一个视图资源文件的具体加载路径,从而加载真正的视图文件并反馈给用户。
使用 UrlBasedViewResolver 除了要配置前缀和后缀属性之外,还需要配置“viewClass”,表示解析成哪种视图。示例代码如下
InternalResourceViewResolver 为“内部资源视图解析器”,是日常开发中最常用的视图解析器类型。它是 URLBasedViewResolver 的子类,拥有 URLBasedViewResolver 的一切特性。
UrlBasedViewResolver 通过 prefix 属性指定前缀,suffix 属性指定后缀。当 ModelAndView 对象返回具体的 View 名称时,它会将前缀 prefix 和后缀 suffix 与具体的视图名称拼接,得到一个视图资源文件的具体加载路径,从而加载真正的视图文件并反馈给用户。
使用 UrlBasedViewResolver 除了要配置前缀和后缀属性之外,还需要配置“viewClass”,表示解析成哪种视图。示例代码如下
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UPAiYIZX-1682512822611)(G:\桌面\备课\上课\SSM\课件图\Spring MVC执行流程图.png)]
SpringMVC 的执行流程如下
Spring MVC 涉及到的组件有 DispatcherServlet(前端控制器)、HandlerMapping(处理器映射器)、HandlerAdapter(处理器适配器)、Handler(处理器)、ViewResolver(视图解析器)和 View(视图)。下面对各个组件的功能说明如下
DispatcherServlet 是前端控制器,从图 1 可以看出,Spring MVC 的所有请求都要经过 DispatcherServlet 来统一分发。
DispatcherServlet 相当于一个转发器或中央处理器,控制整个流程的执行,对各个组件进行统一调度,以降低组件之间的耦合性,有利于组件之间的拓展。
HandlerMapping 是处理器映射器,其作用是根据请求的 URL 路径,通过注解或者 XML 配置,寻找匹配的处理器(Handler)。
HandlerAdapter 是处理器适配器,其作用是根据映射器找到的处理器(Handler),按照特定规则执行相关的处理器(Handler)。
servlet阶段为了解决一个请求对应一个servlet两种方法
1.方法传递参数的时候多传递一个,找到对应的servlet方法
2.封装一个baseServlet,用来继承httpservlet,通过反射的方式,在运行中调用。之后定义的servlet都去继承baseServlet
Handler 是处理器,常称Controller,和 Java Servlet 扮演的角色一致。其作用是执行相关的请求处理逻辑,并返回相应的数据和视图信息,将其封装至 ModelAndView 对象中。
View Resolver 是视图解析器,其作用是进行解析操作,通过 ModelAndView 对象中的 View 信息将逻辑视图名解析成真正的视图 View(如通过一个 JSP 路径返回一个真正的 JSP 页面)。
View 是视图,其本身是一个接口,实现类支持不同的 View 类型(JSP、FreeMarker、Thymeleaf等)。
Spring 2.5 版本新增了 Spring MVC 注解功能,用于替换传统的基于 XML 的 Spring MVC 配置。
@Controller 注解用于声明某类的实例是一个控制器。
package com.hqyj.cl.controller;import org.springframework.stereotype.Controller;@Controllerpublic class AnnotationTest { // 方法代码}
Spring MVC 使用扫描机制找到应用中所有基于注解的控制器类,所以,为了让控制器类被 Spring MVC 框架扫描到,需要在配置文件中声明 spring-context,并使用
元素指定控制器类的基本包(请确保所有控制器类都在基本包及其子包下)。
value 属性是 @RequestMapping 注解的默认属性,因此如果只有 value 属性时,可以省略该属性名,如果有其它属性,则必须写上 value 属性名称。
@RequestMapping(value="user")@RequestMapping("user")
同value属性一样用法
name属性相当于方法的注释,使方法更易理解。
@RequestMapping(value = "user",name = "用户操作")
method 属性用于表示该方法支持哪些 HTTP 请求。如果省略 method 属性,则说明该方法支持全部的 HTTP 请求。
// 只支持 GET 请求@RequestMapping(value = "selectAllUser",method = RequestMethod.GET)// 指定支持多个 HTTP 请求,该方法同时支持 GET 和 POST 请求。@RequestMapping(value = "checkUser",method = {RequestMethod.GET,RequestMethod.POST})
params 属性用于指定请求中规定的参数。
// 请求中必须包含 type 参数时才能执行该请求@RequestMapping(value = "selectAllUser",params = "type")public String toUser() { return "userList";}// 请求中必须包含 type 参数,且 type 参数值为 1 时才能够执行该请求@RequestMapping(value = "selectAllUser",params = "type=1")public String toUser() { return "userList";}
@Controllerpublic class UserController { @RequestMapping(value = "/user/login") public String login() { return "login"; } @RequestMapping(value = "/user/register") public String register() { return "register"; }}
@Controller@RequestMapping("/user")public class UserController { @RequestMapping("/login") public String login() { return "login"; } @RequestMapping("/register") public String register() { return "register"; }}
@RequestMapping 的 value 表示请求的 URL;method 表示请求方法,此处设置为 GET 请求,若是 POST 请求,则无法进入 selectUserByUsername 这个处理方法中。params 表示请求参数,此处参数名为 username。
@Controllerpublic class UserController { @RequestMapping(value = "/user/userList" method=RequestMethod.GET, params="username") public String selectUserByUsername(String username) { return "userList"; @RequestMapping(value = "/user/userList2" method=RequestMethod.GET) public String selectUserByUsername2(@RequestParam("username") String username) { return "userList";}
org.springframework.ui.Model 类型,该类型是一个包含 Map 的 Spring MVC类型。在每次调用请求处理方法时 Spring MVC 都将创建 org.springframework.ui.Model 对象。
@Controller@RequestMapping("/user")public class UserController { @RequestMapping("/register") public String register(Model model) { model.addAttribute("success", "注册成功"); return "register"; }}
@Controller@RequestMapping(value = "user",name = "用户操作")public class UserController { // 登录 @RequestMapping("/login") public String login(Model model){ model.addAttribute("info", "登录成功"); return "index"; }}
<%@ page contentType="text/html;charset=UTF-8" language="java" %> index ${info},系统首页!
Spring MVC Controller 接收请求参数的方式有很多种,有的适合 get 请求方式,有的适合 post 请求方式,有的两者都适合。主要有以下几种方式:
实体 Bean 接收请求参数适用于 get 和 post 提交请求方式。需要注意,Bean 的属性名称必须与请求参数名称相同。示例代码如下
@RequestMapping("/login")public String login(User user, Model model) { if ("admin".equals(user.getUsername()) && "112112".equals(user.getPassword())) { model.addAttribute("message", "登录成功"); return "index"; // 登录成功,跳转到 index.jsp } else { model.addAttribute("message", "用户名或密码错误"); return "login"; }}
url get请求后台方法拼接参数
通过处理方法的形参接收请求参数就是直接把表单参数写在控制器类相应方法的形参中,即形参名称与请求参数名称完全相同。该接收参数方式适用于 get 和 post 提交请求方式。示例代码如下
@RequestMapping("/login")public String login(String username, String password, Model model) { if ("admin".equals(username) && "112112".equals(password)) { model.addAttribute("message", "登录成功"); return "index"; // 登录成功,跳转到 index.jsp } else { model.addAttribute("message", "用户名或密码错误"); return "login"; }}
同servlet阶段获取方式,controller层方法参数中包含HttpServletRequest参数,可以获取请求中的参数。
@RequestMapping(value = "/login/{username}/{password}")public String login(@PathVariable("username") String username, @PathVariable("password") String password) { System.out.println(username); System.out.println(password); return "index";}
在访问http://localhost:8080/user/login/admin/123456
路径时,上述代码会自动将 URL 中的模板变量 {username} 和 {password} 绑定到通过 @PathVariable 注解的同名参数上,即 username=admin、password=123456。
在方法参处使用 @RequestParam 注解指定其对应的请求参数。@RequestParam 有以下三个参数:
通过 @RequestParam 接收请求参数适用于 get 和 post 提交请求方式,示例代码如下
@RequestMapping("/GoRequestParam")private String goRequestParam(){ return "requestParam";}@RequestMapping("/requestParam")public String requestParam( @RequestParam(value = "username",required = true) String username, @RequestParam(value = "password",required = false,defaultValue = "111") String password){ System.out.println(username + " " + password); return "index";}
<%@ page contentType="text/html;charset=UTF-8" language="java" %> RequestParam
<%@ page contentType="text/html;charset=UTF-8" language="java" %> index 登录
注册
RequestParam
该方式与“通过处理方法的形参接收请求参数”的区别如下:当请求参数与接收参数名不一致时,“通过处理方法的形参接收请求参数”不会报 400 错误,而“通过 @RequestParam 接收请求参数”会报 400 错误。
@RequestMapping("/login")public String login() { //转发到一个请求方法(同一个控制器类可以省略/index/) return "forward:/user/isLogin";}@RequestMapping("/isLogin")public String isLogin() { //重定向到一个请求方法 return "redirect:/user/isRegister";}@RequestMapping("/isRegister")public String isRegister() { //转发到一个视图 return "register";}
在 Spring MVC 框架中,不管是重定向或转发,都需要符合视图解析器的配置,如果直接转发到一个不需要 DispatcherServlet 的资源,例如
return "forward:/html/my.html";
则需要在 springmvc-servlet.xml 配置
index.jsp <%@ page contentType="text/html;charset=UTF-8" language="java" %> index ${name}
访问:
使用http://localhost:8080/model/index?name=%E5%BC%A0%E4%B8%89
访问,页面会显示出name对应的值。提示:name后面一串字符串不是乱码,是字符串转换问题,这里的意思就是张三。
1.1.2 应用在有返回值的方法
使用这种方式,返回值对象 name 会被默认放到隐含的 Model 中,在 Model 中 key 为返回值类型首字母小写,value 为返回的值。等同于 model.addAttribute("string", name);
- ModelAttributeController
@Controller@RequestMapping("/model")public class ModelAttributeController { // 方法有返回值 @ModelAttribute() public String myModel(@RequestParam(required = false) String name) { return name; } @RequestMapping("/index") public String model() { return "index"; }}
- index.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %> index ${string}
正常情况下,程序中尽量不要出现 key 为 string、int、float 等这样数据类型的返回值。使用 @ModelAttribute 注解 value 属性可以自定义 key,示例代码
@ModelAttribute("name")public String myModel(@RequestParam(required = false) String name) { return name;}
等价于
model.addAttribute("name", name);
1.2 应用在方法的参数上
@ModelAttribute 注解在方法的参数上,调用方法时,模型的值会被注入。这在实际使用时非常简单,常用于将表单属性映射到**模型对象。**
- ModelAttributeController
@Controller@RequestMapping("/model")public class ModelAttributeController { @RequestMapping("/register") public String register(@ModelAttribute("user") User user) { if ("admin".equals(user.getName()) && "111".equals(user.getPwd())) { return "login"; } else { return "register"; } }}
- login.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> 登录页面! 欢迎 ${user.name} 登录
- index.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %> 注册页面!注册账号成功,用户名为: ${user.name }
1.2.1 说明
@ModelAttribute(“user”) User user语句的功能有两个:
- 将请求参数的输入封装到 user 对象中
- 创建 User 实例
以“user”为键值存储在 Model 对象中,和“model.addAttribute(“user”,user)”语句的功能一样。如果没有指定键值,即“@ModelAttribute User user”,那么在创建 User 实例时以“user”为键值存储在 Model 对象中,和“model.addAtttribute(“user”, user)”语句的功能一样。
1.3 ModelAttribute+RequestMapping
- ModelAttributeController
@Controllerpublic class ModelAttributeController { // @ModelAttribute和@RequestMapping同时放在方法上 方法直接返回页面名称 会把类路径拼接到url中 @RequestMapping("/index") @ModelAttribute("name") public String model(@RequestParam(required = false) String name) { return name; }}
-
index.jsp
请求路径为http://localhost:8080/j230101SpringMVC_war_exploded/index?name=admin name参数有值
<%@ page contentType="text/html;charset=UTF-8" language="java" %> index ${name}
1.3.1 说明
@ModelAttribute 和 @RequestMapping 注解同时应用在方法上时,有以下作用:
- 方法的返回值会存入到 Model 对象中,key 为 ModelAttribute 的 value 属性值;
- 方法的返回值不再是方法的访问路径,访问路径会变为 @RequestMapping 的 value 值,例如:@RequestMapping(value = “/index”) 跳转的页面是 index.jsp 页面;
- 使用这种方式时,不要加类路径,否则可能导致路径出错问题。
1.4 Model和ModelAndView的区别
- Model:每次请求中都存在的默认参数,利用其 addAttribute() 方法即可将服务器的值传递到客户端页面中。
- ModelAndView:包含 model 和 view 两部分,使用时需要自己实例化,利用 Model 来传值,也可以设置 view 的名称。
1.5 练习
@ModelAttribute 注解的方法会在每次调用该控制器类的请求处理方法前被调用。这种特性可以用来控制登录权限。
- BaseController
public class BaseController { @ModelAttribute public void isLogin(HttpSession session) throws Exception { if (session.getAttribute("user") == null) { throw new Exception("没有权限"); } }}
- UserController
@RequestMapping("/user")public class UserController extends BaseController { @RequestMapping("/selectAllUser") public String selectAllUser() { return "userList"; }}
九、Spring MVC JSON数据交互
Spring MVC 在数据绑定的过程中需要对传递数据的格式和类型进行转换,它既可以转换 String 等类型的数据,也可以转换 JSON 等其他类型的数据。我们采用阿里巴巴的FastJson技术实现 Spring MVC 处理 JSON 格式数据。页面要引入Jquery。注意资源过滤(第一种方式)。spring版本4.0.2 (4.3.13其他包版本过低,只是4.0不支持requestmaping的name属性)
1、案例
- pom.xml文件中导入依赖(之前已导入)
com.alibaba fastjson 1.1.41 org.slf4j slf4j-api ${slf4j.version} org.slf4j slf4j-log4j12 ${slf4j.version} com.fasterxml.jackson.core jackson-core 2.9.6 com.fasterxml.jackson.core jackson-annotations 2.9.6 com.fasterxml.jackson.core jackson-databind 2.9.6
- JSONController 方法可以返回值设置为Map集合
@Controller@RequestMapping("/json")public class JSONController { @RequestMapping("/index") public String index() { return "index"; } @RequestMapping("/testJson") @ResponseBody public User testJson(User user) { // 打印接收的 JSON数据 System.out.println("username=" + user.getUsername() + ",password=" + user.getPassword()); // 返回JSON格式的响应 return user; }}
- index.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" %> 测试JSON交互
2、contentType
常见的contentType类型有以下三种:
// 普通表单提交的数据的格式为application/x-www-form-urlencodedapplication/x-www-form-urlencoded// 发送以ContentType为application/json格式的请求参数,需要把data的内容转为json格式,使用JSON.stringify(param)application/json// 上传文件时,请求消息将以multipart/form-data格式封装请求参数multipart/form-data
// 发送以ContentType为application/json格式的请求参数,需要把data的内容转为json格式,使用JSON.stringify(param)
application/json
ajax中可以定义变量
let user = JSON.stringify({
username:$(“username”).val(),
password:$(“password”).val(),
});
后面的data:可以修改为:
data:user; 传递到后端需要在后端方法参数中使用@requestBody注解获取 public void login(@requestBodyUser user)
十、Spring MVC拦截器(Interceptor)
Spring MVC 的拦截器(Interceptor)与 Java Servlet 的过滤器(Filter)类似,它主要用于拦截用户的请求并做相应的处理,通常应用在权限验证、记录请求信息的日志、判断用户是否登录等功能上。
1、定义拦截器
定义一个拦截器,我们采用实现 HandlerInterceptor 接口来实现
1.1 案例
- 实现HandlerInterceptor 接口
public class MyInterceptor implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { // 获取请求的URL String url = request.getRequestURI(); // login.jsp或登录请求放行,不拦截 if (url.indexOf("/goLogin") >= 0 || url.indexOf("/login") >= 0) { return true; } // 获取 session HttpSession session = request.getSession(); Object obj = session.getAttribute("user"); if (obj != null) return true; // 没有登录且不是登录页面,转发到登录页面,并给出提示错误信息 request.setAttribute("msg", "还没登录,请先登录!"); request.getRequestDispatcher("login").forward(request, response); return false; } @Override public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3) throws Exception { } @Override public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3) throws Exception { }}
拦截器的定义中实现了 HandlerInterceptor 接口,并实现了接口中的 3 个方法,解释如下
- preHandle( ):该方法在控制器的处理请求方法前执行,其返回值表示是否中断后续操作,返回 true 表示继续向下执行,返回 false 表示中断后续操作。
- postHandle( ):该方法在控制器的处理请求方法调用之后、解析视图之前执行,可以通过此方法对请求域中的模型和视图做进一步的修改。
- afterCompletion( ):该方法在控制器的处理请求方法执行完成后执行,即视图渲染结束后执行,可以通过此方法实现一些资源清理、记录日志信息等工作。
- springmvc-servlet.xml配置拦截器
- UserController
@Controller@RequestMapping("/user")public class UserController { // 登录页面初始化 @RequestMapping("/goLogin") public String initLogin() { return "login"; } // 处理登录功能 @RequestMapping("/login") public String login(User user, HttpSession session) { if ("admin".equals(user.getUsername()) && "111".equals(user.getPassword())) { // 登录成功,将用户信息保存到session对象中 session.setAttribute("user", user); // 重定向到主页面的跳转方法 return "redirect:main"; } return "login"; } // 跳转到主页面 @RequestMapping("/main") public String goMain() { return "main"; } // 退出登录 @RequestMapping("/logout") public String logout(HttpSession session) { // 清除 session session.invalidate(); return "login"; }}
- login.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" %> ${ msg }
- main.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %> 欢迎 ${ sessionScope.get("user").username },登录!
退出
十一、文件上传和下载
1、文件上传
- pom.xml 文件中添加以下依赖
commons-io commons-io 2.4 commons-fileupload commons-fileupload 1.2.2
- springmvc-servlet.xml
- defaultEncoding:请求的编码格式,默认为 ISO-8859-1,此处设置为 UTF-8(注:defaultEncoding 必须和 JSP 中的 pageEncoding 一致,以便正确读取表单的内容)。
- maxUploadSize:上传文件大小上限,单位为字节。
- fileUpload.jsp 表单提交
<%@ page language="java" contentType="text/html; charset=UTF-8"%>文件上传
- FileController
@Controller@RequestMapping("/file")public class FileController { @RequestMapping("/upload") @ResponseBody public String upload(MultipartFile file, HttpServletRequest request) throws IOException { // 获取上传文件名 String originalFileName = file.getOriginalFilename(); // 得到当前的classpath的绝对路径的URI表示法 String rootPath = Thread.currentThread().getContextClassLoader().getResource("").getPath(); int index = rootPath.indexOf("target"); String path = rootPath.substring(1,index) + "src/main/webapp/static/images/book"; // 新文件 File newFile = new File(path,originalFileName); // 判断目标文件所在目录是否存在 if( !newFile.getParentFile().exists()) { // 如果目标文件所在的目录不存在,则创建父目录 newFile.getParentFile().mkdirs(); } // 将内存中的数据写入磁盘 file.transferTo(newFile); return "success"; }}
1.1 扩展
使用ajax实现文件上传
2、文件下载
- fileDown.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %> 文件下载
- FileController
@RequestMapping("/down")@ResponseBodypublic String down(HttpServletResponse response) throws Exception{ // 下载文件的路径 String rootPath = Thread.currentThread().getContextClassLoader().getResource("").getPath();// 截取到需要的文件存放路径 int index = rootPath.indexOf("target"); String path = rootPath.substring(1,index) + "src/main/webapp/static/images/book"; // 下载文件的名字,假设为banner_1.jpg String fileName = "banner_1.jpg"; //获取输入流 InputStream is = new BufferedInputStream(new FileInputStream(new File(path,fileName))); //转码,免得文件名中文乱码 String filename = URLEncoder.encode(fileName,"UTF-8"); //设置文件下载头 response.addHeader("Content-Disposition", "attachment;filename=" + filename); //1.设置文件ContentType类型,这样设置,会自动判断下载文件类型 response.setContentType("multipart/form-data"); BufferedOutputStream out = new BufferedOutputStream(response.getOutputStream()); int len = 0; while((len = is.read()) != -1){ out.write(len); out.flush(); } out.close(); return "success";}
十二、SpringMVC资源过滤问题
**问题描述:**在web.xml文件中,配置了以下代码后,会把所有请求URL都拦截了,包括js,CSS等静态资源,这样导致了我们无法使用这些静态资源。
springmvc org.springframework.web.servlet.DispatcherServlet 1 springmvc /
**解决办法之一:**在springmvc-servlet.xml文件中,添加以下代码
在web.xml文件中,添加以下代码
default /static/*
**解决办法之二:**在springmvc-servlet.xml文件中,添加以下代码
- location:指location指定的目录不要拦截,直接请求,这里指在根目录下的resources文件下的所有文件
- mapping:指在resources文件下的所有文件(**代表所有文件)
来源地址:https://blog.csdn.net/ailaohuyou211/article/details/130394223
--结束END--
本文标题: SpringMVC详解(超全面)
本文链接: https://lsjlt.com/news/371914.html(转载时请注明来源链接)
有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341
2024-04-01
2024-04-03
2024-04-03
2024-01-21
2024-01-21
2024-01-21
2024-01-21
2023-12-23
回答
回答
回答
回答
回答
回答
回答
回答
回答
回答
0