首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >【SSM-SpringMVC(二)】Spring接入Web环境!本篇开始研究SpringMVC的使用!SpringMVC数据响应和获取请求数据

【SSM-SpringMVC(二)】Spring接入Web环境!本篇开始研究SpringMVC的使用!SpringMVC数据响应和获取请求数据

作者头像
凉凉心.
发布2025-10-13 17:22:00
发布2025-10-13 17:22:00
1760
举报
文章被收录于专栏:CSDN专栏CSDN专栏

SpringMVC的数据响应方式

  1. 页面跳转
    • 直接返回字符串
    • 通过ModelAndView对象返回
  2. 回写数据
    • 直接返回字符串
    • 返回对象或集合

页面跳转:

返回字符串方式

直接返回字符串:此种方式会将返回的字符串与视图解析器的前后缀拼接后跳转

代码语言:javascript
复制
@RequestMapping("/con")
public String say(){
    return "success";
}
代码语言:javascript
复制
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <property name="prefix" value="/src/web_jsp/"></property>
    <property name="suffix" value=".jsp"></property>
</bean>

最后访问的地址:/src/web_jsp/success.jsp

  • 返回带有前缀的字符串:
    • 转发:forward:/src/web-jsp/success.jsp (默认为转发方式)
    • 重定向:redirect:/success.jsp (重定向地址必须是公开不受保护的路径)
通过ModelAndView对象返回方式
代码语言:javascript
复制
// 既然SpringMVC会自动回填框架中存在的数据,那么可以直接声明request对象,它一样可以进行回填
@RequestMapping("/test4")
public String test4(HttpServletRequest request){
    request.setAttribute("name","赵六");
    return "/src/web_jsp/index.jsp";
}

// 设置模型,也就是直接设置数据返回字符串方式也可以进行返回视图
@RequestMapping("/test3")
public String test3(Model model){
    model.addAttribute("name","王五");
    return "/src/web_jsp/index.jsp";
}

// 当声明数据类是在框架中存在的类时,SpringMVC会自行注入相对应的对象
@RequestMapping("/test2")
public ModelAndView test2(ModelAndView modelAndView){
    modelAndView.addObject("name","李四");// 存放进request域中
    modelAndView.setViewName("/src/web_jsp/index.jsp");
    return modelAndView;
}

// ModelAndView,可以直接返回该对象,该对象内设置的对应属性与值用于返回数据和视图路径
@RequestMapping("/test1")
public ModelAndView test1(){
    ModelAndView modelAndView = new ModelAndView();
    // 设置视图路径
    modelAndView.addObject("name","张三");// 存放进request域中
    modelAndView.setViewName("/src/web_jsp/index.jsp");
    return modelAndView;
}

回写数据:

直接返回字符串
  • Web基础阶段,客户端访问服务器端,如果想直接回写字符串作为响应体返回的话,只需要使用response.getWriter().print(“hello world”)即可,那么在Controller中想直接回写字符串该怎么样?

通过SpringMVC框架注入的response对象,使用response.getWriter().print(“hello world”)回写数据,此时不需要视图跳转,业务方式返回值void。

代码语言:javascript
复制
@RequestMapping("/test5")
public void test4(HttpServletResponse response) throws IOException {
    response.getWriter().print("回写数据");
}

将需要回写的字符串直接返回,但此时需要通过@responseBody注解告知SpringMVC框架,方法返回的字符串不是跳转,而是直接在http响应体中返回。

代码语言:javascript
复制
@RequestMapping("/test6")
@ResponseBody
public String test4() throws IOException {
    return "直接在响应体中返回数据";
}
返回对象或集合
  • 在方法上添加@ResponseBody就可以返回json格式的字符串,但是这样配置比较麻烦,配置的代码比较多,因此,我们可以使用mvc的注解驱动代替上述配置。
代码语言:javascript
复制
<mvc:annotation-driven></mvc:annotation-driven>
  • 在SpringMVC的各个组件中,处理器映射器处理器适配器视图解析器称为SpringMVC的三大组件。
  • 使用< mvc:annotation-driven >自动加载RequestMappingHandlerMapping(处理映射器)和RequestMappingHandlerAdapter(处理适配器),可用在Spring-xml.xml配置问价你中使用< mvc:annotation-driven >替代注解处理器和适配器配置。
  • 同时用< mvc:annotation-driven >默认底层就会基础jackson进行对象或集合的json格式字符串的转换

SrpingMVC 获得请求数据

获得请求参数
  • 客户端请求类型参数的格式是:name=value&name=value
  • 服务器要获得请求的参数,有时还需要进行数据的封装,SpringMVC可以接收如下类型的参数:
    • 基本类型参数
    • POJO类型参数
    • 数组类型参数
    • 集合类型参数
获得基本类型参数
  • Controller业务方式的参数名称要与请求参数的name一致,参数值会自动映射匹配
代码语言:javascript
复制
// java代码
@RequestMapping("/test10")
@ResponseBody
public void test9(String name,String age) throws IOException {
   System.out.println(name);
   System.out.println(age);
}
代码语言:javascript
复制
<!-- 浏览器地址栏 - 通过get请求向方法发送数据 -->
http://localhost:8080/路径?name=value&age=value
获得POJO类型参数
  • Controller中的业务方法的POJO参数的属性名与请求参数的name一致,参数值会自动映射匹配
代码语言:javascript
复制
<!-- 浏览器地址栏 - 通过get请求向方法发送数据 -->
http://localhost:8080/路径?name=value&age=value
代码语言:javascript
复制
public class User{
    private String name;
    private String age;
}

// java代码
@RequestMapping("配置路径")
@ResponseBody
public void 方法(实体类类型 接收实体类值) throws IOException {
    System.out.println(接收实体类值);
}
获得数组类型参数
  • Controller中的业务方法数组名称与请求参数的name一致,参数值会自动映射匹配
代码语言:javascript
复制
<!-- 浏览器地址栏 - 通过get请求向方法发送数据 -->
http://localhost:8080/路径?arr=111&arr=张三&arr=李四1
代码语言:javascript
复制
@RequestMapping("/test12")
@ResponseBody
public void test11(String[] arr) throws IOException {
    System.out.println(Arrays.asList(arr));
}
获得集合类型参数
  • 获得集合参数时,要将集合参数包装到一个POJO中才可以。
  • 当使用ajax提交时,可以知道contentType为json形式,那么在方法参数位置使用@RequestBody可以直接接收集合数据而无序使用POJO进行包装

配置请求的各类问题

静态资源访问的开启
代码语言:javascript
复制
<!-- 开放某一路径下的静态资源文件 -->
<mvc:resources mapping="/src/Document/**" location="/src/Document/"></mvc:resources>

<!-- 如果SpringMVC找不到对应的静态资源,那么将交由内部容器(Tomcat)查询对应的静态资源文件 -->
<mvc:default-servlet-handler></mvc:default-servlet-handler>
请求数据乱码问题
代码语言:javascript
复制
<!-- 设置过滤器,该过滤器将所有的文件编码都设置为UTF-8 -->
<filter>
    <filter-name>CharacterEncodingFilter</filter-name>
    <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
    <init-param>
        <param-name>encoding</param-name>
        <param-value>UTF-8</param-value>
    </init-param>
</filter>
<filter-mapping>
    <filter-name>CharacterEncodingFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

各种方式获取请求数据

参数绑定注解@RequestParam
  • 当请求的参数名称与Controller的业务方法参数名称不一致时,就需要通过@RequestParam注解显示的绑定
  • 注解@ReqeuestParam还有如下参数可以使用:
    • value:映射前的请求参数名称
    • required:此在指定的请求参数是否必须包括,默认时true,提交时如果没有此参数则报错
    • defaultValue:当没有指定请求参数时,则使用指定的默认值赋值。前提required为false
代码语言:javascript
复制
@RequestMapping("/test15")
@ResponseBody
/*
 * defaultValue : 默认值
 * value : 映射前参数名
 * required : 指定参数名是否包括 默认true
 * */
public void test14(@RequestParam(value = "data",required = false,defaultValue = "老刘") String name) throws IOException {
    System.out.println(name);
}
获得Restful风格的参数
  • Restful是一种软件架构风格、设计风格,而不是标准,只是提供了一组设计原则和约束条件。
  • 其主要用于客户端和服务器交互的软件,基于整个风格设计的软件可以更加简洁,更有层次,更易于实现缓存机制等
  • Restful 风格的请求是使用 “url+请求方式” 表示一次请求目的,HTTP 协议里面四个表示方式的动词如下:
    • GET:用于获取资源
    • POST:用于新建资源
    • PUT:用于更新资源
    • DELETE:用于删除资源
  • 例如:
    • /路径/1 GET:—— 得到 id = 1的类
    • /路径/1 DELETE:—— 删除 id = 1的类
    • /路径/1 PUT:—— 更新 id = 1的类
    • /路径 POST:—— 新增类
  • /路径/1中的1就是要获得的请求参数,在SpringMVC中可以使用占位符进行参数绑定。
  • 地址/路径/1可以写成/路径/{参数},占位符{参数}对应的就是1的值。
  • 在业务方法中我们可以使用@PathVariable注解进行占位符的匹配获取工作。
自定义类型转换器
  • SpringMVC默认已经提供了一些常用的类型转换器,例如客户端提交的字符串转换成int类型进行参数设置
  • 但是不是所有的数据类型都提供了转化器,没有提供的就需要自定义转换其,例如:日期类型
  • 自定义类型转换器的开发步骤:
    1. 定义转换器类实现Converter接口
    2. 在配置文件中声明转换器
    3. 在 < annotation-driven > 中引用转换器
获取 Servlet 相关API

SpringMVC 支持使用原始 ServletAPI 对象作为控制器方法的参数进行注入,常用的对象如下:

  • HttpServletRequest
  • HttpServletResponse
  • HttpSession
代码语言:javascript
复制
@RequestMapping("/test18")
@ResponseBody
public void test17(HttpServletRequest request,HttpServletResponse response) throws IOException {
    System.out.println(request);
    System.out.println(response);
}
获取请求头数据
  • @RequestHeader
    • 使用该注解可以获得请求头信息,相当于web阶段学习的request.getHeader(name)
    • @RequestHeader注解的属性如下:
      • value:请求头的名称
      • required:是否必须携带此请求头
  • @CookieValue
    • 使用该注解可以获得指定Cookie的值
    • @CookieValue注解的属性如下:
      • value:指定cookie的名称
      • required:是否必须携带此cookie

文件上传

文件上传客户端三要素
  • 表单项type=“file”
  • 表单的提交方式是post
  • 表单的enctype属性是多部分表单形式,及enctype=“multipart/lform-data”
文件上传原理
单文件上传步骤
  1. 导入fileupload和io坐标(需依靠Commons插件)
  2. 配置文件上传解析器
  3. 编写文件上传代码
单文件上传的代码实现

第一步:

  • 所需Commons插件的io包和fileupload包
  • 在项目中导入这两个jar包后进行第二步操作

第二步:

  • 配置文件上传解析器
代码语言:javascript
复制
<!-- 配置文件上传 -->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
    <property name="defaultEncoding" value="UTF-8"></property> <!-- 设置编码 -->
    <property name="maxUploadSize" value="5000000"></property> <!-- 限制文件最大数据 -->
    <property name="maxUploadSize" value="5000000"></property> <!-- 限制文件最大数据 -->
</bean>
  • 在此步骤之前,必须需要Commons插件提供的io包和fileupload包,否则将报错提示未找到类

第三步:

html:

代码语言:javascript
复制
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>文件上传</title>
</head>
<body>
    <!-- 注意配置enctype,该配置的是 多部分表单形式。详情请看上面的原理图 -->
    <!-- 配置文件上传时,请注意请求方式一定是post请求 -->
    <form action="${pageContext.request.contextPath}/test21" 
          	enctype="multipart/form-data" method="post">
        <div>
            <label for="file">文件</label>
            <input type="file" name="file" id="file" />
        </div>
        <div>
            <input type="submit" value="提交">
        </div>
    </form>
</body>
</html>

java:

代码语言:javascript
复制
@RequestMapping("/test21")
@ResponseBody
public void test20(MultipartFile file) throws IOException {
    // 文件名称,包括了文件后缀名
    String originalFilename = file.getOriginalFilename();
    // transferTo 方法并不能新建文件夹,该方法只能转移至已存在的文件夹
    file.transferTo(new File("F:\\Java\\test\\" + originalFilename));
}
多文件上传

步骤一致,方法一致

当jsp页面中的文件标签name值一致,在控制器中可以使用数组方式接收

代码语言:javascript
复制
    // 多文件上传
    @RequestMapping("/test22")
    @ResponseBody
    public void test21(MultipartFile[] file) throws IOException {
        // 使用循环遍历即可,步骤一致,方法一致
        for (MultipartFile data: file) {
            String originalFilename = data.getOriginalFilename();
            data.transferTo(new File("F:\\Java\\test\\"+originalFilename));
        }
    }

当jsp页面中的文件标签name值不一致,在控制器中就可以声明多个变量名来接收

代码语言:javascript
复制
@RequestMapping("/test21")
@ResponseBody
public void test20(MultipartFile file,MultipartFile file2,MultipartFile file3) throws IOException {

    // 文件名称,包括了文件后缀名
    String originalFilename = file.getOriginalFilename();
    // transferTo 方法并不能新建文件夹,该方法只能转移至已存在的文件夹
    file.transferTo(new File("F:\\Java\\test\\" + originalFilename));
    System.out.println(originalFilename);
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2025-05-12,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • SpringMVC的数据响应方式
    • 页面跳转:
      • 返回字符串方式
      • 通过ModelAndView对象返回方式
    • 回写数据:
      • 直接返回字符串
      • 返回对象或集合
    • SrpingMVC 获得请求数据
      • 获得请求参数
      • 获得基本类型参数
      • 获得POJO类型参数
      • 获得数组类型参数
      • 获得集合类型参数
    • 配置请求的各类问题
      • 静态资源访问的开启
      • 请求数据乱码问题
    • 各种方式获取请求数据
      • 参数绑定注解@RequestParam
      • 获得Restful风格的参数
      • 自定义类型转换器
      • 获取 Servlet 相关API
      • 获取请求头数据
    • 文件上传
      • 文件上传客户端三要素
      • 文件上传原理
      • 单文件上传步骤
      • 单文件上传的代码实现
      • 多文件上传
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档