Java mvc传递参数_SpringMVC中参数的传递(一)

前言

1.首先,我们在web.xml里面配置前端控制器DispatcherServlet以及字符编码过滤器(防止中文乱码),配置如下:

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

1 <?xml version="1.0" encoding="UTF-8"?>

2

3 xmlns="http://java.sun.com/xml/ns/javaee"

4 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

5 xsi:schemaLocation="http://java.sun.com/xml/ns/javaee6 http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">

7

8

9

10 abc

11 org.springframework.web.servlet.DispatcherServlet

12

13

14

15

16 contextConfigLocation

17 classpath:springmvc.xml

18

19

20 1

21

22

23

24 abc

25 /

26

27

28

29

30 encoding

31 org.springframework.web.filter.CharacterEncodingFilter

32

33

34 encoding

35 utf-8

36

37

38

39

40

41 encoding

42

43 /*

44

45

web.xml

2.配置SpringMVC的配置文件springmvc.xml

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

1 <?xml version="1.0" encoding="UTF-8"?>

2

3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

4 xmlns:mvc="http://www.springframework.org/schema/mvc"

5 xmlns:context="http://www.springframework.org/schema/context"

6 xsi:schemaLocation="http://www.springframework.org/schema/beans7 http://www.springframework.org/schema/beans/spring-beans.xsd8 http://www.springframework.org/schema/context9 http://www.springframework.org/schema/context/spring-context.xsd10 http://www.springframework.org/schema/mvc11 http://www.springframework.org/schema/mvc/spring-mvc.xsd">

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

springmvc.xml

3.编写People类

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

1 packagecom.lmw.pojo;2

3 public classPeople {4 privateString name;5 private intage;6 publicString getName() {7 returnname;8 }9 public voidsetName(String name) {10 this.name =name;11 }12 public intgetAge() {13 returnage;14 }15 public void setAge(intage) {16 this.age =age;17 }18 @Override19 publicString toString() {20 return "People [name=" + name + ", age=" + age + "]";21 }22

23 }

People类

4.编写index.jsp页面(就是一个form表单)

1

2

3

4

5

6

7

这里的action先空着,后面根据实际情况再填写对应的控制器

一、基本数据类型参数的传递

1.首先新建一个main.jsp页面

1

2 这里是main.jsp!3

2.编写控制器DemoController

packagecom.lmw.controller;importorg.springframework.stereotype.Controller;importorg.springframework.web.bind.annotation.RequestMapping;importorg.springframework.web.bind.annotation.RequestParam;

@Controllerpublic classDemoController {/*** 基本数据类型的传递demo

*@paramname

*@paramage

*@return

*/@RequestMapping("demo1")public String demo1(String name, intage){

System.out.println("执行demo1"+" "+name+" "+age);return "main";

}

}

在DemoController面里我们写了一个叫demo1的方法,这个方法有两个参数:String类型的name和int类型的age。SpringMVC会自动帮我们给这两个参数注入值,这里只需要我们的参数名称和index.jsp里面input的name相同即可。这样写好后,将index.jsp里的form表单的action值改为控制器的名字demo1就可以运行了 。

7135c38d9e8befba937d0959722be70f.png

图1 输入name和age

f5c082f3c7b264cee0a66e6dc85b4754.png

图2 提交后跳转到了mian.jsp页面

eb4f20dc3cdea7e57bb3276388c52f55.png

图3 控制台输出

二、对象类型参数的传递

对象数据类型的参数传递包括普通对象、请求对象(request)、session对象等对象的传递。

(一)普通对象类型参数的传递

我们在上面的DemoController里再添加一个demo2方法,如下:

1 2 /**

3 * 对象数据类型的传递demo4 *@paramname5 *@paramage6 *@return

7 */

8 @RequestMapping("demo2")9 publicString demo2(People people){10 System.out.println("执行demo2"+" "+people);11 return "main";12 }

SpringMVC同样也可以对普通对象进行注入,前提条件是input的name要和对象的属性名称相同。将action的值改为demo2就可以了,结果图下面就不贴了。

(二)request对象的传递

首先,同样的,我们在DemoController里再添加一个demo3方法,如下:

1 /**

2 * 利用request对象传值3 *@paramreq4 *@return

5 */

6 @RequestMapping("demo3")7 publicString demo3(HttpServletRequest req){8 req.setAttribute("req", "利用request对象传的值");9 return "main";10 }

在mian.jsp里接收request对象传过来的值:

1

2 request:${request.req }3

然后我们在浏览器里访问控制器demo3,在浏览器输入:http://localhost:8080/springmvc02/demo3,回车

de1f4c5a0312b25eaef0160410bc8732.png

(三)session对象传值

利用session向jsp页面传值和request对象传值类似,在DemoController里添加一个demo4方法,如下:

1 /**

2 * 利用session对象传值3 *@paramsession4 *@return

5 */

6 @RequestMapping("demo4")7 publicString demo4(HttpSession session){8 session.setAttribute("session", "利用session传递了一个值");9 return "main";10 }

在mian.jsp里接收session对象传过来的值:

1

2 session:${sessionScope.session }3

然后我们在浏览器里访问控制器demo4,在浏览器输入:http://localhost:8080/springmvc02/demo3,回车

ea342aede5e763e05aaebf6a623bd590.png

三、HandlerMethod参数的注解

所谓的handlerMethod即是上面的这些demo方法,在编写这些handlerMethod时,我们可以给这些方法的参数添加注解,用以控制参数。

(一)给参数取别名

当控制器方法的参数名称和jsp页面的参数的名称不相同时,可以使用@RequestParam()注解来实现给控制器方法参数取别名。但实际上这个注解做的事情是将请求中的参数(name1和age1)绑定到控制器中的参数(name和age)里

1.在方法对应的参数之前添加@RequestParam(value="参数名称")注解就可以实现给参数取别名

2.注意,这里的value的值要和jsp页面的name相同

3.当@RequestParam()注解括号里面只有value时,可以将注解简化为@RequestParam("参数名称")(示例里面的参数age)

在DemoController里添加一个demo5方法,如下:

1 /**

2 * 参数注解1:给参数取别名3 * 例如:Controller的方法里面的参数名和jsp页面的参数名不一致时可以给参数取别名4 *@paramname5 *@paramage6 *@return

7 */

8 @RequestMapping("demo5")9 public String demo5(@RequestParam(value="name1")String name, @RequestParam("age1")intage){10 System.out.println("执行demo5"+" "+name+" "+age);11 return "main";12 }

index.jsp如下:

1

2

3

4

5

6

7

在浏览器里输入:http://localhost:8080/springmvc02/index.jsp,回车

(二)给参数一个默认值

当不管什么情况下,我们都需要给控制器里面的参数一个默认值时,这个时候就可以使用到注解@RequestParam()的另外一个属性:defaultValue属性。

1.在参数前添加注解@RequestParam(defaultValue="参数的默认值")就可以给参数一个默认值,参数的默认值是defaultValue的值

2.当我们不给出这个参数的值时,该参数就取默认值

在DemoController里添加一个demo6方法,如下:

1 /**

2 * 参数注解2:给参数一个默认值3 * 如果不给出这个参数的值,该参数就取默认值4 * 例如:在分页功能的Controller里面给pageSize和pageNumber一个默认值既可以少写几个非空判断了5 *@paramname6 *@paramage7 *@return

8 */

9 @RequestMapping("demo6")10 public String demo6(@RequestParam(defaultValue="lmw")String name, @RequestParam(defaultValue="21")intage){11 System.out.println("执行demo6"+" "+name+" "+age);12 return "main";13 }

index.jsp如下:

1

2

3

4

5

6

7

在浏览器里输入:http://localhost:8080/springmvc02/index.jsp,回车

(三)设置参数为必须值

如果控制器方法里面的参数是必须给出的,这个时候就需要使用到@RequestParam()的第三个属性:required属性。required是boolen类型,默认为true,即必须要给出这个参数,否则就会报异常。

1.在参数前添加注解@RequestParam(required=true)设置参数为必须值

2.如果不给出这个参数就会报异常

在DemoController里添加一个demo7方法,如下:

1 /**

2 *参数注解3:设置参数为必须值

3 *如果不给出这个参数就会报异常

4 *例如:name作为SQL查询语句的条件这种情况,我们把name设置为必须值

5 *@param name

6 *@param age

7 *@return

8 */

9 @RequestMapping("demo7")

10 public String demo7(@RequestParam(required=true)String name, @RequestParam(required=true)int age){11 System.out.println("执行demo7"+" "+name+" "+age);

12 return "main";

13 }

index.jsp页面将from表单里面的action的值改为demo7,其他不变,在浏览器里输入:http://localhost:8080/springmvc02/index.jsp回车

四、复杂参数的传递

(一)传递多个同名参数的值

除了上面的基本数据类型的参数和对象类型的参数传递,那么当表单里有复选框的时候,我们要怎么将勾选中的复选框的值传到控制器里面呢?也就是说当请求的参数中包含多个同名参数的时候,我们要如何实现这些参数的传递呢?

那么首先就要思考一个问题,我们要将这些同名参数存储在一个什么样容器里面呢?一个很简单的方式,我们可以使用一个List来存储这些同名参数的值。那么是不是同之前一样,只要我们将List的对象名改为input的name就可以了呢?答案是否定的,即使你这样做SpringMVC也无法对List容器进行注入的,因为我们还没有将这些参数与List进行绑定,所以需要使用到注解@RequestParam()来将请求中的参数与List进行绑定。给出一个示例如下:

在DemoController里添加一个demo8方法,如下。

1 /**

2 * 当请求参数中包含多个同名参数的情况,如复选框传递的参数3 *@paramname4 *@paramage5 *@paramhobbyList6 *@return

7 */

8 @RequestMapping("demo8")9 public String demo8(String name, int age, @RequestParam("hobby")ListhobbyList){10 System.out.println("执行demo8"+" "+name+" "+age+" "+hobbyList.toString());11 return "main";12 }

index.jsp页面如下:

1

2

3

4

5

6

7

8

9

10

11

在浏览器里输入:http://localhost:8080/springmvc02/index.jsp回车

(二)请求参数名为对象名.属性名的格式

显然,针对这种特殊的情况,使用普通对象类型参数的传递方式无法实现要求。那么此时我们就需要对这个"."前面的对象进行一个封装了,采取的方法是将这个对象封装在另外一个类里面,使其成为该类的一个属性。给出一个示例如下:

index.jsp如下:

1

2

3

4

5

6

7

根据上面name的值,我们对People类进行封装,示例如下:

1 packagecom.lmw.pojo;2

3 public classPeo {4 privatePeople peo;5

6 publicPeople getPeo() {7 returnpeo;8 }9

10 public voidsetPeo(People peo) {11 this.peo =peo;12 }13

14 @Override15 publicString toString() {16 return "Peo [peo=" + peo + "]";17 }18 }

在DemoController里添加一个demo9方法,如下:

1 Peo example = newPeo();2 /**

3 * 请求参数名为对象名.属性名的格式的情况4 * 请求参数为集合对象类型5 *@paramexample6 *@return

7 */

8 @RequestMapping("demo9")9 publicString demo9(Peo example){10 System.out.println("执行demo9"+" "+example);11 return "main";12 }

在浏览器里输入:http://localhost:8080/springmvc02/index.jsp回车

类似的,当请求参数名为如下这种格式时,我们也可以采取相同的做法。

1

2

3

4

5

6

7

8

9

这种情况做法和上面类似,同样是将对象进行封装,具体如何实现大家可以自己去试一试。

(三)restful风格传值方式

所谓REST是REpresentational State Transfer的缩写(一般中文翻译为表述性状态转移),REST 是一种体系结构,具体可自行百度。使用这种风格开发最显而易见的就是传递参数的时候不再是url?paramname1=paramvalue1&paramname2=paramvalue2这种格式,而是变成了https://www.jianshu.com/p/91600da4df95这种格式,每个"/"后面的紧跟着的是参数。那么在SpringMVC中如何实现这种方式传递参数呢?

在DemoController里添加一个demo10方法,示例代码如下:

1 /**

2 * restful传值方式3 *@paramname4 *@paramage5 *@return

6 */

7 @RequestMapping("demo10/{name}/{age1}")8 public String demo10(@PathVariable String name, @PathVariable(value="age1")intage){9 System.out.println(name+" "+age);10 return "main";11 }

注意:

1.需要使用到请求映射注解——@RequestMapping,这个注解会将 HTTP 请求映射到SpringMVC控制器的处理方法上。你只需要像这样配置这个注解:@RequestMapping("控制器名称/{XXX}/{XXX}")。其中,每一个{XXX}表示URL请求中的参数的占位符。

2.在每个参数之前需要添加注解@PathVariable。这个注解可以将请求的URL中的参数映射到控制器处理方法的参数上

3.如果请求中的参数名和注解里面的参数名不一致,需要给注解@PathVariable一个value,这个value的值要和请求的参数名相同(上面的参数age,在注解里面的名称是age1,类似于给控制器里面的参数取一个别名)

在浏览器里输入:http://localhost:8080/springmvc02/demo10/lmw/21回车即可在控制台看到效果

e41d087cbc16f9db3936250669a09ac2.png

未完待续。。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值