SpringMVC学习笔记-请求

请求参数(重点)

普通类型参数传参

参数设定

POJO类型参数传参

参数冲突

复杂POJO类型参数

数组与集合类型参数传参

数组类型参数

集合类型参数

请求映射 @RequestMapping(重点)

方法注解

类注解

常用属性


请求参数(重点)

SpringMVC将传递的参数封装到处理器方法的形参中,达到快速访问参数的目的。

普通类型参数传参

@RequestMapping("/requestParam1")
public String requestParam1(String name){
    System.out.println(name);
    return "page.jsp";
}

访问地址

http://localhost/requestPram1?name=Harmony

@RequestMapping("/requestParam1")
public String requestParam1(String name,int age){
    System.out.println(name + " " + age);
    return "page.jsp";
}

访问地址

http://localhost/requestParam1?name=Harmony&age=14

注意:参数名处理器方法形参名要保持一致!即访问的地址参数名输入不是name,或者个数一致浏览器都是会报错的!

参数设定

@RequestParam 的使用

 类型: 形参注解 

 位置:处理器类中的方法形参前方

 作用:绑定请求参数对应处理方法形参间的关系

@RequestMapping("/requestParam2")
public String requestParam2(@RequestParam(name = "userName",
                                            required = true,
                                            defaultValue = "Harmony") String name) {
    System.out.println("name="+name);
    return "page.jsp";
}

访问地址

http://localhost/requestParam2?userName=Jock

这里的参数是name,我们可以通过@RequestParam给参数取别名。required为true表示必须传参,defaultValue的值表示该参数的默认值,即若不写参数,就默认为Harmony!

POJO类型参数传参

大致包含一下几个内容

当POJO中使用简单类型属性时, 参数名称与POJO属性名保持一致

问:在user类中有name和age两个属性,那么如果有一个简单属性age实体类user中的age那么怎么给它们传参?

参数冲突

当POJO类型属性与其他形参出现同名问题时,将被同时赋值

解决办法

建议使用@RequestParam注解进行区分

上述讲到可以起别名,我们用@RequestParam("userAge"),将简单属性age取别名为userAge,除此之外没有更好的解决办法了!

// http://localhost/requestParam4?name=Jock&age=39
@RequestMapping("/requestParam4")
public String requestParam4(User user,@RequestParam("userAge") int age){
    System.out.println(user+" "+age);
    return "page.jsp";
}

复杂POJO类型参数

(1)当POJO中出现对象属性时,参数名称对象层次结构名称保持一致

在User实体类中有引用类型address,传参时我们用层次关系即可

address是一级属性,province是二级属性。

(2)当POJO中出现List保存对象数据,参数名称对象层次结构名称保持一致,使用数组格式描述集合中对象的位置

public class User {
    private String name;
    private Integer age;
    private Map<String,Address> addressMap;
}
public class Address {
    private String province;
    private String city;
    private String address;
}
@RequestMapping("/requestParam7")
public String requestParam7(User user){
    System.out.println("user.addresses="+user.getAddress());
    return "page.jsp";
}

访问地址

(3)当POJO中出现Map,保存对象数据,参数名称与对象层次结构名称保持一致,使用映射格式描述集合中对象的位置

public class User {
    private String name;
    private Integer age;
    private Map<String,Address> addressMap;
}
public class Address {
    private String province;
    private String city;
    private String address;
}
@RequestMapping("/requestParam8")
public String requestParam8(User user){
    System.out.println("user.addressMap="+user.getAddressMap());
    return "page.jsp";
}

访问地址 

较使用List的而言,将[ ]中的内容换成 key就行!

数组与集合类型参数传参

数组类型参数

请求参数名与处理器方法形参名保持一致,且请求参数数量> 1个

@RequestMapping("/requestParam9")
public String requestParam9(String[] nick){
    System.out.println(nick[0]+","+nick[1]);
    return "page.jsp";
}

访问路径 

传参的个数必须大于1个,不然会报错!

集合类型参数

保存简单类型数据,请求参数名与处理器方法形参名保持一致,且请求参数数量> 1个

@RequestMapping("/requestParam10")
public String requestParam10(@RequestParam("nick") List<String> nick){
    System.out.println(nick);
    return "page.jsp";
}

访问路径

如果不使用@RequestParam()会报错!!! 

原因如下: 

SpringMVC默认将List作为对象处理,赋值前先创建对象,然后将nick作为对象的属性进行处理。由于 List是接口无法创建对象,报无法找到构造方法异常;修复类型为可创建对象的ArrayList类型后,对象可以创建,但没有nick属性,因此数据为

此时需要告知SpringMVC的处理器nick是一组数据,而不是一个单一数据。通过@RequestParam注解,将数量大于1个names参数打包成参数数组后, SpringMVC才能识别该数 据格式,并判定形参类型是否为数组或集合,并按数组或集合对象的形式操作数据。

请求映射 @RequestMapping(重点)

之前的案例我们有使用@RequestMapping 注解。

该注解既可以作为类注解,也可以作为方法注解

方法注解

作用:绑定请求地址对应处理方法间的关系

类注解

作用:为当前处理器中所有方法设定公共的访问路径前缀

@Controller
@RequestMapping("/user")
public class UserController {
    @RequestMapping("/requestURL2")
    public String requestURL2() {
        return "page.jsp";
    }
}  

上述代码,在类注解@RequestMapping("/user"),方法注解@RequestMapping("/requestURL2")

所以,访问page.jsp的路径名为:  /user/requestURL2 

 

page.jsp必须放在webapp目录下的user目录中!!!即@RequestMapping("/user")作为类注解,则就要求页面必须放在user的目录里面

注意:下述代码在return里面"/page.jsp",有了“/”表示访问的是根路径下的jsp页面,没有写表示当前路径往下访问。

@Controller
@RequestMapping("/user")
public class UserController {
    @RequestMapping("/requestURL2")
    public String requestURL2() {
        return "/page.jsp";
    }
}

常用属性

@RequestMapping(
    value="/requestURL3", //设定请求路径,与path属性、 value属性相同
    method = RequestMethod.GET, //设定请求方式
    params = "name", //设定请求参数条件,必须有name参数,没写就会报错
    headers = "content-type=text/*", //设定请求消息头条件
    consumes = "text/*", //用于指定可以接收的请求正文类型(MIME类型)
    produces = "text/*" //用于指定可以生成的响应正文类型(MIME类型)
)
public String requestURL3() {
    return "/page.jsp";
}
posted @ 2022-03-23 16:42  金鳞踏雨  阅读(30)  评论(0)    收藏  举报  来源