1.控制器Controller
- 控制器负责提供访问应用程序的行为,通常通过接口定义或注解定义两种方法实现
- 控制器负责解析用户的请求并将其转换为一个模型
- 在Spring MVC中一个控制器类可以包含多个方法
- 在Spring MVC中,对于Controller的配置方式有很多种
2.代码实现
- 创建新项目:SpringMVC-04-Controller
- pom.xml
<build> <resources> <resource> <directory>src/main/resources</directory> <includes> <include>**/*.properties</include> <include>**/*.xml</include> </includes> <filtering>true</filtering> </resource> <resource> <directory>src/main/java</directory> <includes> <include>**/*.properties</include> <include>**/*.xml</include> </includes> <filtering>true</filtering> </resource> </resources> </build>
- 配置web.xml
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" version="4.0"> <servlet> <servlet-name>srpingmvc</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><!--这个servlet就是spring直接写好了的,我们直接使用即可--> <!--DispatcherServlet必须绑定spring配置文件--> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:springmvc-servlet.xml</param-value> </init-param> <!--启动级别--> <load-on-startup>1</load-on-startup><!--设置启动级别为1,即服务器一启动就会去加载DispatcherServlet--> </servlet> <servlet-mapping> <servlet-name>srpingmvc</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> </web-app>
- 配置spring配置文件
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:mvc="http://www.springframework.org/schema/mvc" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd"> <!-- 自动扫描包,让指定包下的注解生效,由IOC容器统一管理 --> <context:component-scan base-package="com.thhh.controller"/> <!-- 让Spring MVC不处理静态资源,像.css\.js\.html\.mp3\.mp4这些不需要动态处理的资源,我们完全没有必要走Spring MVC动态处理这一条线 --> <mvc:default-servlet-handler /> <mvc:annotation-driven /><!--使用这个配置,将会自动为我们向IOC容器中注入HandlerMapping和HandlerAdapter两个对象,不再需要我们自己去配置--> <!-- 视图解析器 --> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="internalResourceViewResolver"> <property name="prefix" value="/WEB-INF/jsp/" /> <property name="suffix" value=".jsp" /> </bean> </beans>
- 创建spring包扫描对应的包结构,这里就是创建controller存储的包结构
- 创建视图跳转文件夹,主要还是配置spring配置文件中视图解析器的配置,防止在测试的时候不能跳转到对应的视图上
- 创建controller文件
方式1 实现controller接口
package com.thhh.controller;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
//Controller接口作用:实现了Controller接口的类就是一个控制器了,是控制器就可以被springMVC中的dispatcherservlet调用处理请求了
public class HelloController implements Controller{
//方法的作用:处理请求并且返回一个模型和视图对象
@Override
public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
ModelAndView mv = new ModelAndView();
//业务逻辑
mv.addObject("msg","调用model层返回的数据");
//设置视图名称
mv.setViewName("hello");
return mv;
}
}
去spring容器中装配这个controller
<bean id="/hello" class="com.thhh.controller.HelloController"/>
启动tomcat测试
针对上面这种实现接口的方法,对于spring的配置,我们甚至可以只留下视图配置和注册的bean,通过测试可以和上面达到相同的效果
实现接口Controller定义控制器是较老的办法
缺点:一个控制器中只有一个方法,如果要多个方法则需要定义多个Controller;定义的方式比较麻烦;
- 创建controller文件
方式2 使用注解
- @Controller
component本意就是组件的意思,所以我们是将controller作为了spring容器的一个组件,所以容器可以自动为它注入
注意:在使用注解开发的时候,我们必须显式的开启spring对于注解的支持<!-- 使用注解自动装配bean的时候必须显式的开启spring对象注解装配的支持,开启方式就是下面这句话 --> <context:component-scan base-package="com.thhh.controller"/>
2.@RequestMapping(“映射地址”)
@RequestMapping注解用于映射url到控制器类或一个特定的处理程序方法,可用于类或方法上
用于类上,表示类中的所有响应请求的方法都是以该地址作为父路径
【类上使用注解@RequestMapping】对于类上的命名,提示我们对于一个对象的操作我们就可以在类上面专门为它写一个@RequestMapping(),比如系统中有管理员和普通用户两种角色,那么区分这两个角色处理最简单的办法就是在各自的controller类上加上一个注解,这样它们内部的方法的@RequestMapping()就可以重名
【类上使用注解@RequestMapping】但是当我们的项目里方法很多的时候,还是建议直接将区分的前缀路径加载方法上,原因就是方法多了,我们很容易忽略类上的注解,导致在访问的时候,总是404,直接写在方法上,我们想测试哪个方法直接按照它的注解的值访问即可
【方法上使用注解@RequestMapping】我们可以再定义一个方法test02(),同样指定跳转hello.jsp,但是传输的数据不一样
【方法上使用注解@RequestMapping】我们很快就能发现,这两个方法传递的数据是不一样的,但是指定跳转的视图是一样的,只要我们请求的url变化,页面上显示的数据就会变化,这提醒我们,我们可以复用这个jsp页面,我们只需要给这个页面搭上框架,具体展示的数据在dispatcherServlet返回视图的时候已经渲染好了,所以我们就可以拿到我们想要的页面
【方法上使用注解@RequestMapping】可以发现,我们的两个请求都可以指向一个视图(hello),但是页面结果的结果是不一样的,从这里可以看出视图是被复用的,而控制器与视图之间是弱偶合关系
注解方式是平时使用的最多的方式!