SpringMVC中参数的传递(一)
前言
1.首先,我们在web.xml里面配置前端控制器DispatcherServlet以及字符编码过滤器(防止中文乱码),配置如下:
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"> <!-- 配置前端控制器 -->
<servlet>
<servlet-name>abc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- 修改springMVC的配置文件路径 -->
<!-- 如果不配置init-param就会在 这个路径下找/WEB-INF/servletName-servlet.xml(默认名) -->
<!-- 所以如果init-param配置错误的话会报FileNotFound异常,提示找不到servletName-servlet.xml文件 -->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc.xml</param-value>
</init-param>
<!-- 自启动,Tomcat启动时加载这个类 -->
<load-on-startup>1</load-on-startup>
</servlet>
<!-- 拦截请求 /表示拦截所有请求但不拦截jsp请求,其他的静态资源如html,css,images都会被拦截 -->
<servlet-mapping>
<servlet-name>abc</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping> <!-- 字符编码过滤器 -->
<filter>
<filter-name>encoding</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<!-- 初始化参数 -->
<init-param>
<param-name>encoding</param-name>
<param-value>utf-8</param-value>
</init-param> </filter>
<!-- 要过滤那些请求 -->
<filter-mapping>
<filter-name>encoding</filter-name>
<!-- 过滤器配置为/* -->
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
web.xml
2.配置SpringMVC的配置文件springmvc.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd"> <!-- 扫描注解 -->
<context:component-scan base-package="com.lmw.controller"></context:component-scan>
<!-- 注解驱动 -->
<!-- handlerMapping的注解方式实现方法 -->
<!-- org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping -->
<!-- handlerAdapter的注解方式实现方法 -->
<!-- org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter -->
<mvc:annotation-driven></mvc:annotation-driven>
<!-- 不拦截静态资源请求 -->
<!-- mapping里面填的是请求的URL以通配符的形式表示 -->
<!-- Location里填的是请求的资源在项目里的位置,即要在哪里去寻找这个资源 -->
<mvc:resources location="/WEB-INF/js/" mapping="/abc/**"></mvc:resources>
<mvc:resources location="/js/" mapping="/js/**"></mvc:resources>
<mvc:resources location="/css/" mapping="/css/**"></mvc:resources>
<mvc:resources location="/images/" mapping="/images/**"></mvc:resources>
</beans>
springmvc.xml
3.编写People类
package com.lmw.pojo; public class People {
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "People [name=" + name + ", age=" + age + "]";
} }
People类
4.编写index.jsp页面(就是一个form表单)
<body>
<form action="#" method="post">
<input type="text" name="name"/>
<input type="text" name="age"/>
<input type="submit" value="提交"/>
</form>
</body>
这里的action先空着,后面根据实际情况再填写对应的控制器
一、基本数据类型参数的传递
1.首先新建一个main.jsp页面
<body>
这里是main.jsp!
</body>
2.编写控制器DemoController
package com.lmw.controller; import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam; @Controller
public class DemoController {
/**
* 基本数据类型的传递demo
* @param name
* @param age
* @return
*/
@RequestMapping("demo1")
public String demo1(String name, int age){
System.out.println("执行demo1"+" "+name+" "+age);
return "main";
}
}
在DemoController面里我们写了一个叫demo1的方法,这个方法有两个参数:String类型的name和int类型的age。SpringMVC会自动帮我们给这两个参数注入值,这里只需要我们的参数名称和index.jsp里面input的name相同即可。这样写好后,将index.jsp里的form表单的action值改为控制器的名字demo1就可以运行了 。
图1 输入name和age
图2 提交后跳转到了mian.jsp页面
图3 控制台输出
二、对象类型参数的传递
对象数据类型的参数传递包括普通对象、请求对象(request)、session对象等对象的传递。
(一)普通对象类型参数的传递
我们在上面的DemoController里再添加一个demo2方法,如下:
/**
* 对象数据类型的传递demo
* @param name
* @param age
* @return
*/
@RequestMapping("demo2")
public String demo2(People people){
System.out.println("执行demo2"+" "+people);
return "main";
}
SpringMVC同样也可以对普通对象进行注入,前提条件是input的name要和对象的属性名称相同。将action的值改为demo2就可以了,结果图下面就不贴了。
(二)request对象的传递
首先,同样的,我们在DemoController里再添加一个demo3方法,如下:
/**
* 利用request对象传值
* @param req
* @return
*/
@RequestMapping("demo3")
public String demo3(HttpServletRequest req){
req.setAttribute("req", "利用request对象传的值");
return "main";
}
在mian.jsp里接收request对象传过来的值:
<body>
request:${request.req }
</body>
然后我们在浏览器里访问控制器demo3,在浏览器输入:http://localhost:8080/springmvc02/demo3,回车
(三)session对象传值
利用session向jsp页面传值和request对象传值类似,在DemoController里添加一个demo4方法,如下:
/**
* 利用session对象传值
* @param session
* @return
*/
@RequestMapping("demo4")
public String demo4(HttpSession session){
session.setAttribute("session", "利用session传递了一个值");
return "main";
}
在mian.jsp里接收session对象传过来的值:
<body>
session:${sessionScope.session }
</body>
然后我们在浏览器里访问控制器demo4,在浏览器输入:http://localhost:8080/springmvc02/demo3,回车
三、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:给参数取别名
* 例如:Controller的方法里面的参数名和jsp页面的参数名不一致时可以给参数取别名
* @param name
* @param age
* @return
*/
@RequestMapping("demo5")
public String demo5(@RequestParam(value="name1")String name, @RequestParam("age1")int age){
System.out.println("执行demo5"+" "+name+" "+age);
return "main";
}
index.jsp如下:
<body>
<form action="demo5" method="post">
<input type="text" name="name1"/>
<input type="text" name="age1"/>
<input type="submit" value="提交"/>
</form>
</body>
在浏览器里输入:http://localhost:8080/springmvc02/index.jsp,回车
(二)给参数一个默认值
当不管什么情况下,我们都需要给控制器里面的参数一个默认值时,这个时候就可以使用到注解@RequestParam()的另外一个属性:defaultValue属性。
1.在参数前添加注解@RequestParam(defaultValue="参数的默认值")就可以给参数一个默认值,参数的默认值是defaultValue的值
2.当我们不给出这个参数的值时,该参数就取默认值
在DemoController里添加一个demo6方法,如下:
/**
* 参数注解2:给参数一个默认值
* 如果不给出这个参数的值,该参数就取默认值
* 例如:在分页功能的Controller里面给pageSize和pageNumber一个默认值既可以少写几个非空判断了
* @param name
* @param age
* @return
*/
@RequestMapping("demo6")
public String demo6(@RequestParam(defaultValue="lmw")String name, @RequestParam(defaultValue="21")int age){
System.out.println("执行demo6"+" "+name+" "+age);
return "main";
}
index.jsp如下:
<body>
<form action="demo6" method="post">
<input type="text" name="name"/>
<input type="text" name="age"/>
<input type="submit" value="提交"/>
</form>
</body>
在浏览器里输入:http://localhost:8080/springmvc02/index.jsp,回车
(三)设置参数为必须值
如果控制器方法里面的参数是必须给出的,这个时候就需要使用到@RequestParam()的第三个属性:required属性。required是boolen类型,默认为true,即必须要给出这个参数,否则就会报异常。
1.在参数前添加注解@RequestParam(required=true)设置参数为必须值
2.如果不给出这个参数就会报异常
在DemoController里添加一个demo7方法,如下:
/**
* 参数注解3:设置参数为必须值
* 如果不给出这个参数就会报异常
* 例如:name作为SQL查询语句的条件这种情况,我们把name设置为必须值
* @param name
* @param age
* @return
*/
@RequestMapping("demo7")
public String demo7(@RequestParam(required=true)String name, @RequestParam(required=true)int age){
System.out.println("执行demo7"+" "+name+" "+age);
return "main";
}
index.jsp页面将from表单里面的action的值改为demo7,其他不变,在浏览器里输入:http://localhost:8080/springmvc02/index.jsp回车
四、复杂参数的传递
(一)传递多个同名参数的值
除了上面的基本数据类型的参数和对象类型的参数传递,那么当表单里有复选框的时候,我们要怎么将勾选中的复选框的值传到控制器里面呢?也就是说当请求的参数中包含多个同名参数的时候,我们要如何实现这些参数的传递呢?
那么首先就要思考一个问题,我们要将这些同名参数存储在一个什么样容器里面呢?一个很简单的方式,我们可以使用一个List来存储这些同名参数的值。那么是不是同之前一样,只要我们将List的对象名改为input的name就可以了呢?答案是否定的,即使你这样做SpringMVC也无法对List容器进行注入的,因为我们还没有将这些参数与List进行绑定,所以需要使用到注解@RequestParam()来将请求中的参数与List进行绑定。给出一个示例如下:
在DemoController里添加一个demo8方法,如下。
/**
* 当请求参数中包含多个同名参数的情况,如复选框传递的参数
* @param name
* @param age
* @param hobbyList
* @return
*/
@RequestMapping("demo8")
public String demo8(String name, int age, @RequestParam("hobby")List<String> hobbyList){
System.out.println("执行demo8"+" "+name+" "+age+" "+hobbyList.toString());
return "main";
}
index.jsp页面如下:
<body>
<form action="demo8" method="post">
<input type="text" name="name"/>
<input type="text" name="age"/>
<input type="checkbox" name="hobby" value="健身"/>
<input type="checkbox" name="hobby" value="游泳"/>
<input type="checkbox" name="hobby" value="读书"/>
<input type="checkbox" name="hobby" value="玩游戏"/>
<input type="submit" value="提交"/>
</form>
</body>
在浏览器里输入:http://localhost:8080/springmvc02/index.jsp回车
(二)请求参数名为对象名.属性名的格式
显然,针对这种特殊的情况,使用普通对象类型参数的传递方式无法实现要求。那么此时我们就需要对这个"."前面的对象进行一个封装了,采取的方法是将这个对象封装在另外一个类里面,使其成为该类的一个属性。给出一个示例如下:
index.jsp如下:
<body>
<form action="demo9" method="post">
<input type="text" name="peo.name"/>
<input type="text" name="peo.age"/>
<input type="submit" value="提交"/>
</form>
</body>
根据上面name的值,我们对People类进行封装,示例如下:
package com.lmw.pojo; public class Peo {
private People peo; public People getPeo() {
return peo;
} public void setPeo(People peo) {
this.peo = peo;
} @Override
public String toString() {
return "Peo [peo=" + peo + "]";
}
}
在DemoController里添加一个demo9方法,如下:
Peo example = new Peo();
/**
* 请求参数名为对象名.属性名的格式的情况
* 请求参数为集合对象类型
* @param example
* @return
*/
@RequestMapping("demo9")
public String demo9(Peo example){
System.out.println("执行demo9"+" "+example);
return "main";
}
在浏览器里输入:http://localhost:8080/springmvc02/index.jsp回车
类似的,当请求参数名为如下这种格式时,我们也可以采取相同的做法。
<body>
<form action="demo9" method="post">
<input type="text" name="peo[0].name"/>
<input type="text" name="peo[0].age"/>
<input type="text" name="peo[1].name"/>
<input type="text" name="peo[1].age"/>
<input type="submit" value="提交"/>
</form>
</body>
这种情况做法和上面类似,同样是将对象进行封装,具体如何实现大家可以自己去试一试。
(三)restful风格传值方式
所谓REST是REpresentational State Transfer的缩写(一般中文翻译为表述性状态转移),REST 是一种体系结构,具体可自行百度。使用这种风格开发最显而易见的就是传递参数的时候不再是url?paramname1=paramvalue1¶mname2=paramvalue2这种格式,而是变成了https://www.jianshu.com/p/91600da4df95这种格式,每个"/"后面的紧跟着的是参数。那么在SpringMVC中如何实现这种方式传递参数呢?
在DemoController里添加一个demo10方法,示例代码如下:
/**
* restful传值方式
* @param name
* @param age
* @return
*/
@RequestMapping("demo10/{name}/{age1}")
public String demo10(@PathVariable String name, @PathVariable(value="age1")int age){
System.out.println(name+" "+age);
return "main";
}
注意:
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回车即可在控制台看到效果
未完待续。。
SpringMVC中参数的传递(一)的更多相关文章
- hibernate的dao中参数的传递取值
hibernate的dao中参数的传递取值 private Query setParameter(Query query, Map<String, Object> map) { if (m ...
- SpringMVC中参数接收
/** * * SpringMVC中参数接收 * 1.接收简单类型 int String * 2.可以使用对象pojo接收 * 3.可以使用集合数据接收参数 * 页面: name="ids ...
- SpringMVC中参数绑定
SpringMVC中请求参数的接收主要有两种方式, 一种是基于HttpServletRequest对象获取, 另外一种是通过Controller中的形参获取 一 通过HttpServletReque ...
- js函数中参数的传递
数据类型 在 javascript 中数据类型可以分为两类: 基本类型值 primitive type,比如Undefined,Null,Boolean,Number,String. 引用类型值,也就 ...
- python函数中参数的传递
Python唯一支持的参数传递方式是『共享传参』(call by sharing)多数面向对象语言都采用这一模式,包括Ruby.Smalltalk和Java(Java的引用类型是这样,基本类型按值传递 ...
- C语言中参数的传递
普通情况: 调用函数参数的传递,是采取入栈的方式,先上图一张: Fun是被调用的函数,而为了演示其参数传递的过程,特意多设了几个参数,其传递参数的汇编代码如下: 可以看出,汇编代码中将这9个参数的前5 ...
- 《从零开始学Swift》学习笔记(Day 20)——函数中参数的传递引用
原创文章,欢迎转载.转载请注明:关东升的博客 参数的传递引用 类是引用类型,其他的数据类型如整型.浮点型.布尔型.字符.字符串.元组.集合.枚举和结构体全部是值类型. 有的时候就是要将一个值类型参数以 ...
- SpringMVC中向服务器传递时间参数时出现的问题
1. 问题描述: 今天在SpringMVC应用中上传参数的时候遇到如下问题: The request sent by the client was syntactically incorrect 这说 ...
- springMVC中a标签传递多个参数到后台的应用
1.js页面:返回json填充HTML部分代码 <a class='byCard' href="+path+"/static/toCardView/"+ data. ...
随机推荐
- 常问的MySQL面试题整理
char.varchar 的区别是什么? varchar是变长而char的长度是固定的.如果创建的列是固定大小的,你会得到更好的性能 truncate 和 delete 的区别是什么? delete ...
- synchronized 代码块怎么用
加不加 synchronized 有什么区别? synchronized 作为悲观锁,锁住了什么? 之前 2 篇文章我们已经知道 synchronized 的使用方法以及锁的内容(实例对象和Class ...
- CentOS 7 + Win 双系统的安装遇到的重要问题
前言:对于刚学linux的朋友们,多多小小因为各种原因需要装双系统,亦或者爱好使然.多数是问题解决,第一次装系统者不推荐看-. 那么现在内德在此就说说在本本上装双系统会遇到的问题及其解决方法. 环境准 ...
- mybatis 批量保存,并且唯一约束
1.主键返回在insert配置中添加两个属性 useGeneratedKeys="true" keyProperty="id" 2.唯一约束冲突可以使用 ON ...
- FPM制作Nginx的RPM软件包
FPM制作Nginx的rpm软件包 FPM相关参数-s:指定源类型-t:指定目标类型,即想要制作为什么包-n:指定包的名字-v:指定包的版本号-C:指定打包的相对路径-d:指定依赖于哪些包-f:第二次 ...
- python实现逻辑回归
首先得明确逻辑回归与线性回归不同,它是一种分类模型.而且是一种二分类模型. 首先我们需要知道sigmoid函数,其公式表达如下: 其函数曲线如下: sigmoid函数有什么性质呢? 1.关于(0,0. ...
- javascript SDK开发之webpack打包支持对象展开运算符...
场景:使用了对象的展开运算符,webpack打包报错,错误如下:Parsing error: Unexpected token - 1.安装依赖 npm install babel-preset-st ...
- mac OS mysql新建数据库运行sql文件
mysql -uroot -proot123 进入本地数据库 create database 数据库名; use 数据库名; source 文件路径 quit 退出
- mac OS Apache Tomcat 启动/停止服务
进入Tomcat下的bin目录 启动Tomcat命令 ./startup.sh Tomcat 默认端口 8080 停止Tomcat服务命令 ./shutdown.sh 执行tomcat ./shutd ...
- 使用BottomNavigationView+ViewPager+Fragment的底部导航栏
2019独角兽企业重金招聘Python工程师标准>>> 使用BottomNavigationView做底部工具栏,使用ViewPager做页面切换,使用Fragment完成每个页面的 ...