1、页面跳转
-
转发(默认)url不会变,参数也不会丢失,一个请求
@RequestMapping("/showPage1") public String showPage1() { System.out.println("user mvc controller is running ..."); return "forward:page.jsp"; }
-
重定向 url会变,参数会丢失需要重新携带参数,两个请求
@RequestMapping("/handleRedirect") public String handleRedirect(String name,RedirectAttributes redirectAttributes) { //return "redirect:handle01?name=" + name; // 拼接参数安全性、参数长度都有局限 // addFlashAttribute方法设置了一个flash类型属性,该属性会被暂存到session中,在跳转到页面之后该属性销毁 redirectAttributes.addFlashAttribute("name",name); return "redirect:handle01"; } // 重定向页面 @RequestMapping("/handle01") public ModelAndView handle01(@ModelAttribute("name") String name) { // @ModelAttribute该注解可以获取重定向页面中携带的数据 System.out.println("name") }
注意:页面访问地址中所携带的 /
2、页面访问快捷设定 (InternalResourceViewResolver)
展示页面的保存位置通常固定,且结构相似,可以设定通用的访问路径,简化页面配置格式
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/pages/"/>
<property name="suffix" value=".jsp"/>
/bean>
public String showPage3() {
return "page";
}
如果未设定了返回值,使用void类型,则默认使用访问路径作页面地址的前缀后缀
//最简页面配置方式,使用访问路径作为页面名称,省略返回值
@RequestMapping("/showPage5")
public void showPage5() {
System.out.println("user mvc controller is running ...");
}
3、带数据页面跳转
方式一:使用HttpServletRequest类型形参进行数据传递
@RequestMapping("/showPageAndData1")
public String showPageAndData1(HttpServletRequest request) {
request.setAttribute("name","itheima");
return "page";
}
方式二:使用Model类型形参进行数据传递
@RequestMapping("/showPageAndData2")
public String showPageAndData2(Model model) {
model.addAttribute("name","itheima");
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(); 替换形参中的参数
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;
}
方案四:直接声明形参ModelMap,封装数据
@RequestMapping("/handle11")
public String handle11(ModelMap modelMap) {
Date date = new Date();// 服务器时间
modelMap.addAttribute("date",date);
System.out.println("=================modelmap:" + modelMap.getClass());
// modelmap:class org.springframework.validation.support.BindingAwareModelMap
return "success";
}
方案五:直接声明形参Map集合,封装数据
@RequestMapping("/handle13")
public String handle13(Map<String,Object> map) {
Date date = new Date();
map.put("date",date);
System.out.println("=================map:" + map.getClass());
// map:class org.springframework.validation.support.BindingAwareModelMap
return "success";
}
注意:SpringMVC在handler方法上传入Map、Model和ModelMap参数,并向这些参数中保存数据(放入到请求域),都可以在页面获取到
它们之间是什么关系?
运行时的具体类型都是BindingAwareModelMap,相当于给BindingAwareModelMap中保存的数据都会放在请求域中。
Map(jdk中的接口) Model(spring的接口) ModelMap(class,实现Map接口)
BindingAwareModelMap继承了ExtendedModelMap,ExtendedModelMap继承了ModelMap,实现了Model接口
4、返回数据
方式一:使用response对象完成数据返回
//使用原生response对象响应数据
@RequestMapping("/showData1")
public void showData1(HttpServletResponse response) throws IOException {
response.getWriter().write("message");
}
方式二:(简化格式)
//使用@ResponseBody将返回的结果作为响应内容,而非响应的页面名称
@RequestMapping("/showData2")
@ResponseBody
public String showData2(){
return "message";
}
5、返回JSON数据(需要导入Jackson包才能实现JSON装换)
方式一:基于response返回数据的简化格式,返回JSON数据
//使用jackson进行json数据格式转化
@RequestMapping("/showData3")
@ResponseBody
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/>
注解驱动格式:
@configuration
@ComponentScan("com.itheima")
@EnableWebMvc // 此注解就是实现SpringMvc中的转换器功能
public class SpringMvcConfiguration {
}