package com.dfbz.controller;import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;@Controller
@RequestMapping("/demo") // 为此Controller命名一个请求路径,以后访问此Controller下的任意方法都需要加上/demo
public class DemoController {@RequestMapping("/demo01") // 后台请求可以不写.frompublic String demo01(){return "hello";}
}
访问:http://localhost:8080/demo/demo01.form
客户端请求的URL未发生改变,请求却转到了/demo/hello
,说明服务器内部发生跳转;
也就是说,在返回字符串的情况下,SpringMVC默认当做视图进行跳转;
通常来说,我们的视图(页面)都是放在某个文件夹进行管理的,并且后缀通常都是固定的,要么是.html或者是.jsp再或者是其他的;因此我们希望可以固定好前缀(存放页面的文件夹名称)和后缀(文件名的后缀)
使得我们的代码改为:
/*** 指定进行视图跳转** @return*/
@RequestMapping("/demo02")
public String demo02() {return "index02"; // 自动跳转到 /WEB-INF/views/index02.jsp
}
很显然,我们现在肯定是做不到的;
我们在前面查看SpringMVC源码时,发现SpringMVC默认使用的是InternalResourceViewResolver
来进行视图页面的解析;这个类中提供了视图的前缀和后缀的配置;
在dispatcher-servlet.xml中配置InternalResourceViewResolver
:
访问:http://localhost:8080/demo/demo02.form
ModelAndView:翻译过来就是模型和视图的意思,该对象保存了我们我们填充的数据(在request域中)和要跳转的视图地址;
通过ModelAndView设置的视图,SpringMVC默认将其跳转到这个视图,并且该视图会经过视图解析的前后缀处理;
/*** 指定进行视图跳转** @return*/
@RequestMapping("/demo03")
public ModelAndView demo03() {ModelAndView mv=new ModelAndView();// 跳转到/WEB-INF/views/index03.jspmv.setViewName("index03"); mv.addObject("msg","index03~~");return mv;
}
创建:/WEB-INF/views/index03.jsp
RedirectView是一种特殊的视图,SpringMVC会将其重定向到这个视图,并且RedirectView允许携带重定向参数;
/*** 使用RedirectView视图进行重定向** @return*/
@RequestMapping("/hello")
public ModelAndView hello() {RedirectView redirectView = new RedirectView();// RedirectView不会参与视图解析器的前后缀处理redirectView.setUrl("/hello.jsp");redirectView.addStaticAttribute("name","xiaohui");redirectView.addStaticAttribute("age",20);return new ModelAndView(redirectView);
}
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
Title
name: ${param.name}
age: ${param.age}
Tips:params是jsp的内置参数,用于获取请求该JSP所携带的参数;
访问:http://localhost:8080/demo/hello.form
我们前面的测试中,在返回普通字符串时SpringMVC默认是将其作为视图进行跳转,并且可以收视图解析器的前缀/后缀所控制,那么如果我们配置了前缀/后缀同时某个跳转不需要加上前缀后缀呢?
在SpringMVC提供了两个特殊字符串前缀:
forwrad:
进行页面的跳转,该跳转不经过前缀和后缀处理redirect:
进行页面的重定向,该重定向不经过前缀和后缀处理/*** 返回特殊字符串:forward-->转发(不会经过视图解析器)* @return*/
@RequestMapping("/demo04")
public String demo04() {return "forward:/index04.jsp"; // 转发到http://localhost:8080/index04.jsp
}/*** 返回特殊字符串:redirect(不会经过视图解析器)* @return*/
@RequestMapping("/demo05")
public String demo05() {return "redirect:/index05.jsp"; // 重定向到http://localhost:8080/index05.jsp
}
访问:http://localhost:8080/demo/demo04.form
访问:http://localhost:8080/demo/demo05.form
我们知道,SpringMVC把方法的返回值当做视图进行跳转,如果返回void代表的就是不需要提供视图,一般用于ajax请求,只需要响应数据,不需要返回视图
/*** 返回void(用于ajax请求,不需要提供页面,只需要响应数据即可)** @param response* @throws IOException*/
@RequestMapping("/demo06")
public void demo06(HttpServletResponse response) throws IOException { // 接收request和response// 写出数据给前端response.getWriter().write("hello springmvc!");
}
Tips:只要是Controller中的方法,都可以自动绑定request、response、session这些servlet的原生api;
访问:http://localhost:8080/demo/demo06.form