【云计算】SpringMVC解析
小标 2018-12-13 来源 : 阅读 1398 评论 0

摘要:本文主要向大家介绍了【云计算】SpringMVC解析,通过具体的内容向大家展现,希望对大家学习云计算有所帮助。

本文主要向大家介绍了【云计算】SpringMVC解析,通过具体的内容向大家展现,希望对大家学习云计算有所帮助。

JSON视图

【云计算】SpringMVC解析

原理:


1) 当SpringMVC读取到方法上的@ResponseBody注解时,就知道该方法不再使用默认的视图解析器解析视图,而是直接把结果写到响应体中,这样就需要对结果进行转换。


2) SpringMVC会从框架中查找有没有定义MessageConvertor(消息转换器),通过消息转换器转换结果,返回对应视图


3) 在SpringMVC的注解驱动类中,会进行默认的消息转换器注册,因为我们引入了jacksonJson包,所以会注册JSON的消息转换器


4) 因为只有JSON消息转换器可以对Java对象序列化,因此这里默认用了JSON转换


如果有多个消息转换的依赖被引入,那么就会注册多个消息转换器:例如JSONXML等等,此时会用哪个转换器?


此时会根据请求头中的accept来判断返回什么类型数据


文件上传


SpringMVC的文件上传,底层也是使用的Apache的Commons-fileupload


导包


                
  
   commons-fileupload
   commons-fileupload
   1.3.1
  


解析器


controller


@RequestMapping("/fileupload")
 // 通过参数:MultipartFile file来接收上传的文件,这个是SpringMVC中定义的类,会被自动注入
 public ModelAndView show21(@RequestParam("file") MultipartFile file) throws Exception {
  ModelAndView mv = new ModelAndView("hello");
  if(file != null){
   // 将上传得到的文件 转移到指定文件。
   file.transferTo(new File("D:/test/" + file.getOriginalFilename()));
  }
  mv.addObject("msg", "上传成功!" + file.getOriginalFilename());
  return mv;
 }


拦截器


HandlerExecutionChain是一个执行链,当用户的请求到达DispatcherServlet的时候,DispatcherServlet会到HandlerMapping中查找对应的Handler,找到后返回的就是这个:HandlerExecutionChain,里面包含了:


1) 正确的Handler对象


2) Handler的拦截器集合,这里的拦截器对象是:HandlerInterceptor


拦截器接口其中定义了三个方法:


preHandle:预处理回调方法,在Handler执行前执行,第三个参数为处理器(Controller 实现);


返回值:true 表示继续流程(如调用下一个拦截器或处理器);


false表示流程中断(如登录检查失败),不会继续调用其他的拦截器或处理器;


postHandle :后处理回调方法,实现处理器的后处理(但在渲染视图之前)


afterCompletion: :整个请求处理完毕回调方法,即在视图渲染完毕时回调


当然,这个接口还有一个适配器类:HandlerInterceptorAdapter,对三个方法进行了空实现。我们可以有选择的重写想要实现的方法。


正常执行流程


异常执行流程


自定义拦截器


public class MyInterceptor1 implements HandlerInterceptor {
 @Override
 public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
   throws Exception {
  System.out.println("**********我是拦截器1的前置处理方法。");
  // 这里返回true,代表放行,如果是false,流程中断,不再执行后续的Controller中的方法了
  return true;
 }
 @Override
 public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
   ModelAndView modelAndView) throws Exception {
  System.out.println("**********我是拦截器1的后处理方法。我看到了View:" + modelAndView.getViewName());
 }
 @Override
 public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
   throws Exception {
  System.out.println("**********我是拦截器1的完成后处理方法。");
 }
}


配置自定义拦截器


拦截器的前置方法顺序执行,如果返回true,继续。返回false,流程终止,执行前面所有返回true的拦截器的完成方法


拦截器的后置方法倒序执行,在Controller执行结束后,视图解析前执行。


拦截器的完成后方法倒序执行,在视图解析后执行。无论前面是否出错或返回false,已经执行过的拦截器的完成方法都会被执行,类似于finally


获取参数的方法测试代码


package com.hrh.controller;

import com.hrh.pojo.User;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.util.ArrayList;
import java.util.List;

@Controller
public class Test {

    //jsp视图
    @RequestMapping("testJsp")
    public ModelAndView testJsp(){
        ModelAndView mv = new ModelAndView("userList");
        ArrayList userList = new ArrayList<>();
        for(int i=0;i<5;i++){
            User user = new User();
            user.setName("哈哈"+i);
            user.setAge(10+i);
            userList.add(user);
        }
        mv.addObject("userList",userList);
        return mv;
    }

    //Json视图
    @RequestMapping("testJson")
    @ResponseBody
    public List testJson(){
        ArrayList userList = new ArrayList<>();
        for(int i=0;i<5;i++){
            User user = new User();
            user.setName("哈哈"+i);
            user.setAge(10+i);
            userList.add(user);
        }
        return userList;
    }

    //直接返回视图名称
    @RequestMapping("testView")
    public String testView(){
        return "index";
    }

    //视图模型分离
    @RequestMapping("testViewAndModel")
    public String testViewAndModel(Model model){
        model.addAttribute("msg","视图模型分离..嘻嘻");
        return "hello";
    }

    //转发和重定向
    @RequestMapping("testRF")
    public String testRF(){
        //return "redirect:testView";
        return "forward:testView";
    }

    //不返回视图
    @RequestMapping("testVoid")
    @ResponseStatus(HttpStatus.OK)
    public void testVoid(){
        System.out.println("hiahia");
    }

    //获取servlet内置对象
    @RequestMapping("testServlet")
    public String testServlet(HttpServletRequest request,
                              HttpServletResponse response,
                              HttpSession session){
        request.setAttribute("msg","我是request啊");
        response.addCookie(new Cookie("response","bu neng yong zhong wen a"));
        session.setAttribute("msg2","我是session啊");
        return "hello";
    }

    //获取PathVariable
    @RequestMapping("testPathVariable/{name}&{age}")
    public ModelAndView testPathVariable(@PathVariable("name")String name,

                                         @PathVariable("age")int age){
        String msg=name+"..."+age;
        ModelAndView mv = new ModelAndView("hello");
        mv.addObject("msg",msg);
        return mv;
    }

    //获取基本类型参数
    @RequestMapping("testParam")
    public ModelAndView testParam(@RequestParam("name") String name,
                                  @RequestParam("age") int age){
        String msg=name+"..."+age;
        ModelAndView mv = new ModelAndView("hello");
        mv.addObject("msg",msg);
        return mv;
    }

    //获取参数封装成pojo对象
    @RequestMapping("testParamPoJo")
    public ModelAndView testParamPoJo(User user){

        ModelAndView mv = new ModelAndView("hello");
        mv.addObject("msg",user);
        return mv;
    }

    //获取cookie
    @RequestMapping("testCookie")
    public ModelAndView testCookie(@CookieValue("JSESSIONID")String jsessionid){
        ModelAndView mv = new ModelAndView("hello");
        mv.addObject("msg",jsessionid);
        return mv;
    }

    //接收Json
    @RequestMapping("testJson2")
    @ResponseStatus(HttpStatus.OK)
    public void testJson2(@RequestBody User user){
        System.out.println(user.getName());
        System.out.println(user.getAge());
    }

    //接收Json数组
    @RequestMapping("testJsonArr")
    @ResponseStatus(HttpStatus.OK)
    public void testJsonArr(@RequestBody List userList){
        System.out.println(userList);
    }

}


          

本文由职坐标整理并发布,希望对同学们有所帮助。了解更多详情请关注职坐标大数据云计算大数据安全频道!

本文由 @小标 发布于职坐标。未经许可,禁止转载。
喜欢 | 0 不喜欢 | 0
看完这篇文章有何感觉?已经有0人表态,0%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式AI+学习就业服务平台 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved