【4】控制器Controller

4、控制器Controller

4.1、控制器Controller

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

4.2、实现Controller接口

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

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

测试

  1. 新建一个Moudle,springmvc-04-controller 。将刚才的03 拷贝一份, 我们进行操作!

    • 删掉HelloController
    • mvc的配置文件只留下 视图解析器!
    <!--视图解析器:模板引擎 Thymeleaf Freemarker-->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="internalResourceViewResolver">
        <!--前缀-->
        <property name="prefix" value="/WEB-INF/jsp/"/>
        <!--后缀-->
        <property name="suffix" value=".jsp"/>
    </bean>
    
  2. 编写一个Controller类,ControllerTest

    public class ControllerTest implements Controller {
          
          
        @Override
        public ModelAndView handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception {
          
          
    
            ModelAndView mv = new ModelAndView();
    
            mv.addObject("msg","Controller测试");
    
            /*跳转页面的名字,在ViewResolver中拼接成字符串视图页面名称*/
            mv.setViewName("controller1");
            return mv;
        }
    }
    
  3. 编写完毕后,去Spring配置文件中注册请求的bean;name对应请求路径,class对应处理请求的类

    <!--BeanNameUrlHandlerMapping将实现类注册成bean,bean的id就是url-pattern-->
    <bean id="/c1" class="com.kuber.controller.ControllerTest"/>
    
  4. 编写前端controller1.jsp,注意在WEB-INF/jsp目录下编写,对应我们的视图解析器

    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
    <head>
        <title>controller1</title>
    </head>
    <body>
        ${msg}
    </body>
    </html>
    
  5. 配置Tomcat运行测试,我这里没有项目发布名配置的就是一个 / ,所以请求不用加项目名,OK!

    在这里插入图片描述

说明:

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

4.3、使用注解@Controller

  • @Controller注解类型用于声明Spring类的实例是一个控制器(在讲IOC时还提到了另外3个注解);

  • Spring可以使用扫描机制来找到应用程序中所有基于注解的控制器类,为了保证Spring能找到你的控制器,需要在配置文件中声明组件扫描。此时不再需要注册bean标签

        <context:component-scan base-package="com.kuber.controller"/>
        <mvc:default-servlet-handler/>
        <mvc:annotation-driven/>
        <!--视图解析器:模板引擎 Thymeleaf Freemarker-->
        <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="internalResourceViewResolver">
            <!--前缀-->
            <property name="prefix" value="/WEB-INF/jsp/"/>
            <!--后缀-->
            <property name="suffix" value=".jsp"/>
        </bean>
    
  • 增加一个ControllerTest2类,使用注解实现;

    @Controller/*代表这个类会被spring接管,
                   标有这个注解的类的所有方法如果其返回值为string,
                   并且返回值为相应的跳转界面的名称,那么就会被视图解析器解析*/
    public class ControllerTest2 {
          
          
    
        @RequestMapping("c2")
        public String test1(Model model){
          
          
            //Spring MVC会自动实例化一个Model对象用于向视图中传值
            model.addAttribute("msg","Controller测试2");
    		//返回视图位置
            return "controller1";
        }
    }
    
  • 运行tomcat测试

    在这里插入图片描述

可以发现,我们的两个请求都可以指向一个视图,但是页面结果的结果是不一样的,从这里可以看出视图是被复用的,而控制器与视图之间是弱偶合关系。

注解方式是平时使用的最多的方式!

4.4、RequestMapping

@RequestMapping

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

  • 为了测试结论更加准确,我们可以加上一个项目名测试 myweb

  • 只注解在方法上面

    @Controller
    public class TestController {
          
          
       @RequestMapping("/h1")
       public String test(){
          
          
           return "test";
      }
    }
    

    访问路径:http://localhost:8080 / 项目名 / h1

  • 同时注解类与方法

    @Controller
    @RequestMapping("/admin")
    public class TestController {
          
          
       @RequestMapping("/h1")
       public String test(){
          
          
           return "test";
      }
    }
    

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

猜你喜欢

转载自blog.csdn.net/weixin_43215322/article/details/111242999