前面讲了入门篇,现在来了解下springmvc的细节.mvc框架都有请求映射、数据绑定、请求处理、视图解析这几个过程,现在我们来了解springmvc中的这些细节。

1.使用@RequestMapping来配置springmvc请求映射的url

  springmvc中的请求映射有多种方式,当然用得最多的是基于注解的请求映射方式.开发中,我们中使用@RequestMapping这个注解来表示controller和方法的url.@RequestMapping的源码:

@Target({ElementType.METHOD, ElementType.TYPE}) // 注解可以用在类和方法上
@Retention(RetentionPolicy.RUNTIME)  // 注解在运行期有效
@Documented
@Mapping
public @interface RequestMapping {
   String[] value()
default {};
   RequestMethod[] method()
default {};
   String[] params()
default {};
   String[] headers()
default {};
   String[] consumes()
default {};
   String[] produces()
default {}; }

  其中value属性用来表示url,其他属性用于限定请求,也就是只有满足某些条件才处理请求.

  • value : 指定请求的实际地址,最常用的属性,例如:@RequestMapping(value="/xxx"),value的值可以以"/"开头,也可以不用"/",springmvc会自动补"/".
  • method: 指定访问方式,包括POST or GET or others...,默认都支持.以RequestMethod枚举来表示.

        例如:@RequestMapping(method=RequestMethod.POST)

  • heads: 限定request中必须包含的请求头

 

    例如:限定Content-Type @RequestMapping(headers={"Content-Type=application/x-www-form-urlencoded"})

  • consumes: 限定请求头中的Content-Type

    例如 : @RequestMapping(value = "/pets", method = RequestMethod.POST, consumes="application/json")该方法仅处理ContentType=application/json的请求

  • produces: 限定request中Accept

    例如:@RequestMapping(value = "/pets/{petId}", method =RequestMethod.GET, produces="application/json")该方法仅处理request中Accept包含application/json的请求

  consumes和produces用的比较少,其他几个属性比较常见.

  @RequestMapping使用的实例:

     @Controller
        @RequestMapping(value="/hello")
        public class HelloworldController {
        
            @RequestMapping(value="/say", //--> 请求url
                            method={RequestMethod.POST}, // 请求方式为 post
                            headers={"Content-Type=application/x-www-form-urlencoded"}, // 必须包含ContentType=application/x-www-form-urlencoded,普通表单提交
                            params={"name=xxx","email=yyy"}) // 请求中必须包含 name=xxx&email=yyy
                            //params={"name=xxx"})--->请求参数中必须包含
                            //headers={"Content-Type=application/x-www-form-urlencoded"}) --> 限制请求头
            public String sayHello(){
                System.out.println("hello");
                return "hello";
            }
            
        }

2.使用@RequestParam和@ModelAttribute完成数据绑定

  直白点说,就是如何接收request中的参数呢?springmvc的做法是在方法中定义形式参数,在调用方法时将request中参数赋值给对应的参数,通过注解来描述形参和request中参数的对应关系.

  简单例子,调用sayHello方法时,会传一个name参数.程序中如何接收呢?

@RequestMapping(value="/say")
    public String sayHello(@RequestParam(value="nm",required=true,defaultValue="zzz")String name){
        
        System.out.println("hello "+name);
        
        return "hello";
    }

  RequestParam有三个属性:

  • value: 将request中value对应的参数值绑定到应用注解的变量上,对应上面的例子中:把request中nm的值传给name.
  • required:该参数是否必须,true:必须,request不包含此参数则抛异常
  • defaultValue:如果request中没有包含value参数,则使用defaultValue值绑定到变量

  如果request参数名称和方法中形参名字一样,代码上可以不声明@RequestParam,框架会自动注入.

  @RequestParam用来接收单个变量,如果我们要接收的是一个对象呢?例如User(name,email)对象.这时我们可以用另外一个注解@ModelAttribute.该注解的作用就是把request中参数绑定到一个对象上.

    @RequestMapping(value="process")
        public String process(@ModelAttribute("user")User user){
            System.out.println(user);
            return "index";
        }

   接收request的参数搞定了,那如何把数据放到request中,然后带回页面呢?这里有两种一种,一种就是通过ModelAndView对象,一种就是在方法中声明参数.前一种方法在之后视图解析时再说,这里我们将第二种方法.springmvc为解决这个问题提供了一种很优雅的方法,在方法声明Model或者Map的实例,把数据放到Model或者Map中(实际上Model中也是封装了一个Map,只不过Model是以接口的形式提供的),框架在执行方法时会把Model和Map的实例方法request中,这样就可以在页面上通过EL表达式取出页面显示了.这个过程在源码分析那篇中有提到.

    @RequestMapping(value="process")
        public String process(@ModelAttribute("user")User user,Model model){
            System.out.println(user);
       // 带参数到页面 jsp上${name}就可以取值
       model.addAttribute("name",user.getName());
return "index"; }
  
    @RequestMapping(value="process2")
        public String process(@ModelAttribute("user")User user,Map<String,Object> result){
            System.out.println(user);
       // 带参数到页面 jsp上${name}就可以取值
       result.put("name",user.getName());
return "index"; }
 

 3.结果页面的返回

  请求处理过程就是调用url对应的方法完成请求的处理的过程,在源码分析篇详细分析了这个过程。这里我们直接讲结果页面的返回.springmvc中提供了一个ModelAndView对象封装结果视图。之前的处理中我们都是返回字符串形式的视图名称,这个字符串最终也会成为ModelAndView对象中的viewName属性,然后交由springmvc中结果视图组件解析.

  结果页面返回主要有转发和重定向两种方式,这部分直接看代码:

package cn.springmvc.controller;

import java.util.HashMap;
import java.util.Map;

import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.view.RedirectView;

@Controller("resultPageController")
@RequestMapping(value="result")
@Scope("prototype")
public class ResultPageController {
    
        /****************** 以forward方式返回结果页面  **************************/
        @RequestMapping(value="forward1")
        public String toViewByForwad1(){
            // 逻辑处理
            
            //  转发到index页面-->默认是转发
//            return "forward:index";=== return "index";
            return "index";
        }
        @RequestMapping(value="forward2")
        public ModelAndView toViewByForwar2(){
            
            // TODO:逻辑处理
            
            ModelAndView mv = new ModelAndView();
            mv.setViewName("index");// 默认是转发方式 可以在逻辑视图加forward:也可以不加
            // 用ModelAndView可以往request中添加参数
            mv.addObject("name","xxx");
            return mv;
        }
        
        
        /********************** 重定向 的三种方式  ******************************************/
        @RequestMapping(value="redirect")
        public String redirect(){
            // "forword:xxx"
            return "redirect:http://www.baidu.com?wd=xx";
        }
        
        @RequestMapping(value="redirect2")
        public ModelAndView redirect2(){
            ModelAndView mv = new ModelAndView();
            mv.setViewName("redirect:http://www.baidu.com");
            mv.addObject("wd","xx");
            return mv;
        }
        
        @RequestMapping(value="redirect3")
        public ModelAndView redirect3(){
            System.out.println("redirect3");
            ModelAndView mv = new ModelAndView();
            RedirectView redirectView = new RedirectView("http://www.baidu.com");
            Map<String,Object> params = new HashMap<String,Object>();
            params.put("wd", "xxxx");
            redirectView.setAttributesMap(params);
            mv.setView(redirectView);
            return mv;
        }
        
}
View Code

相关文章:

  • 2022-12-23
  • 2022-01-19
  • 2021-03-31
  • 2021-09-12
  • 2021-10-16
  • 2021-09-16
  • 2021-08-24
猜你喜欢
  • 2021-06-17
  • 2022-01-07
  • 2021-06-14
  • 2022-01-23
  • 2021-12-28
  • 2022-12-23
  • 2021-12-13
相关资源
相似解决方案