3. SpringMVC中的跳转方式
# springmvc中跳转方式
1. 原始servlet技术中跳转方式
forward跳转: 请求转发
特点: 服务器内部跳转 跳转之后地址栏不变 一次跳转 跳转时可以使用request作用域传递数据
redirect跳转: 请求重定向
特点: 客户端跳转,跳转之后地址栏改变 多次跳转 跳转过程不能使用request作用域
注意:request作用域只能用于一次跳转
2. SpringMVC中跳转方式
forward redirect 两种跳转:
a.Controller ---> JSP页面跳转
forward: 默认就是forward跳转到页面 具体语法 return "页面逻辑名"
redirect: 使用springmvc提供的关键字 redirect: 具体语法:return "redirect:视图的全限定名";
注意:使用redirect跳转不会经过视图解析器
b.Controller ---> Controller之间跳转(相同、不同控制器)
forward: 使用springmvc提供的关键字 forward:
具体语法:
return "forward:/跳转controller类上的@RequestMapping的路径/跳转类中指定方法上@RequestMapping的路径"
redirect: 使用springmvc提供的关键字 redirect:
具体语法:
return "redirect:/跳转controller类上的@RequestMapping的路径/跳转类中指定方法上@RequestMapping的路径"
总结:return "forward:|redirect:/跳转controller类上的@RequestMapping的路径/跳转类中指定方法上@RequestMapping的路径"
或
控制器与JSP页面的跳转
- forward跳转
- 默认就是forward跳转到页面 具体语法 return "页面逻辑名"
test方法
/**
* 测试forward(从Controller)跳转到页面
* 默认:controller跳转到JSP就是forward跳转,因为我们直接返回“index”跳转到index.JSP但是地址栏没有发生改变
*/
@RequestMapping("test")
public String test(){
System.out.println("test ");
return "index"; // forward跳转 请求转发
}
- redirect跳转
- 使用springmvc提供的关键字 redirect: 具体语法:return “redirect:视图的全限定名”;
- 注意:使用redirect跳转不会经过视图解析器
test1方法
/**
* 测试redirect跳转到页面
* redirect跳转到页面:使用springmvc提供的关键字 redirect:
* 使用语法:return "redirect:/index.jsp" return "redirect:视图全名" 全限定名
* 第一个 / 表示根目录下,也就是webapp包下
* 注意:redirect跳转不会经过视图解析器 所以要把路径写全了
*/
@RequestMapping("test1")
public String test1(){
System.out.println("test1");
return "redirect:/index.jsp";
}
注意:下图 return “redirect:/index.jsp”
其中 / 代表根目录,就是webapp包
控制器与控制器之间的跳转
- 相同控制器之间的跳转(相同类不同方法之间的跳转)
- forward
- 使用springmvc提供关键字 forward:
- 具体语法:
return "forward:/跳转controller类上的@RequestMapping的路径/跳转类中指定方法上@RequestMapping的路径"
test2方法
/**
* 测试forward跳转到相同Controller类中不同的方法
* forward跳转到相同Controller类中不同的方法:使用springmvc提供的关键字 forward:
* 使用语法:return "forward:/跳转Controller类上@RequestMapping路径/跳转类中指定方法上@RequestMapping路径
*/
@RequestMapping("test2")
public String test2(){
System.out.println("test2");
return "forward:/forwardAndRedirect/test"; // 请求转发 地址栏不发生改变
}
- redirect
- 使用springmvc提供的关键字 redirect:
- 具体语法:
return "redirect:/跳转controller类上的@RequestMapping的路径/跳转类中指定方法上@RequestMapping的路径"
test3方法
/**
* 使用redirect跳转到相同Controller类中的不同方法
* redirect跳转到相同controller类中的不同方法:使用springmvc提供的关键字 redirect:
* 使用语法:
* return "redirect:/跳转Controller类上@RequestMapping路径/跳转类中指定方法上@RequestMapping路径
* @return
*/
@RequestMapping("test3")
public String test3(){
System.out.println("test3");
return "redirect:/forwardAndRedirect/test"; // 地址栏 test test3 test index.jsp
// 请求重定向 地址栏发生改变
}
- 不同控制器之间的跳转
- 语法其实和相同控制器之间的跳转是一样的,只是把controller控制器类的@RequestMapping的路径改成指定类的@RequestMapping的路径就行了
forward: 使用springmvc提供的关键字 forward:
具体语法:
return "forward:/跳转controller类上的@RequestMapping的路径/跳转类中指定方法上@RequestMapping的路径"
redirect: 使用springmvc提供的关键字 redirect:
具体语法:
return "redirect:/跳转controller类上的@RequestMapping的路径/跳转类中指定方法上@RequestMapping的路径"
- forward
- 使用springmvc提供的关键字 forward:
- 具体语法:
return "forward:/跳转controller类上的@RequestMapping的路径/跳转类中指定方法上@RequestMapping的路径"
test4方法
/**
* 测试跳转到不同controller中相关方法
* forward and redirect
* forward: redirect:
*/
@RequestMapping("test4")
public String test4(){
System.out.println("test4");
return "forward:/hello/hello";
}
需要用到的不是同种的HelloController控制器类
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@RequestMapping(value = "/hello") //value可以省略不写直接写"hello", / 也可以不写
@Controller // 这个是一个控制器组件,@Controller能够用来创建HelloController这个对象
// 有一个value属性,可以设置在工厂中的唯一标识,默认类名首字母小写
public class HelloController {
/**
* RequestMapping 修饰范围:类上 或 方法上
* 1. 用在方法上用来给当前方法加入指定的请求路径
*
* 2. 用在类上用来给类中所有方法加入一个统一请求路径在方法访问之前需要加上类上@RequestMapping的路径
*
* 注意:一旦类上和方法上同时加入@RequestMapping访问时必须
* /项目名/类上@RequestMapping的路径/访问方法上@RequestMapping的路径
*
*
* @return
*/
@RequestMapping(value = "/hello") // 有一个value属性,用来指定该方法的请求路径
public String hello(){
// 1. 收集数据
// 2. 调用业务方法
System.out.println("hello spring mvc");
// 3. 处理响应
return "index"; // 页面逻辑名 日后就会跳转到根(webapp)下面的index.jsp
}
@RequestMapping("save")
public String save(){
// 1. 收集数据
// 2. 调用业务方法
System.out.println("save method ....");
// 3. 处理响应
return "index";
}
}
- redirect
- 使用springmvc提供的关键字 redirect:
- 具体语法:
return "redirect:/跳转controller类上的@RequestMapping的路径/跳转类中指定方法上@RequestMapping的路径"
test4方法
/**
* 测试跳转到不同controller中相关方法
* forward and redirect
* forward: redirect:
*/
@RequestMapping("test4")
public String test4(){
System.out.println("test4");
return "redirect:/hello/hello";
}
总结:
4. SpringMVC中的参数接收
# springmvc中的参数接收
1. struts2框架中的参数接收
请求参数:
url:http://loacalhost:8989/项目名/路径?name=zhangsan&password=123
?号后面的就是请求参数
form表单:<input type="text" name="name">提交
语法:使用action中成员变量接收请求参数
要求:要求传递请求参数key与后台action中声明成员变量名一致才能接收参数同时成员变量必须提供 GET SET 方法
2. springmvc中的参数接收
语法:使用控制器中方法的形参列表接收客户端的请求参数
url : http://localhost:9999/项目名/路径?name=zhangsan&age=23
form: <input type="test" name="name">
要求:要求传递参数key要与对应方法的形参变量名一致才能完成自动赋值
1. 零散类型参数接收
注意:保证请求参数中key与对应方法中声明的形参变量名一致即可
2. 对象类型参数接收
接收对象类型:也是直接将要接受的对象作为控制器方法参数声明
注意:springmvc封装对象时直接根据传递参数key与对象中属性名一致自动封装对象
3. 数组或集合类型参数接收
接收数组:将要接收数组类型直接声明为方法的形参即可
注意:保证请求参数多个参数与key与声明的数组变量名一致,springmvc会自动放入同一个数组中
接收集合:
注意:
springmvc不能直接通过形参列表方式收集集合类型参数
如果要接收集合类型的参数必须将集合放入对象中接收才可以 推荐放入vo对象中接收集合类型
vo = value object 值对象(专门用来接收值的对象)
传递参数key要与对应方法的形参变量名一致才能完成自动赋值
- 零散类型参数接收
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import java.util.Date;
/**
* 用来测试参数接收的Controller
*/
@Controller
@RequestMapping("param")
public class ParamController {
/**
* 测试零散类型的参数接收
* 路径:http://localhost:9999/springmvc_day1/param/test?name=xiaochen&age=23&price=23.23&sex=false&bir=2012/12/12
* 默认日期格式: yyyy/MM/dd
* 或 yyyy/MM/dd HH:mm:ss
*/
@RequestMapping("test")
public String test(String name, Integer age, Double price, Boolean sex, Date bir){
System.out.println("name = " + name);
System.out.println("age = " + age);
System.out.println("price = " + price);
System.out.println("sex = " + sex);
System.out.println("bir = " + bir);
return "index";
}
}
- 对象类型参数接收
/**
* 用来测试参数接收的Controller
*/
@Controller
@RequestMapping("param")
public class ParamController {
/**
* 用来测试对象类型的参数接收
* 接收对象类型:也是直接将要接受的对象作为控制器方法参数声明
* 注意:springmvc封装对象时直接根据传递参数key与对象中属性名一致自动封装对象
* url: http://localhost:9999/springmvc_day1/param/test1?id=21&name=zhangsan&age=23&bir=2012/12/12
* form:
* input name="id"
* input name="name"
* input name="age"
* input name="bir"
*/
@RequestMapping("test1")
public String test1(User user, String name){
System.out.println("name = " + name);
System.out.println("user = " + user);
return "index";
}
}
需要用到的资源类:
public class User {
private String id;
private String name;
private Integer age;
private Date bir;
// 提供get、set方法,提供有参、无参构造,重写toString()方法
// 虽然博客里没有,但这是为了避免代码占用大量的篇幅,实际上是有的
}
另外:
- 数组类型的参数接收
/**
* 用来测试参数接收的Controller
*/
@Controller
@RequestMapping("param")
public class ParamController {
/**
* 用来测试数组类型参数接收
* 接收数组:将要接收数组类型直接声明为方法的形参即可
* 注意:保证请求参数多个参数与key与声明的数组变量名一致,springmvc会自动放入同一个数组中
* url:http://localhost:9999/springmvc_day1/param/test2?qqs=111&qqs=222&qqs=333
* form:checkbox
* input type="checkbox" name="qqs" value="看书"
* input type="checkbox" name="qqs" value="卖报"
* input type="checkbox" name="qqs" value="吃饭"
* input type="checkbox" name="qqs" value="打豆豆"
*/
@RequestMapping("test2")
public String test2(String[] qqs){
for (String qq : qqs) {
System.out.println(qq);
}
return "index";
}
}
- 集合类型的参数接收
/**
* 用来测试参数接收的Controller
*/
@Controller
@RequestMapping("param")
public class ParamController {
/**
* 用来测试集合类型参数接收
* list set map
* 注意:
* springmvc不能直接通过形参列表方式收集集合类型参数
* 如果要接收集合类型的参数必须将集合放入对象中接收才可以 推荐放入vo对象中接收集合类型
* url: http://localhost:9999/springmvc_day1/param/test3?lists=111&lists=222&lists=333
*
* vo = value object 值对象(专门用来接收值的对象)
*/
@RequestMapping("test3")
public String test3(User user){
user.getLists().forEach(str -> {System.out.println(str);});
return "index";
}
}
注意:声明为成员变量之后也要提供相应的GET、SET方法
上面我们提到,如果直接将集合类型声明为随意一个对象的成员变量,这会污染类,因此我们推荐放入vo对象中接收集合类型
所谓的VO对象其实就是专门创建一个类来存放集合类型的类,不使用资源类,而使用自定义的VO类
/**
* 用来测试参数接收的Controller
*/
@Controller
@RequestMapping("param")
public class ParamController {
/**
* 用来测试集合类型参数接收
* list set map
* 注意:
* springmvc不能直接通过形参列表方式收集集合类型参数
* 如果要接收集合类型的参数必须将集合放入对象中接收才可以 推荐放入vo对象中接收集合类型
* url: http://localhost:9999/springmvc_day1/param/test3?lists=111&lists=222&lists=333
*
* vo = value object 值对象(专门用来接收值的对象)
*/
@RequestMapping("test3")
public String test3(CollectionVO collectionVO){
collectionVO.getLists().forEach(str -> {System.out.println(str);});
return "index";
}
}
总结:
springmvc
1.springmvc 是什么
springmvc 是 spring 基础上开发控制器框架 在现有mvc架构中充当也是控制器 典型mvc框架
springmvc 本质替换原有项目中struts2技术
2.springmvc第一个环境搭建
1).引入依赖
2).配置web.xml 核心 DispatcherServlet url-pattern /
<servlet>
<init-param>
<param-name>contextConfigLocaiton</param-name>
<param-value>classpath:springmvc.xml</param-value>
</servlet>
3).引入springmvc配置文件
a.开启注解扫描配置
b.注册处理器适配器 和 处理器映射器
<mvc:annotation-driven></mvc:annotation-driven>
c.配置视图解析器 前缀 / 后缀 .jsp
4).开发控制器 @controller @requestMapping("路径")
public String test(){
//1.收集数据
//2.调用业务对象
//3.响应处理 流程跳转
return "index";//页面逻辑名
}
3.springmvc中跳转
forward: 一次请求 服务器内部跳转 跳转之后地址栏不变 可以使用request作用域传递数据
redirect: 多次请求 客户端跳转 跳转之后地址栏改变 不可以使用request作用域传递数据
Controller ---->JSP:
forward: 默认就是forward跳转 return "页面逻辑名";
redirect: 使用redirect:关键字 return "redirect:页面视图全名" => return "redirect:/index.jsp"
Controller ---->Controller(相同|不同):
forward:|redirect:
总结: return "forward:|redirect:/跳转类上@requestMapping路径/跳转类中指定方法上@requestMapping的路径"
4.springmvc参数接收
语法: springmvc 使用控制器方法参数收集客户端请求数据
要求: 要求请求参数传递key 必须 与 控制器方法中声明形参变量名一致 即可完成自动赋值
1.零散类型参数接收
基本要求:要求请求参数传递key 必须 与 控制器方法中声明形参变量名一致 即可完成自动赋值
2.对象类型参数接收
基本要求:要求请求参数传递key 必须 与控制器方法中声明的对象中属性名一致 springmvc自动完成对象封装
3.数组或集合类型参数接收
数组基本要求: 要求请求参数传递多个key 要与 控制器方法中声明的数组变量名一致 springmvc会自动将多个数据放入同一个数组中
集合类型要求: springmvc接收集合类型时必须将集合进行对象封装之后,使用对象形式接收集合类型的参数
List<String> lists;
CollectionVO{
private List<String> lists;
}
User{
private List<String> lists;
}