页面跳转
- 转发(默认)
@RequestMapping("/showPage1")
public String showPage1() {
System.out.println("user mvc controller is running ...");
// return "WEB_INF/pages/forward:page.jsp";这种方式不支持重定向,只能支持转发格式的
return "forward:page.jsp";
}
- 重定向
@RequestMapping("/showPage2")
public String showPage2() {
System.out.println("user mvc controller is running ...");
return "redirect:page.jsp";
}
注意:
1、页面访问地址中所携带的 /
2、如果目录是在其它层级,那么在返回时候需要加上层级目录
页面访问快捷设定 (InternalResourceViewResolver)
- 展示页面的保存位置通常固定,且结构相似,可以设定通用的访问路径,简化页面配置格式,在运行的时候会自动把设置的路径拼接上去。
- 如果配置了快捷的这种方式,是
不支持使用转发和重定向
的。
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!--
prefix:前缀
suffix:后缀
-->
<property name="prefix" value="/WEB-INF/pages/"/>
<property name="suffix" value=".jsp"/>
/bean>
在代码里因为配置文件已经做了拼接了,所以直接写页面名称就可以了,不需要写前后缀了
public String showPage3() {
return "page";
}
如果未设定返回值,使用void类型,则默认使用访问路径作页面地址的前缀后缀
//最简页面配置方式,使用访问路径作为页面名称,省略返回值
@RequestMapping("/page")
public void showPage5() {
System.out.println("user mvc controller is running ...");
}
带数据页面跳转
方式一:使用HttpServletRequest类型形参进行数据传递
@RequestMapping("/showPageAndData1")
public String showPageAndData1(HttpServletRequest request) {
request.setAttribute("name","itzhuzhu");
return "page";
}
page.jsp
${name}
方式二:使用Model类型形参进行数据传递
@RequestMapping("/showPageAndData2")
public String showPageAndData2(Model model) {
model.addAttribute("name","itzhuzhu");
Book book = new Book();
book.setName("SpringMVC入门实战");
book.setPrice(66.6d);
model.addAttribute("book",book);
return "page";
}
方式三:使用ModelAndView类型形参进行数据传递,将该对象作为返回值传递给调用者
//使用ModelAndView形参传递参数,该对象还封装了页面信息
@RequestMapping("/showPageAndData3")
public ModelAndView showPageAndData3(ModelAndView modelAndView) {
//ModelAndView mav = new ModelAndView(); 替换形参中的参数
// 转发和重定向不能加xml快捷页面访问
// 转发
modelAndView.setViewName(forward:page.jsp");
// 重定向
modelAndView.setViewName("redirect:page.jsp");
Book book = new Book();
book.setName("SpringMVC入门案例");
book.setPrice(66.66d);
//添加数据的方式,key对value
modelAndView.addObject("book",book);
//添加数据的方式,key对value
modelAndView.addObject("name","Jockme");
//设置页面的方式,该方法最后一次执行的结果生效
modelAndView.setViewName("page");
//返回值设定成ModelAndView对象
return modelAndView;
}
三种方式总结:
- String:仅封装页面的基本信息,底层由ModeAndView实现
- Model:仅封装数据
- ModelAndView:封装数据并封装视图,包含Model和View两个对象
返回json数据
需要先导入json的三个坐标:
<!--json相关坐标3个-->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.9.0</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.0</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>2.9.0</version>
</dependency>
方式一:基于response返回数据的简化格式,返回JSON数据
//使用jackson进行json数据格式转化
@RequestMapping("/showData3")
@ResponseBody //将java对象转为json格式的数据
public String showData3() throws JsonProcessingException {
Book book = new Book();
book.setName("SpringMVC入门案例");
book.setPrice(66.66d);
ObjectMapper om = new ObjectMapper();
return om.writeValueAsString(book);
}
方式二:使用SpringMVC提供的消息类型转换器将对象与集合数据自动转换为JSON数据
//使用SpringMVC注解驱动,对标注@ResponseBody注解的控制器方法进行结果转换,由于返回值为引用类型,自动调用jackson提供的类型转换器进行格式转换
@RequestMapping("/showData4")
@ResponseBody
public Book showData4() {
Book book = new Book();
book.setName("SpringMVC入门案例");
book.setPrice(66.66d);
return book;
}
需要手工添加信息类型转换器
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">
<property name="messageConverters">
<list>
<bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"/>
</list>
</property>
</bean
- 方式三:使用SpringMVC注解驱动简化配置
<!--开启springmvc注解驱动,对@ResponseBody的注解进行格式增强,追加其类型转换的功能,具体实现由MappingJackson2HttpMessageConverter进行-->
<mvc:annotation-driven/>
注解驱动格式:
@EnableWebMvc // 加这个注解
public Book showData5() {}
Servlet相关接口-Servlet相关接口替换方案
SpringMVC提供访问原始Servlet接口API的功能,通过形参声明即可
@RequestMapping("/servletApi")
public String servletApi(HttpServletRequest request,
HttpServletResponse response,
HttpSession session){
System.out.println(request);
System.out.println(response);
System.out.println(session);
request.setAttribute("name","itzhuzhu");
System.out.println(request.getAttribute("name"));
return "page.jsp";
}
Head数据获取
- 名称: @RequestHeader
- 类型: 形参注解
- 位置:处理器类中的方法形参前方
- 作用:绑定请求头数据与对应处理方法形参间的关系
@RequestMapping("/headApi")
public String headApi(@RequestHeader("Accept-Language") String head){
System.out.println(head);
return "page.jsp";
}
Cookie数据获取
- 名称: @CookieValue
- 类型: 形参注解
- 位置:处理器类中的方法形参前方
- 作用:绑定请求Cookie数据与对应处理方法形参间的关系
@RequestMapping("/cookieApi")
public String cookieApi(@CookieValue("JSESSIONID") String jsessionid){
System.out.println(jsessionid);
return "page.jsp";
}
Session数据获取
- 名称: @SessionAttribute
- 类型: 形参注解
- 位置:处理器类中的方法形参前方
- 作用:绑定请求Session数据与对应处理方法形参间的关系
@RequestMapping("/sessionApi")
public String sessionApi(@SessionAttribute("name") String name,
@SessionAttribute("age") int age){
System.out.println(name);
System.out.println(age);
return "page.jsp";
}
Session数据设置
- 名称: @SessionAttributes
- 类型: 类注解
- 位置:处理器类上方
- 作用:声明放入session范围的变量名称,适用于Model类型数据传参
@Controller
@SessionAttributes(names={"name"})
public class ServletController {
@RequestMapping("/setSessionData2")
public String setSessionDate2(Model model) {
model.addAttribute("name", "Jock2");
return "page.jsp";
}
}
注解式参数数据封装底层原理
- 数据的来源不同,对应的处理策略要进行区分
- Head
- Cookie
- Session
- SpringMVC使用策略模式进行处理分发
- 顶层接口: HandlerMethodArgumentResolver
- 实现类: ……