springmvc关于参数的处理问题

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

1.基本类型

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

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

自定义数据类型。

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

复杂数据类型

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

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

public class ProductMap {
    private Map<String, Product> items;

    public Map<String, Product> getItems() {
        return items;
    }

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

    public List<Product> getItems() {
        return items;
    }

    public void setItems(List<Product> 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<String> 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注解驱动功能。<mvc:annotation-driven />

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

<!-- jackson -->
    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-core</artifactId>
        <version>2.5.2</version>
    </dependency>
    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-databind</artifactId>
        <version>2.5.2</version>
    </dependency>

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

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

action21的参数#@RequestBody List<Product> 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也可以使用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值