控制器Controller
-
控制器复杂提供访问应用程序的行为,通常通过接口定义或注解定义两种方式
-
控制器负责解析客户的请求 并转换成一个模型
-
在springMVC中,一个控制器类可以包含多种方法
-
在springMVC中,对于controller的配置有多种
实现Controller接口
Controller是一个接口,在org.springframework.web.servlet.mvc包下
java
@FunctionalInterface//函数式接口
//实现该接口的类获得控制器功能
public interface Controller {
@Nullable//值可以为空
ModelAndView handleRequest(HttpServletRequest var1, HttpServletResponse var2) throws Exception;//处理请求并返回一个MOdelAndView对象
}
测试1
1.新建一个模块,web.xml与springmvc-servlet.xml中的代码不变
2.编写一个Controller类,ControllerDemo01
java
//只要实现了该接口的类,说明这就是一个控制器
public class ControllerDemo01 implements Controller {
@Override
public ModelAndView handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception {
ModelAndView mv = new ModelAndView();
//业务代码
mv.addObject("msg","ControllerDemo01");
//视图跳转
mv.setViewName("test");
return mv;
}
}
3.编写完毕后,去spring配置文件中注册请求的bean;name代表请求路径,class代表对应请求的类
XML
<bean name="/test" class="com.lyc.controller.ControllerDemo01"/>
4.编写前端页面,对应视图解析器
XML
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
${msg}
</body>
</html>
配置tomcat运行测试

小结:
-
实现接口定义控制器有些过时了
-
缺点:一个控制器里只有一个方法,如果多个方法则需要定义多个Controller;定义的方法比较麻烦
测试2
使用注解@Controller
-
@Controller注解类型用于声明spring类的实例是一个控制器(在spring笔记中还有另外三个注解,@Component,@Service,@Repository);
-
spring可以通过扫描机制来找到应用程序中所有基于注解的控制类,为了保证spring能找到控制器,需要在配置文件中声明组件扫描
XML
<!-- 自动扫描指定的包-->
<context:component-scan base-package="com.lyc.controller"/>
- 增加一个ControllerDemo02类,使用注解实现
java
package com.lyc.controller;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
//代表这个类被spring接管
//被解析的这个类中的所有的方法,如果返回值是string,并且有具体的页面可以跳转,就会被视图解析器解析
@RequestMapping("/demo2")
public class ControllerDemo02 {
@RequestMapping("/test2")
public String demo01(Model model){
model.addAttribute("msg","ControllerDemo02");
return "test";
}

小结:从这里两次测试可以发现,我们的两个请求是可以指向一个视图的,但是页面显示的结果是不同的,表明这里的视图是被复用 了,而控制器与视图之间是弱耦合关系
RequsetMapping说明
RequestMapping
-
@RequestMapping 注解用于映射URL到控制器类 或一个特定的处理程序方法 ,可用于类或方法上,用于类上,表示类中的所有响应请求的方法都是以该地址作为父地址 如果要访问类中的方法,需要在网页中加上**/父地址/方法地址**
测试:
javaConreollerDemo3 package com.lyc.controller; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.RequestMapping; @Controller @RequestMapping("/demo3") public class ControllerDemo3 { @RequestMapping("/test3") public String test(Model model){ model.addAttribute("msg","ControllerDemo3"); return "test"; } }
