页面跳转
- 转发(默认)
@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对valuemodelAndView.addObject("book",book);//添加数据的方式,key对valuemodelAndView.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
- 实现类: ……