博客
关于我
springmvc Controller详解
阅读量:406 次
发布时间:2019-03-06

本文共 5251 字,大约阅读时间需要 17 分钟。

简介

  在SpringMVC 中,控制器Controller 负责处理由DispatcherServlet 分发的请求,它把用户请求的数据经过业务处理层处理之后封装成一个Model ,然后再把该Model 返回给对应的View 进行展示。

示例

不适用注解修饰

返回ModelAndView

controller方法中定义ModelAndView对象并返回,对象中可添加model数据、指定view。

package com.cyb.ssm.controller;import java.util.ArrayList;import java.util.List;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Controller;import org.springframework.stereotype.Service;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.servlet.ModelAndView;import com.cyb.ssm.po.Item;import com.cyb.ssm.service.ItemService;@Controllerpublic class ItemController {    @Autowired    private ItemService Service;        @RequestMapping("queryItem")    public ModelAndView queryItem() {        List
itemList = Service.queryItemList(); ModelAndView mvAndView = new ModelAndView(); mvAndView.addObject("itemList", itemList); mvAndView.setViewName("item/item-list"); return mvAndView; }}

返回void

  在controller方法形参上可以定义request和response,使用request或response指定响应结果:

void service(HttpServletRequest request,HttpServletResponse response){}

1、使用request转发向页面,如下:

request.getRequestDispatcher("页面路径").forward(request, response);

2、也可以通过response页面重定向:

response.sendRedirect("url")

3、也可以通过response指定响应结果,例如:

response.setCharacterEncoding("utf-8");response.setContentType("application/json;charset=utf-8");response.getWriter().write("json串");

返回字符串

public String queryItem(HttpServletRequest request,Model model) {        //查询数据库,用静态数据模拟        List
itemList = Service.queryItemList(); //方式一,使用Request的API// request.setAttribute("itemList", itemList); //方式二,使用Model接口的API model.addAttribute("itemList", itemList); return "item/item-list"; }

逻辑视图名

return "item/item-list";

redirect重定向

return "redirect:testRedirect";

redirect:

  相当于“response.sendRedirect()”

  游览器URL发生改变

  Request域不能共享

forward转发

return "forward:testForward";

forward:

  相当于“request.getRequestDispatcher().forward(request,response)”

  浏览器URL不发送改变

  Request域可以共享

@RequestMapping("queryItem")    public String queryItem(HttpServletRequest request,Model model) {        //查询数据库,用静态数据模拟        List
itemList = Service.queryItemList(); //方式一,使用Request的API// request.setAttribute("itemList", itemList); //方式二,使用Model接口的API model.addAttribute("itemList", itemList);// return "item/item-list"; //转发和重定向使用的代码 request.setAttribute("id", 1);// return "redirect:testRedirect"; return "forward:testForward"; } //请求重定向测试 @RequestMapping("testRedirect") public String testRedirect(HttpServletRequest request){ String id = (String) request.getAttribute("id"); System.out.println("request域的id:"+id); return ""; } //请求转发测试 @RequestMapping("testForward") public String testForward(HttpServletRequest request){ Integer id = (Integer) request.getAttribute("id"); System.out.println("request域的id:"+id); return ""; }

使用注解修饰

返回带ResponseBody注解的值

@ResponseBody注解和@RequestBody注解介绍

@ResponseBody的作用:

  ResponseBody注解可以通过内置9种HttpMessageConverter,匹配不同的Controller返回值类型,然后进行不同的消息转换处理

  将转换之后的数据放到HttpServletResponse对象的响应体返回到页面,

  不同的HttpMessageConverter处理的数据,指定的ContentType值也不同。

@RequestBody注解的作用和@ResponseBody注解正好相反,它是处理请求参数的Http消息转换的。

@RequestMapping("queryItemById")    public @ResponseBody Item queryItemById() {        Item item=Service.queryItemById(1);        return item;    }//    @RequestMapping("queryItemById")//    @ResponseBody//    public  Item queryItemById2() {//        Item item=Service.queryItemById(1);//        return item;//    }
//@RestController相当于@Controller和@ResponseBody的组合//该类所有方法的返回值都将被@ResponseBody注解给修饰@RestControllerpublic class RestItemController {    @Autowired    private ItemService Service;    @RequestMapping("queryItemByIdWithRest")    public Item queryItemById() {        Item item = Service.queryItemById(1);        return item;    }}

常用的 HttpMessageConverter

 MappingJacksonHttpMessageConverter处理POJO类型返回值

 MappingJacksonHttpMessageConverter是专门处理POJO类型的。

默认使用MappingJackson的JSON处理能力,将后台返回的Java对象(POJO类型),转为JSON格式输出到页面。

将响应体的Content-Type设置为application/json;charset=utf-8

StringHttpMessageConverter处理String类型返回值

StringHttpMessageConverter是专门处理String类型的。

调用response.getWriter()方法将String类型的字符串写回给调用者。

将响应体的Content-Type设置为text/plain;charset=utf-8

@RequestMapping

  通过RequestMapping注解可以定义不同的处理器映射规则

URL路径映射

  @RequestMapping(value="/item")或@RequestMapping("/item")

  value的值是数组,可以将多个url映射到同一个方法

  @RequestMapping(value={"/item","/queryItem"})

窄化请求映射

  在class上添加@RequestMapping(url)指定通用请求前缀,限制此类下的所有方法的访问请求url必须以请求前缀开头,通过此方法对url进行模块化分类管理。

example

  商品模块

    /item/add

    /item/update

    /item/delete

  用户模块

    /user/add

    /user/update

    /user/delete

请求方法限定

  限定GET方法

  @RequestMapping(method=RequestMethod.GET)

如果通过Post访问则报错:

  HTTP Status 405 - Request method 'POST' not supported

例如:

  @RequestMapping(value="/editItem",mtthod=RequestMethod.GET)

  限定POST方法

  @RequestMapping(method=RequestMethod.POST)

如何通过Post访问则报错:

  HTTP Status 405 - Request method 'GET' not supported

  GET和POST都可以

  @RequestMapping(mthod={RequestMethod.GET,RequestMethod.POST})

转载地址:http://eumkz.baihongyu.com/

你可能感兴趣的文章
mybatis #{}和${}区别
查看>>
Java Objects工具类重点方法使用
查看>>
Java内存模型(JMM)
查看>>
AQS相关
查看>>
abp(net core)+easyui+efcore实现仓储管理系统——ABP总体介绍(一)
查看>>
abp(net core)+easyui+efcore实现仓储管理系统——入库管理之八(四十四)
查看>>
WCF学习之旅—第三个示例之一(二十七)
查看>>
java ThreadPoolExecutor初探
查看>>
Markdown进阶
查看>>
快速指数算法
查看>>
python去除字符串中的特殊字符(爬虫存储数据时会遇到不能作为文件名的字符串)
查看>>
SpringCloud微服务(03):Hystrix组件,实现服务熔断
查看>>
Spring 框架基础(01):核心组件总结,基础环境搭建
查看>>
JavaEE基础(02):Servlet核心API用法详解
查看>>
SpringBoot2 整合Nacos组件,环境搭建和入门案例详解
查看>>
Sentry快速开始并集成钉钉群机器人
查看>>
Docker 服务
查看>>
Cassandra数据建模
查看>>
Elasticsearch Web管理工具
查看>>
在create-react-app创建的项目下允许函数绑定运算符
查看>>