springmvc关于参数的处理问题

  •  
  • 一、Action参数类型
    • 1.1、自动参数映射
      • 1.1.1、基本数据类型
      • 1.1.2、自定义数据类型
      • 1.1.3、复杂数据类型
      • 1.1.4、List集合类型
      • 1.1.5、Map集合类型
    • 1.2、@RequestParam参数绑定
      • 1.2.1、基本数据类型绑定与注解属性
      • 1.2.2、List与数组绑定基本数据类型
      • 1.2.3、List与数组直接绑定自定义数据类型与AJAX
    • 1.3、重定向与Flash属性
    •  1.4、@ModelAttribute模型特性
      • 1.4.1、注解在参数上
      • 1.4.2、注解在方法上
  • 二、Action返回值类型
    • 2.1、视图中url问题
    • 2.2、返回值为String
      • 2.2.1、String作为视图名称
      • 2.2.2、String作为内容输出
    • 2.3、返回值为void
      • 2.3.1、方法名默认作为视图名
      • 2.3.2、直接响应输出结果
    • 2.4、返回值为ModelAndView
    • 2.5、返回值为Map
    • 2.6、返回值为任意类型
      •  2.6.1、返回值为基本数据类型
      • 2.6.2、当返值为自定义类型
    • 2.7、返回值为Model类型
    • 2.8、小结
  • 这我们先去讲解一下常见的注解

@PathVariable 注解参数访问URI模板变量。
@RequestParam 注解参数访问特定的Servlet请求参数,请求参数绑定。
@RequestBody 注解参数访问HTTP请求主体,注解映射请求体
@RequestPart 注解参数访问“的multipart / form-data的”请求部分的内容。处理客户端上传文件,多部分文件上传的支持
@SessionAttribute 注解参数会话属性
@RequestAttribute 注解参数访问请求属性

1.基本类型

方法的参数可以任意基本类型,如果参数名个http请求的参数名称相同时进行自动映射。

********包装类型也一样,但如果参数中没有对应名称与类型的数据会抛出异常。

自定义数据类型。

除了基本数据类型,也可以自定义的数据类型,如果一个自定义的pojo对象,SpringMVC会通过反射吧请求的参数设置到对象中,转换类型。

复杂数据类型

这里的复杂数据 类型指的是一个自定义类型中还包括另外一个对象类型。

List,Map,Set 集合类型。不能直接在action中指定List类型。定义一个类型包装List集合在其中。

public class ProductMap {
    private Map items;

    public Map getItems() {
        return items;
    }

    public void setItems(Map items) {
        this.items = items;
    }
}
//产品集合
public class ProductList {
    private List items;

    public List getItems() {
        return items;
    }

    public void setItems(List items) {
        this.items = items;
    }
}

1.2@RequestParam参数绑定

简单的参数可以使用上一节中讲过的自动参数映射,复杂一些的需要使用@RequestParam完成。虽然自动参数映射很方便。

但有些细节是不能处理的,如参数是否必须参数。名称没有办法指定。参数的默认值就没有办法做到了。如果使用了@RequestParam可以实现 请求参数绑定。SpringMVC会自动查找请求中的参数类型转换并将于参数进行绑定。

@Controller
@RequestMapping("/foo")
public class FooController {
    @RequestMapping("/action1")
    public String action1(Model model, @RequestParam(required = false, defaultValue = "99") int id) {
        model.addAttribute("message", id);
        return "foo/index";
    }
}

@RequestParam共有4个注解属性,required属性表示是否为必须,默认值为true,如果请求中没有指定的参数会报异常;defaultValue用于设置参数的默认值,如果不指定值则使用默认值,只能是String类型的。name与value互为别名关系用于指定参数名称。

在上一节中我们使用自动参数映射是不能直接完成List与数组绑定的,结合@RequestParam可以轻松实现

 // List集合与数组类型
    @RequestMapping("/action05")
    public String action05(Model model, @RequestParam("u") List users) {
        model.addAttribute("message", users.get(0) + "," + users.get(1));
        return "foo/index";
    }

List与数组直接绑定自定义数据类型与Ajax.

上一小节中我们绑定的集合存放的只是基本数据类型。如果需要指定更加的复杂的数据类型则需要使用@RequestBody与@ResponseBody注解了。

@RequestBody默认接收的Content-Type是application/json。因此发送发送POST请求时需要设置报文头信息。否则Springmvc在请求是不会自动的转换json数据在解析成相应的集合。Spring默认的json协议解析有Jackson完成。要完成这个功能还需要配置环境。具体要求如下:

1.修改Spring MVC配置文件,请用mvc注解驱动功能。

2.pom.xml添加jackson依赖,添加依赖的配置内容如下:


    
        com.fasterxml.jackson.core
        jackson-core
        2.5.2
    
    
        com.fasterxml.jackson.core
        jackson-databind
        2.5.2
    

3.ajax请求时需要设置属性dataType 为 json,contentType 为 'application/json;charse=UTF-8',data 转换成JSON字符串,如果条件不满足有可能会出现415异常。

    // List与数组直接绑定自定义数据类型与AJAX
    @RequestMapping("/action21")
    public void action21(@RequestBody List products, HttpServletResponse response) throws IOException {
        response.setCharacterEncoding("UTF-8");
        System.out.println(Arrays.deepToString(products.toArray()));
        response.getWriter().write("添加成功");
    }

action21的参数#@RequestBody List products是接收从客户端发送到服务器的产品集合。默认的请求请求并非是

application/json.而是:application/x-www-form-urlendscoded。在参数前增加@RequestBody的作用是让Springmvc在接收客户端请求时选择合适的转换器将参数转换成相应的对象。

 

//这里我们跑题去讲一下get和post请求的区别:

content-type请求是干吗的呢。http请求头是由四种类型。分别是通用头部,请求头部,响应头部以及内容头部。首先,我们要弄清楚。content-type是干嘛的呢?content-type是属于内容头部的。那么这个请求是用来想接收端传递的改内容主题的。content-type的取值去告诉服务端。你传递过去的内容是啥。应该准备去如何接收她呢。

’application/json’,传递的是一个json对象,并不是直接丢一个对象过去,需要进行序列化,JSON.stringify(data);

’application/x-www-form-urlencoded’,最终还是表单提交的形式,例如我们发送一个登录请求,参数是{user:1234,pwd:1234},最终提交服务器的是user=1234&pwd=1234。数据被编码为名称/值对。这是标准的编码格式。默认行为。 

’multipart/form-data’。一般用来上传文件): 数据被编码为一条消息,页上的每个控件对应消息中的一个部分。

前面的大家基本了解后,我们开始正题了。

GET 请求不存在请求实体部分,键值对参数放置在 URL 尾部,浏览器把form数据转换成一个字串(name1=value1&name2=value2...),然后把这个字串追加到url后面,用?分割,加载这个新的url。因此请求头不需要设置 Content-Type 字段。

非 ASCII 码会自动进行编码转换,例如发送请求:www.bilibili.com?hehe=你的我的

值得一提的是,GET 参数的编码方式是无法人为干涉的,这导致了不同浏览器有不同的编码方式,因此最稳妥的方案是人工预编码,人工解码,从而禁止浏览器编码的干涉。

所以我们就可以回到上文了。

 

 

 

 

 

 

 

 

 

 

 

2.8、小结

使用 String 作为请求处理方法的返回值类型是比较通用的方法,这样返回的逻辑视图名不会和请求 URL 绑定,具有很高的灵活性,而模型数据又可以通过Model控制。

使用void,map,Model时,返回对应的逻辑视图名称真实url为:prefix前缀+控制器路径+方法名 +suffix后缀组成。(

void map model 都是使用默认视图的名称为方法名)

使用String,ModelAndView返回视图名称可以不受请求的url绑定,ModelAndView可以设置返回的视图名称。

另外在非MVC中使用的许多办法在Action也可以使用。

你可能感兴趣的:(springmvc关于参数的处理问题)