@RequestMapping
这个的作用是上面呢?????
作用就是设定访问路由,我们可以更具指定的访问路由访问我们制定的方法(Servlet) ,就相当于原生Servlet和前端相连的部分一样
~~
~~
~~
~~
~~
~~
多个路径匹配
意思就是我们的z注解@RequestMapping她不止能匹配一个路径还能匹配很多的路径,就是可以通过很多种匹配路径和来访问这个方法这个Servlet 写在方法上面的。
多个路径匹配格式:中间用逗号隔开
@RequestMapping(path = {"/test10","/test11"})
~~
~~
~~
~~
~~
~~
窄化路径
如果说我们呢所有的@RequestMapping都需要写全部的路由是不是就显得太麻烦了
如果我们有没有一种方法把相同的提取出来,那么我们就不用i写全部的路由,找到指定的路径
这时候我们就需要使用-----窄化路径方法----用到注解 @RequestMapping 不过这个注解是写在类上面的
写在类上面的@RequestMapping 就有窄化路径作用
窄化路径代码
@Controller
@RequestMapping("/role") // 窄化路径,写在Controller控制类上面
public class RoleController { // 一个pojo就是一个模块
写了之后我们后面方法上用到的@RequestMapping中的路由就能省略掉,因为把查询范围降低了
~~
~~
~~
~~
~~
~~
限定请求方法
我们知道表单提交过来的数据到Servlety里面都有两种方法来限接收
那么我们不使用Servlet的时候我们要如何来指定接受的方法呢???
我们这里使用到的方法就是method属性 ,类型是RequestMethod
一般来说都是使用GET或者POST其中之一的方法
这个是直接写在了我们写在方法上面的@RequestMapping里面的
限定此方法是使用的什么请求方法
// 测试 POST方法
@RequestMapping(path = "/testArrays.action",method = RequestMethod.POST)
public ModelAndView testArrays2(String[] hobby) {
// 测试 GET方法
@RequestMapping(path = "/testArrays.action",method = RequestMethod.GET)
public ModelAndView testArrays(String[] hobby) {
~~
~~
~~
~~
~~
~~
Controller方法返回值
在SperingMVC中我们经常会使用到的三个返回值
- ModelAndView
- void空返回值
- String字符串返回值
ModelAndView
返回数据和视图,内部封装数据的实现原理其实就是保存在了request域对象之中,可以使用addObject()来传输数据,使用setViewName()方法来指定视图的地址
// 构建获取所有的角色信息的服务
@RequestMapping("/role/listRoles.action")
public ModelAndView getAllRoles() {
// 先构建ModelAndView 模型视图组件
ModelAndView mav = new ModelAndView();
// 获取service层中的结果值
List<Role> roles = roleService.getAllRoles();
// 把roles数据存进model模型组件中,并设定一个名字便于调用
mav.addObject("list", roles);
// 指定视图地址,我们数据要传到哪一个视图里面去
mav.setViewName("/role/roleList");
return mav;
}
void空返回值
如果我们的返回值是void,也就是说不需要指定视图的地址,无序跳转页面
虽然可以使用原生的方式HttpServletRequest (内部转发) HttpServletResponse(重定向)实现页面的跳转,
但是那样就没有用到SpringMVC所以一般来说是不建议使用原生的方式的.
void空返回值主要是用于Ajax,因为Ajax只需要返回数据不需要指定视图
response.getWriter(data) ----->ajax success:function(data) dataType:"json"
resp.setContentType("application/json;charset=UTF-8")
String字符串
如果方法返回值设定为String字符串类型,他主要的目的就是指定试图地址,就好像MavAndView返回值中得setViewName()方法来指定视图的地址.可以搭配水土解析器来使用(添加前后缀的),
代码演示
// String 字符串返回值 同时使用Model组件
@RequestMapping("/testStrView.action")
public String toView(Model model) {
System.out.println("我加载进来了。。。。。。");
List<Role> roles = roleService.getAllRoles();
// 数据怎么传输 ModelAndView ×
model.addAttribute("list", roles);
return "/role/roleList";//这个就是返回的值,目的指定视图地址页面
}
~~
~~
~~
~~
~~
~~
原生的内部转发和原生的重定向
返回值是String的注意事项
- 如果直接使用字符串,那么会被直接解析成视图,会自动添加视图解析器中的前后缀,跳转方式采用的是内部转发
- 如果字符串前面有前缀,forward开头的,那么将不再加载试图解析器了,不再添加前后缀,跳转方式采用的内部转发,需要手动添加页面资源的路径
- 如果字符串的前缀为redirect,那么将不再加载试图解析器了,不再添加前后缀,跳转的方式采用的是重定向,此时不用添加虚拟目录
- 对于前缀为forward的字符串,可以 传输model中的数据,对于前缀为redirect,不可以传输model中的数据。
/**
* 测试 SpringMV内置的前缀
* public static final String REDIRECT_URL_PREFIX = "redirect:";
* public static final String FORWARD_URL_PREFIX = "forward:";
*/
@RequestMapping("/toAdminAndModel.action")
public String toAdminAndModel(Model model) {
List<Role> allRoles = roleServicel.getAllRoles();
// 使用重定向 无法传输放进model中的数据 本质使用的是request对象
model.addAttribute("message", "我是通过重定向方式访问该页面");
return "redirect:/admin.jsp";
}
@RequestMapping("/toAddDepartmentView.action")
public String toAddDepartmentView(Model model) {
// 视图地址:/WEB-INF/view/department/addDepartment.jsp
//return "forward:/WEB-INF/view/department/addDepartment.jsp";
//return "redirect:/WEB-INF/view/department/addDepartment.jsp";
model.addAttribute("message", "我是通过内部转发方式访问该页面");
/**
* 使用forward前缀 可以访问到WEB—INF下面的资源
* 使用redirect前缀 不可以访问到WEB—INF下面的资源
*/
return "forward:/WEB-INF/view/department/addDepartment.jsp";
}
// 内部转发是基于你的应用 虚拟目录是不需要添加的
// 重定向是基于服务器的 虚拟目录是需要添加的 request.getContextPath();
// 服务器中部署的应用是有虚拟目录的 名字为:/day71_SpringMVC
@RequestMapping("/toAdmin2.action")
public String toAdminView2(Model model) {
// 此时我们想要跳转到admin.jsp页面中
/**
* 使用redirect前缀:无需添加虚拟目录
*/
return "redirect:/admin.jsp";
}
@RequestMapping("/toAdmin.action")
public String toAdminView(Model model) {
// 此时我们想要跳转到admin.jsp页面中
// 试图解析器此时不加载的
return "forward:/admin.jsp";
}