SpringMVC回顾

执行流程简要分析

如图

在这里插入图片描述

简要分析

在这里插入图片描述

  1. DispatcherServlet表示前置控制器,使整个SpringMVC的控制中心,用户发出请求,DispatcherServlet接收并拦截请求。
  2. HandlerMapping为处理器映射,DispatcherServlet调用HandlerMapping,HandlerMapping根据请求url调用Handler
  3. HandlerExecution表示具体的Handler,主要作用是根据url查找控制器
  4. HandlerExecution将解析后的信息传递给DispatcherServlet,eg:解析控制器映射等
  5. HandlerAdapter处理器适配器,按照其特定的规则去执行Handler
  6. Handler让具体的Controller去执行
  7. Controller将具体的信息返回给HandlerAdapter,eg:ModelAndView
  8. HandlerAdapter将视图逻辑名和视图传递给DispatcherServlet
  9. DispatcherServlet调用视图解析器(ViewResolver)来解析HandlerAdapter传来的视图逻辑名
  10. 视图解析器将解析的逻辑视图名传给DispatcherServlet
  11. DispatcherServlet根据视图解析的视图结果,调用具体的视图
  12. 最终给用户

Controller配置小结

  • 控制器负责负责提供访问应用程序的行为,通过接口或注解实现
  • 控制器负责解析用户请求并将其转换为一个模型
  • SpringMVC中一个控制器类可以包含多个方法

接口实现

@FunctionalInterface
public interface Controller {
    @Nullable
    ModelAndView handleRequest(HttpServletRequest var1, HttpServletResponse var2) throws Exception;
}

缺点:

  1. 一个类只能写一个方法,多个方法只能定义多个类

实现接口是很老的办法,一般不使用

注解实现

<!-- 配置组件扫描 -->
<context:component-scan base-package="controller" />
@Component   //组件
@Controller  //控制器
@Service     //服务层
@Repository  //dao
@Controller
  • 代表这个类会被Spring接管
  • 被注解的类,中所有的方法,如果返回值是String,并且有具体的页面可以跳转,就会被视图解析器解析
@RequestMapping
  • 用于映射URL到控制器上
  • 可以用于Class上和方法上
RestFul风格

RestFul就是一个资源定位以及资源操作的风格。不是标准也不是协议,就是一种风格

功能
  • 资源:互联网上所有的资源都可以抽象为资源

  • 资源操作:使用POST、DELETE、PUT、GET,使用不同的方法对资源进行操作

  • 可以通过请求方式来区别操作方法,与链接无关

参数获取
@RequestMapping("/add/{a}/{b}")
public String test(@PathVariable int a, @PathVariable int b, Model model){
    int res = a + b;
    model.addAttribute("msg", res);
    return "test";
}
  • 使用@PathVariable可以获取URL中的参数
指定请求类型

1.通过@RequestMapping中的method来指定POST、DELETE、PUT、GET等

@RequestMapping(value="/add/{a}/{b}",method = {RequestMethod.GET})
public String test(@PathVariable int a, @PathVariable int b, Model model){
    int res = a + b;
    model.addAttribute("msg", res);
    return "test";
}

2.直接通过注解指定

@GetMapping("/add/{a}/{b}")    //get请求
@PostMapping("/add/{a}/{b}")   //post请求
@DeleteMapping("/add/{a}/{b}")  //delete请求
@PutMapping("/add/{a}/{b}")     //put请求
public String test(@PathVariable int a, @PathVariable int b, Model model){
    int res = a + b;
    model.addAttribute("msg", res);
    return "test";
}

跳转方式

1.ModelAndView 视图解析器

2.支持Servlet方式

  • response.sendRedirect(); //Servlet重定向 地址栏会变化
  • request.getRequestDispatcher("").forward(request,response); //Servlet转发
@RequestMapping("/add/{a}/{b}")
public String test2(HttpServletRequest request, HttpServletResponse response){
    request.getSession();
    response.sendRedirect("test"); //重定向
    request.getRequestDispatcher("test").forward(request, response);//转发
    return "test";
}

3.SpringMVC 封装的操作

  • redirect
@RequestMapping("/test3")
public String test3(){
    return "redirect:/index.jsp"
}
  • forword
@RequestMapping("/test4")
public String test4(){
    return "forward:/index.jsp"
}

接收参数与返回数据

接收参数

使用@RequestParam

@RequestMapping("/test5")
//localhost:8080/test5?param=test
public String test5( @RequestParam("param") String param,Model model){

    model.addAttribute("res", param);

    return "test";
}

使用@RequestBody可以接收一个对象,map、list、实体类

返回数据
  • Model
  • ModelAndView
  • ModelMap 继承了LinkedList 具有LinkedList的所有功能

乱码问题

通过过滤器解决乱码问题,SpringMVC提供了支持

<!-- 解决中文乱码问题,使用过滤器 -->
    <!--配置编码格式-->
    <filter>
        <filter-name>characterEncoding</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>characterEncoding</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

返回JSON数据

@ResponseBody

@RequestMapping("/json")
@ResponseBody //这个注解不会走视图解析器,他会直接返回一个字符串
public String test6(){
    Map map = new HashMap<String,String>();
    map.put("name", "白牛");
    map.put("age", "21");
    JSONObject obj = new JSONObject(map);
    return obj.toString();
}

@RestController

@RestController //这个控制器下所有的方法只会返回字符串
public class HelloController {

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值