控制器Controller解释

  • 控制器复杂提供访问应用程序的行为,通常通过接口定义或注解定义两种方法实现。
  • 控制器负责解析用户的请求并将其转换为一个模型。
  • 在Spring MVC中一个控制器类可以包含多个方法
  • 在Spring MVC中,对于Controller的配置方式有很多种

我们来看看有哪些方式可以实现:

实现Controller接口

Controller是一个接口,在org.springframework.web.servlet.mvc包下,接口中只有一个方法;

@FunctionalInterface
//实现该接口的类获得控制器功能
public interface Controller {
    @Nullable
     //处理请求且返回一个模型与视图对象
    ModelAndView handleRequest(HttpServletRequest var1, HttpServletResponse var2) throws Exception;
}

编写一个Controller类,HelloController

public class HelloController implements Controller {
    @Override
    public ModelAndView handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception {

        ModelAndView mv = new ModelAndView();

        mv.addObject("msg","HelloMySpringMVC");

        mv.setViewName("myHello");

        return mv;
    }
}

注意点:
编写完毕后,去Spring配置文件中注册请求的bean;id对应请求路径,class对应处理请求的类

<bean id="/myHello" class="com.loey.controller.HelloController"/>

说明:
实现接口Controller定义控制器是较老的办法
缺点是:一个控制器中只能有一个方法,如果要多个方法则需要定义多个Controller;定义的方式比 较麻烦

使用注解@Controller

  • @Controller注解类型用于声明Spring类的实例是一个控制器(在讲IOC时还提到了另外3个注 解
    @Component
    @Controller:web层
    @Service:service层
    @Repository:dao层 );
    @Controller是一个注解
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component
public @interface Controller {

	/**
	 * The value may indicate a suggestion for a logical component name,
	 * to be turned into a Spring bean in case of an autodetected component.
	 * @return the suggested component name, if any (or empty String otherwise)
	 */
	@AliasFor(annotation = Component.class)
	String value() default "";

}
  • Spring可以使用扫描机制来找到应用程序中所有基于注解的控制器类,为了保证Spring能找到你的 控制器,需要在配置文件中声明组件扫描。
<!-- 自动扫描包,让指定包下的注解生效,由IOC容器统一管理 -->
    <context:component-scan base-package="com.loey.controller"/>

使用注解实现Controller

@Controller//代表这个类会被Spring接管
//被这个注解的类中的所有方法,如果返回值是String,并且有具体页面可以跳转,那么就会被视图解析器解析
@RequestMapping("/HelloControllerAnno")
public class HelloControllerAnno {

    //真实访问地址:项目名/HelloControllerAnno/helloAnno
    @RequestMapping("/helloAnno")
    public String sayHello(Model model){
        //向模型中添加属性msg与值,可以在JSP页面中取出渲染
        model.addAttribute("msg","Hello,SpringMVCAnno");

        //WEB-INF/jsp/hello.jsp
        return "hello";
    }
}

说明:
视图可以被复用的,而控制器与视图之间是弱偶合关系.即一个控制器中可以有多个方法,不需要定义多个Controller;

RequestMapping解释

@RequestMapping注解用于映射url到控制器类或一个特定的处理程序方法。可用于类或方法上。 用于类上,表示类中的所有响应请求的方法都是以该地址作为父路径。

只注解在方法上

@Controller//代表这个类会被Spring接管
//被这个注解的类中的所有方法,如果返回值是String,并且有具体页面可以跳转,那么就会被视图解析器解析
public class HelloControllerAnno {

    //真实访问地址:项目名/HelloControllerAnno/helloAnno
    @RequestMapping("/helloAnno")
    public String sayHello(Model model){
        //向模型中添加属性msg与值,可以在JSP页面中取出渲染
        model.addAttribute("msg","Hello,SpringMVCAnno");

        //WEB-INF/jsp/hello.jsp
        return "hello";
    }
}

访问路径:http://localhost:8080 / 项目名 / helloAnno
同时注解类与方法

@Controller//代表这个类会被Spring接管
//被这个注解的类中的所有方法,如果返回值是String,并且有具体页面可以跳转,那么就会被视图解析器解析
@RequestMapping("/HelloControllerAnno")
public class HelloControllerAnno {

    //真实访问地址:项目名/HelloControllerAnno/helloAnno
    @RequestMapping("/helloAnno")
    public String sayHello(Model model){
        //向模型中添加属性msg与值,可以在JSP页面中取出渲染
        model.addAttribute("msg","Hello,SpringMVCAnno");

        //WEB-INF/jsp/hello.jsp
        return "hello";
    }
}

访问路径:http://localhost:8080 / 项目名/ HelloControllerAnno /helloAnno , 需要先指定类的路径再指定方法的路径