springmvc面试复习

一,什么是springmvc?

  SpringMVC是一种基于Java的实现MVC设计模式的请求驱动类型的轻量级Web框架,使用了MVC架构模式的思想,将web层进行职责解耦,基于请求驱动指的就是使用请求-响应模型,框架的目的就是帮助我们简化开发。

 

二,springmvc请求流程

 

整个架构的具体流程:

(1)用户发送请求 ——> DispatcherServlet ,前端控制器拿到请求后并不自己处理,而是交给其他处理器进行处理,这里只是作为一个统一访问点,进行全局流程的控制。

(2)DispatcherServlet ——> HandlerMapping,处理器映射器会将请求映射为HandlerExecutionChain对象返回给DispatcherServlet,该对象里面包含了一个Handler处理器对象和多个HandlerInterceptor拦截器对象(如果设置了拦截器则生成拦截器对象,没有则不生成)。

(3)DispatcherServlet ——> HandlerAdapter,处理器适配器将传递过来的处理器包装成适配器,从而很容易支持了多种类型的处理器,这也是适配器设计模式的应用。

(4)HandlerAdapter ——> 调用执行处理器相应功能,处理方法(就是需要我们自己写的Controller类和方法),并且返回一个ModelAndView对象(包含了模型数据、逻辑视图名),再由HandlerAdapter返回给前端控制器。

        ModelAndView :Model部分是业务对象返回的模型数据,View部分是逻辑视图名。

(5)DispatcherServlet ——> ViewResolver,视图解析器将逻辑视图名解析为具体的View(不包含模型数据)。首先根据逻辑视图名解析成物理视图名即具体的页面地址,再生成View视图对象。

(6)DispatcherServlet ——> View,此时View进行视图渲染,即将模型数据进行渲染。此时的Model实际上是一个Map数据结构。

(7)DispatcherServlet ——> 响应用户。

 

三,springmvc注解

   @Controller :在对应的方法上,视图解析器可以解析return 的jsp,html页面,并且跳转到相应页面;

   @RestController :相当于@Controller+@ResponseBody

   @ResponseBody:返回json字符串

   @RequestMapping: 设置请求路径

   @RequestMapping(value="/getName",method=RequestMethod.GET,params={"id=123","name","!age")

 //上述规则定义了,只能响应get请求,并且请求的参数必须包含id=123,必须包含name,不能包含age//根据上述规则此地址合法:http://localhost:8080/xx?id=123&name=abc

   前端参数获取

  1,可以直接用属性名相同隐射。public String f(String name,String age){}

  2,将前端的传递的数据封装为一个对象,name值和对象字段名相同即可。public String f(Person person){}

  3,使用注解@RequestParma(value=“name”,defaultValue="tc"):获取name值,并设置默认值。public String f(@RequestParma(“name”)String name){}

  4,使用PathVariable:本注解将请求数据绑定在请求路径中

    请求路径:RequestMapping("../{name}/{age}")

   public String f(@PathVariable("name")String name,@PathVariable("age")String age){return “redirect:”/  “forward:”}

   redirect:重定向;forward:请求转发;

  5,@RequestBody:接收json数据;public String f(@RequestBody Person person){}

四,文件上传

/*
采用三种方式来接收上传文件,分别用三个方法试验
每个方法里,有程序执行时间记录
实际运用时,三者选其一
第一种最慢,第三种最快,一般选用第二种
*/
@Controller
public class FileController {
    /*
     * 通过流的方式上传文件
     * 
     * @RequestParam("file") 将name=file控件得到的文件封装成CommonsMultipartFile 对象
     */
    @RequestMapping("fileUpload")
    public String fileUpload(@RequestParam("file") CommonsMultipartFile file) throws IOException {

        // 用来检测程序运行时间
        long startTime = System.currentTimeMillis();

        try {
            // 获取输出流
            OutputStream os = new FileOutputStream("E:/" + new Date().getTime() + file.getOriginalFilename());
            // 获取输入流 CommonsMultipartFile 中可以直接得到文件的流
            InputStream is = file.getInputStream();
            int temp;
            // 一个一个字节的读取并写入
            while ((temp = is.read()) != (-1)) {
                os.write(temp);
            }
            os.flush();
            os.close();
            is.close();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
        long endTime = System.currentTimeMillis();
        System.out.println("方法一的运行时间:" + String.valueOf(endTime - startTime) + "ms");
        return "/success";
    }

    /*
     * 采用file.Transto 来保存上传的文件
     */
    @RequestMapping("fileUpload2")
    public String fileUpload2(@RequestParam("file") CommonsMultipartFile file) throws IOException {
        long startTime = System.currentTimeMillis();

        String path = "E:/" + new Date().getTime() + file.getOriginalFilename();
        File newFile = new File(path);
        // 通过CommonsMultipartFile的方法直接写文件(注意这个时候)
        file.transferTo(newFile);

        long endTime = System.currentTimeMillis();
        System.out.println("方法二的运行时间:" + String.valueOf(endTime - startTime) + "ms");

        return "/success";
    }

    /*
     * 采用spring提供的上传文件的方法
     */
    @RequestMapping("springUpload")
    public String springUpload(HttpServletRequest request) throws IllegalStateException, IOException {
        long startTime = System.currentTimeMillis();

        // 将当前上下文初始化给 CommonsMutipartResolver (多部分解析器)
        CommonsMultipartResolver multipartResolver = new CommonsMultipartResolver(request.getSession().getServletContext());
        // 检查form中是否有enctype="multipart/form-data"
        if (multipartResolver.isMultipart(request)) {
            // 将request变成多部分request
            MultipartHttpServletRequest multiRequest = (MultipartHttpServletRequest) request;
            // 获取multiRequest 中所有的文件名
            Iterator iter = multiRequest.getFileNames();

            while (iter.hasNext()) {
                // 一次遍历所有文件
                MultipartFile file = multiRequest.getFile(iter.next().toString());
                if (file != null) {
                    String path = "E:/springUpload" + file.getOriginalFilename();
                    // 上传
                    file.transferTo(new File(path));
                }
            }
        }

        long endTime = System.currentTimeMillis();
        System.out.println("方法三的运行时间:" + String.valueOf(endTime - startTime) + "ms");
        return "/success";
    }

}

 前端页面:

<!-- 三个form分别对应controller里三个上传方法 -->
    <form name="Form1" action="fileUpload.v" method="post" enctype="multipart/form-data">
        <h1>采用流的方式上传文件</h1>
        <input type="file" name="file">
        <input type="submit" value="upload" />
    </form>

    <form name="Form2" action="fileUpload2.v" method="post" enctype="multipart/form-data">
        <h1>采用multipart提供的file.transfer方法上传文件</h1>
        <input type="file" name="file">
        <input type="submit" value="upload" />
    </form>

    <form name="Form3" action="springUpload.v" method="post" enctype="multipart/form-data">
        <h1>使用spring mvc提供的类的方法上传文件</h1>
        <input type="file" name="file">
        <input type="submit" value="upload" />
    </form>

---------------------
参考链接
https://blog.csdn.net/weixin_42621338/article/details/87204868

https://www.jianshu.com/p/fbc6953e5af4

 

 

posted @ 2019-08-07 17:10  Apache24  阅读(191)  评论(0)    收藏  举报