前言:
小伙伴们,大家好,我是狂奔の蜗牛rz,当然你们可以叫我蜗牛君,我是一个学习Java半年多时间的小菜鸟,同时还有一个伟大的梦想,那就是有朝一日,成为一个优秀的Java架构师。
这个SpringMVC基础学习系列是用来记录我学习SpringMVC框架基础知识的全过程 (这个系列是参照B站狂神的SpringMVC最新教程来写的,由于是之前整理的,但当时没有发布出来,所以有些地方可能有错误,希望大家能够及时指正!)
之后我将尽量以两天一更的速度更新这个系列,还没有学习SpringMVC框架的小伙伴可以参照我的博客学习一下;当然学习过的小伙伴,也可以顺便跟我一起复习一下基础。最后,希望能够和大家一同进步吧,加油吧,编程人!
特别提醒:如果对SpringMVC基础学习系列感兴趣,可以阅读本系列往期博客:
第一篇:SpringMVC基础学习之简单回顾MVC架构和Servlet的使用
第二篇:SpringMVC基础学习之初识SpringMVC
第三篇:SpringMVC基础学习之初识
第三篇:SpringMVC基础学习之使用注解开发
5.Controller的两种实现方式和RequstMapping注解的使用 5.1 什么是Controller?今天我们来到了SpringMVC基础学习的第五站:Controller的两种实现方式和RequstMapping注解的使用 。废话不多说,让我们开始今天的学习内容吧。
- Controller (即控制器) ,它主要负责提供访问应用程序的行为和解析用户的请求,并将其转换为一个模型,通常通过接口定义或注解定义这两种方式来实现
- 在Spring MVC中一个控制器类可以包含多个方法,并且对于 Controller的配置方式 包含多种,包括接口定义和注解定义
- Controller是一个接口,在org.springframework.web.servlet.mvc包下,为了进一步了解它,我们可以查看其源代码:
// 实现该接口的类获得控制器功能
public interface Controller {
// 处理请求并返回一个模型与视图对象
ModelAndView handleRequest(HttpServletRequest var1, HttpServletResponse var2) throws Exception;
}
5.1.2 创建HelloController类查看Controller接口的源码后,发现该接口中只有一个方法,即handleRequest方法,用来处理请求并返回一个ModelAndView(模型和视图)对象
- 在src源文件下的java目录中创建一个com.kuang.controller包,创建HelloController类并且实现Controller接口
package com.kuang.controller;
import org.springframework.web.servlet.ModelAndView;
// 注意: 该Controller接口是servlet.mvc包下
import org.springframework.web.servlet.mvc.Controller;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
// 只要实现了Controller接口的类,说明这就是一个控制器了
public class HelloController implements Controller {
public ModelAndView handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception {
// 获取ModelAndView(模型视图)对象
ModelAndView mv = new ModelAndView();
// 封装数据到ModelAndView对象中
mv.addObject("msg","Hello,Controller!");
// 设置跳转视图, 存入到ModelAndView对象中
mv.setViewName("hello");
// 返回视图模型对象给视图解析器
return mv;
}
}
5.1.3 编写核心配置文件
1.编写web.xml配置文件
5.1.3 编写核心配置文件 1.编写web.xml配置文件springmvc org.springframework.web.servlet.DispatcherServlet contextConfigLocation classpath:springmvc-servlet.xml 1 springmvc // 封装数据:向模型中添加属性msg与其值,可以在JSP页面取出并且渲染 model.addAttribute("msg","Hello,Controller!"); // 会被视图解析器处理,注意:这里的hello对应的是JSP页面的名字 return "hello"; } // 使用@RequestMapping注解, 设置请求映射, 其作用域是类或者方法 @RequestMapping("/h2") public String hello2(Model model) { // 封装数据: 向模型中添加属性msg与其值,可以在JSP页面取出并且渲染 model.addAttribute("msg","Hello,World!"); // 会被视图解析器处理(注意: 这里的hello对应的是JSP页面的名字) return "hello"; } }
1-2 修改路径后springmvc org.springframework.web.servlet.DispatcherServlet contextConfigLocation classpath:springmvc-servlet2.xml 1 springmvc // 封装数据: 向模型中添加属性msg与其值,进行视图渲染 model.addAttribute("msg","Hello,RequestMapping!"); // 返回视图逻辑名,让视图解析器进行解析(注意:这里的hello是要跳转的视图逻辑名) return "hello"; } }
- 将hello.jsp的存放路径修改为WEB-INF/jsp/user/hello.jsp,即在jsp文件下创建一个user,将hello.jsp放入其中
package com.kuang.controller;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
// 使用@Controller注解, 将该类注册为Controller接口, 交由Spring的IOC容器统一管理
@Controller
public class HelloController3 {
@RequestMapping("/user/hello3")
public String hello3(Model model) {
// 封装数据: 向模型中添加属性msg与其值,进行视图渲染
model.addAttribute("msg","Hello,User!");
// 返回视图逻辑名,让视图解析器进行解析 (注意: 由于路径发生了改变,因此要跳转的视图逻辑名也要相应变化)
return "hello/user";
}
}
2.测试结果 2-1 使用正常路径建议这样使用@RequestMapping注解,即在方法前的映射请求中设置全路径
结果:成功查询到了hello2页面,并且显示“Hello,RequestMapping!”信息
2-2 修改路径后结果:成功查询到了user/hello3页面,并且显示“Hello,User”信息!
5.4.2 在类和方法上同时使用 1.修改HelloController3控制类- hello.jsp的存放路径仍然为WEB-INF/jsp/user/hello.jsp
package com.kuang.controller;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
// 使用@Controller注解, 将该类注册为Controller接口, 交由Spring的IOC容器统一管理
@Controller
// 在控制类上使用@RequestMapping: 相当于在URL链接上再加一个父目录进行区分
@RequestMapping("/user") // 先访问类上的/user
public class HelloController3 {
// 真实访问路径变为了:http://localhost:8080/项目名称/user/hello2
@RequestMapping("/hello2") //再访问/hello2
public String hello2(Model model) {
// 封装数据:向模型中添加属性msg与值,进行视图渲染
model.addAttribute("msg","Hello,RequestMapping2!");
// 返回视图逻辑名,让视图解析器进行解析 (注意: 由于路径发生了改变,因此要跳转的视图逻辑名也要相应变化)
return "user/hello";
}
}
2.测试结果
结果:成功查询到了user/hello2页面,并且显示“Hello,RequestMapping2!”信息
5.4.3 使用总结- 只在方法上使用@RequestMapping注解,代码编写更加简便,只用在每个方法前设置映射关系,而且方法中的页面的路径选择更加宽泛
- 在类和方法上同时使用@RequestMapping注解,逻辑更加清晰,但页面的调用范围也受到了限制,即只能调用在类上的映射关系中设置的父目录下的页面
好了,今天的有关 Controller的两种实现方式和RequstMapping注解的使用 的学习就到此结束啦。欢迎小伙伴们积极学习和讨论,喜欢的可以给蜗牛君点个关注,顺便来个一键三连。我们下期见,拜拜啦!
参考视频链接:【狂神说Java】SpringMVC最新教程IDEA版通俗易懂



