20201130 王维

学习总结

1 响应数据和结果视图

1.1 返回值分类

1.1.1 字符串

controller 方法返回字符串可以指定逻辑视图名,通过视图解析器解析为物理视图地址

1.1.2 void

道 Servlet 原始 API 可以作为控制器中方法的参数,我们可以使用 request/response进行重定向以及请求转发操作。

1.1.3 ModelAndView

ModelAndView 是 SpringMVC 为我们提供的一个对象,该对象也可以用作控制器方法的返回值。

//添加键值对
modelAndView.addObject("username", "张三");
//设置视图名称
modelAndView.setViewName("success");

注意: 我们在页面上获取值使用的是 requestScope.username 取的,所以返回 ModelAndView 类型时,浏 览器跳转只能是请求转发。

也可以在创建ModelAndView对象是传入视图名称。

1.2 转发和重定向

1.2.1 forward 转发

controller 方法在提供了 String 类型的返回值之后,默认就是请求转发。

需要注意的是,如果用了 forward: 则路径必须写成实际视图 url,不能写逻辑视图。 它相当于 request.getRequestDispatcher("url").forward(request,response) 。使用请求转 发,既可以转发到 jsp ,也可以转发到其他的控制器方法。

1.2.2 Redirect 重定向

contrller 方法提供了一个 String 类型返回值之后,它需要在返回值里使用:redirect:

它相当于 response.sendRedirect(url) 。需要注意的是,如果是重定向到 jsp 页面,则 jsp 页面不能 写在 WEB-INF 目录中,否则无法找到。

1.3 ResponseBody 响应 json 数据

该注解用于将 Controller 的方法返回的对象,通过 HttpMessageConverter 接口转换为指定格式的数 据如:json,xml 等,通过 Response 响应给客户端

需要注意springMVC默认使用的是 MappingJackson2HttpMessageConverter 对 json 数据进行转换,所以需要加入 jackson 的包.而且需要注意spring5.0需要的是 Jackson 2.9 and higher

<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.10.0</version>
</dependency>

1.4 RestController

RestController 相当于将 ResponseBody 注解在一个注解有 Controller 的类上。这时,类中所有返 回的字符串都会解析为一个串返回,而不经过视图解析器,也就是说返回的字符串不再是一个逻辑视图 了。

2 SpringMVC 实现文件上传

  • form 表单的 enctype 取值必须是: multipart/form-data (默认值是: application/x-www-formurlencoded ) enctype:是表单请求正文的类型
  • method 属性取值必须是 Post
  • 提供一个文件选择域 <input type=”file” />

2.1 springmvc 传统方式的文件上传

2.1.1 第一步:导入依赖

<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>

<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.3.1</version>
</dependency>

2.1.2 第二步:编写 jsp 页面

<form action="fileUpload" method="post" enctype="multipart/form-data">
名称:<input type="text" name="picname"/><br/>
图片:<input type="file" name="uploadFile"/><br/>
<input type="submit" value="上传"/>
</form>

2.1.3 第三步:编写控制器

package com.itlaobing.springmvc.controller;

import org.springframework.stereotype.Controller;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.UUID;

@Controller
public class FileUploadController {

    @RequestMapping("fileUpload")
    public String testResponseJson(String picname , MultipartFile uploadFile , HttpServletRequest request) throws IOException {
        //定义文件名
        String filename = "";
        //获取原始文件名
        String uploadFileName = uploadFile.getOriginalFilename();
        //截取文件扩展名
        String extendName = uploadFileName.substring(uploadFileName.lastIndexOf(".") + 1, uploadFileName.length());
        //把文件加上随机数,防止文件名重复被覆盖
        String uuid = UUID.randomUUID().toString().replace("-" , "").toUpperCase();
        //判断是否输入了文件名
        if (!StringUtils.isEmpty(picname)) {
            //拼接新的文件名称
            filename = uuid + "_" + picname + "." + extendName;
        } else {
            filename = uuid + "_" + uploadFileName;
        }
        System.out.println(filename);
        //获取文件路径
        ServletContext context = request.getServletContext();
        String basePath = context.getRealPath("/static/uploads");
        //解决同一文件夹或只能怪文件过多问题
        String dataPath = new SimpleDateFormat("yyyy-MM-dd").format(new Date());
        //判断文件夹是否存在
        File file = new File(basePath + "/" + dataPath);
        if (!file.exists()) {
            file.mkdirs();
        }
        //使用MulitpartFile 接口中的方法,把上传的文件写入到指定位置
        uploadFile.transferTo(new File(file , filename));
        return "success";
    }


}

2.1.4 第四步:配置文件解析器

 <!-- 配置文件解析器 -->
    <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
        <!-- 设置上传文件的最大尺寸为5MB-->
        <property name="maxUploadSize">
            <value>5242880</value>
        </property>
    </bean>

注意: 文件上传的解析器 id 是固定的,不能起别的名称,否则无法实现请求参数的绑定。(不光是文件,其 他字段也将无法绑定)

2.2 springmvc 跨服务器方式的文件上传

3 SpringMVC 中的异常处理

4 SpringMVC 中的拦截器

心得体会

springmvc的学习今天结束了,至此,ssm框架的内容基本学习完毕,接着就是整合了,然后开发项目,对所学知识进行熟练和实际运用。

今天的内容看着不是那种多的不行那种,但是练习起来比较容易出现差错,练习起来比较的缓慢,这也暗示着后面实际使用时需要多多注意,不然很容易出现问题。

标签

评论

this is is footer