zoukankan      html  css  js  c++  java
  • Springmvc入门基础(五) ---controller层注解及返回类型解说

    0.@Controller注解

    作用:通过@Controller注解,注明该类为controller类,即控制器类,需要被spring扫描,然后注入到IOC容器中,作为Spring的Bean来管理,这样,Spring就能找到Controller类,通过@RequestMapping注解处理对应的请求。

    1.@RequestMapping注解

    作用:通过@RequestMapping注解可以定义不同的处理器映射规则。

    1.1 注解位置

    放在class类上

    在class上添加@RequestMapping(url)指定通用请求前缀, 限制此类下的所有方法请求url必须以请求前缀开头,则前端访问url则是localhost:8080/springmvc/item/itemlist.action

    放在controller方法上,注明访问该controller方法的uri是什么。

    @Controller
    @RequestMapping("/item")
    public class ItemController {
    	@Autowired
    	private ItemService itemService;
    	@RequestMapping(value = {"/itemlist.action","/samePage.action"})
    	public String itemList(Model model,
                               HttpServletRequest request,
                               HttpServletResponse response,
                               HttpSession session
                                             ) throws Exception{
    		model.addAttribute("itemList", list);
    		return "itemList";
    	}
    }

    1.2 请求方法限定

    除了可以对url进行设置,还可以限定请求进来的方法

    1.2.1.限定GET方法

    @RequestMapping(value = "/itemList",method = RequestMethod.GET)

    如果通过POST访问则报错:

    HTTP Status 405 - Request method 'POST' not supported

    1.2.2.限定POST方法

    @RequestMapping(value = "/itemList",method = RequestMethod.POST)

    如果通过GET访问则报错:

    HTTP Status 405 - Request method 'GET' not supported

    1.2.3.GET和POST都可以

    @RequestMapping(value = "/itemList",method = {RequestMethod.GET,RequestMethod.POST})

    或者不注明method,则默认接收任何类型的请求

    @RequestMapping(value = "/itemList")

    注意:@RequestMapping(value = "/itemList"),也可写成@RequestMapping("/itemList")

    假如项目路径后面加了/,即/springmvc/,则需要写成@RequestMapping(value = "itemList"),或者@RequestMapping("itemList")

     

    2.@RequestBody和@ResponseBody注解

    2.1@RequestBody注解

    作用:@RequestBody注解用于读取http请求的内容(字符串),通过springmvc提供的HttpMessageConverter接口将读到的内容(json数据)转换为java对象并绑定到Controller方法的参数上。

     

    2.2 @ResponseBody注解

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

    前端请求body部分json字符串,不管前端是以什么样的方式给服务的发送,服务端接收到的只要是json格式字符串即可-params 
    var params = '{"id": 1,"name": "测试商品","price": 99.9,"detail": "测试商品描述","pic": "123456.jpg"}';
    
    
    
     //json数据交互
    	@RequestMapping(value = "/json.action")
    	public @ResponseBody
    	Items json(@RequestBody Items items){
    		return items;
    	}
    
    
    pojo类
    public class Items {
        private Integer id;
    
        private String name;
    
        private Float price;
    
        private String pic;
    
        private String detail;
    
        此处省略get,set方法}

    注意:前端请求的body中的json字符串中的key值,即上图所示的id,name等,必须要与controller方法形参中使用@RequestBody注解封装的pojo类的属性值一样。

    至于使用 @ResponseBody,把controller方法的返回值给封装到item对象中,前端接收到的也是个json

    字符串,至于如何从json字符串取出展示啥的,此处不做多处讨论,举个简单例子即可

    比如前端是通过ajax方式向服务端发起请求

    $.ajax({
       url : "${pageContext.request.contextPath }/json.action",
       data : params,
       contentType : "application/json;charset=UTF-8",//发送数据的格式
       type : "post",
       dataType : "json",//回调
       success : function(data){
          alert(data.id);
          alert(data.name);
       }
    });

    只需要在回调函数中通过data.属性值即可取出具体value值

     

    3.@RequestParam,@PathVariable等

    3.1 @RequestParam注解

    作用:@RequestParam主要是用来解决前端页面的name属性值与服务端controller方法中定义的形参值名称不一样,比如下图所示,把前端页面name为itemId的值给注入到controller方法定义的形参id中去

    @RequestMapping("/itemEdit")
    public String queryItemById(@RequestParam(value = "itemId", required = true, defaultValue = "1") Integer id,
    		ModelMap modelMap) {
    	// 根据id查询商品数据
    	Item item = this.itemService.queryItemById(id);
    	// 把商品数据放在模型中
    	modelMap.addAttribute("item", item);
    	return "itemEdit";
    }
    

    3.2 PathVariable注解

    我们需要从url上获取商品id,步骤如下:

    1.使用注解@RequestMapping("item/{id}")声明请求的url

    {xxx}叫做占位符,请求的URL可以是“item /1”或“item/2

    2.使用(@PathVariable() Integer id)获取url上的数据 

    /**
     * 使用RESTful风格开发接口,实现根据id查询商品
     * 
     * @param id
     * @return
     */
    @RequestMapping("item/{id}")
    @ResponseBody
    public Item queryItemById(@PathVariable() Integer id) {
    	Item item = this.itemService.queryItemById(id);
    	return item;
    }
    

    注意@PathVariable和@RequestParam区别

    1. @PathVariable是获取url上数据的。@RequestParam获取请求参数的(包括post表单提交)

    3.3 @RequestHeader、@CookieValue

    @RequestHeader 注解,可以把Request请求header部分的值绑定到方法的参数上。

    @CookieValue 可以把Request header中关于cookie的值绑定到方法的参数上。

    @RequestMapping("/iteamList.action")  
    public void editList(@RequestHeader("Accept-Encoding") String encoding,  
                                 @CookieValue("JSESSIONID") String cookie)  { 
              System.out.println(encoding);
              System.out.println(cookie);
     }

    3.4 @SessionAttributes, @ModelAttribute

    @SessionAttributes-该注解用来绑定HttpSession中的attribute对象的值,便于在方法中的参数里使用,该注解有value、types两个属性,可以通过名字和类型指定要使用的attribute 对象;

    若希望在多个请求之间共用数据,则可以在控制器类上标注一个 @SessionAttributes,配置需要在session中存放的数据范围,Spring MVC将存放在model中对应的数据暂存到 HttpSession 中。


    注意:@SessionAttributes只能使用在类定义上。

    @Controller  
    @RequestMapping("/item")  
    
    @SessionAttributes(value={"username","password")
    @SessionAttributes(types=User.class)
    @SessionAttributes(types={User.class,Item.class},value={"username","password"})
    public class ItemController{  
      
        @RequestMapping("/editIteam.action")
        public String editItem(Model model){
            User user = new User("jack","123456");
            model.addAttribute("user", user);
            model.addAttribute("username","jack");
            return "success";
        } 
    }  

    处理方法editItem在model中存放了属性名为user和username的数据, 
    处理结束后,model里的数据会被放入到request中,页面通过request域可以获取到。
    而这里使用了@SessionAttributes(value={“user”})将model中属性名为user的数据copy一份进了session域中.

    页面获取:

    <h1>user requestScope:${requestScope.user}</h1>
    <h1>user sessionScope:${sessionScope.user}</h1>

    @ModelAttribute

    该注解有两个用法,一个是用于方法上,一个是用于参数上;

    用于方法上时:  通常用来在处理@RequestMapping之前,为请求绑定需要从后台查询的model;

    被@ModelAttribute注释的方法会在此controller每个方法执行前被执行,因此对于一个controller映射多个URL的用法来说,要谨慎使用。

    用于参数上时: 用来通过名称对应,把相应名称的值绑定到注解的参数bean上;要绑定的值来源于:

    A) @SessionAttributes 启用的attribute 对象上;

    B) @ModelAttribute 用于方法上时指定的model对象;

    C) 上述两种情况都没有时,new一个需要绑定的bean对象,然后把request中按名称对应的方式把值绑定到bean中。

    备注:由于很少很少用到,详细用法就不在此介绍了,有需要请自行网上查找具体用法。

    4.controller方法返回值类型

    4.1 返回ModelAndView

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

    	@RequestMapping(value = "/itemEdit.action")
    	public ModelAndView toEdit(Integer id,
    			HttpServletRequest request,HttpServletResponse response
    			,HttpSession session,Model model){
    			
    		//查询一个商品
    		Items items = itemService.selectItemsById(id);
    		ModelAndView mav = new ModelAndView();
    		//数据
    		mav.addObject("item", items);
    		mav.setViewName("editItem");
    		return mav;
    	}

    4.2 返回void

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

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

    request.getRequestDispatcher("页面路径").forward(request, response);
    
    request.getRequestDispatcher("/WEB-INF/jsp/success.jsp").forward(request, response);

    4.4.2、通过response页面重定向:

    response.sendRedirect("url")
    
    response.sendRedirect("/springmvc-web2/itemEdit.action");

    4.4.3 通过response指定响应结果

    可以通过response指定响应结果,例如响应json数据如下:
    
    response.getWriter().print("{"abc":123}");
    
    

     

    4.5 返回字符串

    4.5.1 返回逻辑视图名

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

    //指定逻辑视图名,经过视图解析器解析为jsp物理路径:/WEB-INF/jsp/itemList.jsp

    @RequestMapping(value = "/itemlist.action")
    	public String itemList(Model model,
                               HttpServletRequest request,
                               HttpServletResponse response,
                               HttpSession session
                                             ) throws Exception{
    		List<Items> list = itemService.selectItemsList();
    		model.addAttribute("itemList", list);
    		return "itemList";
    	}

    4.5.2 通过Redirect重定向

    Contrller方法返回字符串可以重定向到一个url地址

    如下商品修改提交后重定向到商品编辑页面。

    @RequestMapping("updateItem")
    public String updateItemById(Item item) {
    	// 更新商品
    	this.itemService.updateItemById(item);
    
    	// 修改商品成功后,重定向到商品编辑页面
    	// 重定向后浏览器地址栏变更为重定向的地址,
    	// 重定向相当于执行了新的request和response,所以之前的请求参数都会丢失
    	// 如果要指定请求参数,需要在重定向的url后面添加 ?itemId=1 这样的请求参数
    	return "redirect:/itemEdit.action?itemId=" + item.getId();
    }
    

     

    4.5.3 forward转发

    Controller方法执行后继续执行另一个Controller方法

    如下商品修改提交后转向到商品修改页面,修改商品的id参数可以带到商品修改方法中。

    @RequestMapping("/updateItem")
    public String updateItemById(Item item) {
    	// 更新商品
    	this.itemService.updateItemById(item);
    
    	// 修改商品成功后,继续执行另一个方法
    	// 使用转发的方式实现。转发后浏览器地址栏还是原来的请求地址,
    	// 转发并没有执行新的request和response,所以之前的请求参数都存在
    	return "forward:/itemEdit.action";
    
    }
    

    哈喽,各位亲,觉得还不错请在评论处来个某某来此一游!

  • 相关阅读:
    python之isinstance和issubclass
    python中类的继承
    python中面向对象
    python中常用的内置模块
    Python常用模块
    python中的常用内置模块
    python中的包、模块及导入
    python中的内置函数(二)
    国内7大核心期刊
    PS学习列表
  • 原文地址:https://www.cnblogs.com/Aaron-007/p/12814612.html
Copyright © 2011-2022 走看看