目录
概述
传统风格的控制器不仅需要在配置文件中部署映射,而且只能编写一个处理方法,不够灵活。
使用基于注解的控制器具有以下两个优点:
- (1)在基于注解的控制器类中可以编写多个处理方法,进而可以处理多个请求(动作),这就允许将相关的操作编写在同一个控制器类中,从而减少控制器类的数量,方便以后的维护。
- (2)基于注解的控制器不需要在配置文件中映射,仅需要使用RequestMapping注释类型注解一个方法进行请求处理。
在Spring MVC中最重要的两个注解类型是Controller和RequestMapping。
Controller注解类型
在Springmvc中使用Controller注解类型声明某类的实例是一个控制器。
如:
import org.springframework.stereotype.Controller;
@Controller
public class IndexController {
}
在SpringMVC中使用扫描机制找到应用中所有基于注解的控制器类,所以,为了让控制器类被SpringMVC框架扫描到,需要在配置文件中声明spring-context,并使用<context:component-scan/>元素指定控制器类的基本包(请确保所有控制器类都在基本包及其子包下)。
如:
<?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"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
<!--使用扫描机制扫描控制器类,控制器类都在controller包及其子包下-->
<context:component-scan base-package="springmvcdemo.controller"/>
<!--配置视图解析器-->
<!--配置视图解析器成功后,RegisterController和LoginController控制器类的视图路径仅需提供register和login,视图解析器将会自动添加前缀和后缀-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="internalResourceViewResolver">
<!--前缀-->
<property name="prefix" value="/WEB-INF/jsp/"/>
<!--后缀-->
<property name="suffix" value=".jsp"/>
</bean>
</beans>
RequestMapping注解类型
在基于注解的控制器类中可以为每个请求编写对应的处理方法。那么如何将请求与处理方法一一对应呢?需要使用org.springfrlamework.web.bind.annotation.RequestMapping注解类型将请求与处理方法一一对应。
方法级别注解
package springmvcdemo.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
public class IndexController {
@RequestMapping(value = "/index/register")
public String register() {
return "register";
}
@RequestMapping(value = "/index/login")
public String login() {
return "login";
}
}
类级别注解
package springmvcdemo.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
@RequestMapping(value = "/index")
public class IndexController {
@RequestMapping(value = "/register")
public String register() {
return "register";
}
@RequestMapping(value = "/login")
public String login() {
return "login";
}
}
注解的value属性将请求URI映射到方法,value属性是RequestMapping注解的默认属性,如果只有一个value属性,则可以省略该属性。
然后就可以通过:http://localhost:8080/index/login访问login方法。
实例
创建springmvc项目并按下图创建文件夹及文件
其中各文件代码如下:
IndexController.java
package springmvcdemo.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
/**
* "@Controller"表示IndexController的实例是一个控制器,@Controller相当于@Controller("indexController") 或@Controller(value="indexController")
*/
@Controller
public class IndexController {
// 注解的value属性将请求URI映射到方法,value属性是RequestMapping注解的默认属性。
// 因此用户可以通过如URL访问register方法:http://localhost:8080/demo/register
@RequestMapping(value = "/index/register")
public String register() {
// register代表逻辑视图的名称,需要根据spring mvc配置文件中的internalResourceViewResolver视图解析器的前缀和后缀找到对应的物理视图
return "register";
}
@RequestMapping(value = "/index/login")
public String login() {
return "login";
}
}
springmvc-servlet.xml
<?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"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
<!--使用扫描机制扫描控制器类,控制器类都在controller包及其子包下-->
<context:component-scan base-package="springmvcdemo.controller"/>
<!--配置视图解析器-->
<!--配置视图解析器成功后,RegisterController和LoginController控制器类的视图路径仅需提供register和login,视图解析器将会自动添加前缀和后缀-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="internalResourceViewResolver">
<!--前缀-->
<property name="prefix" value="/WEB-INF/jsp/"/>
<!--后缀-->
<property name="suffix" value=".jsp"/>
</bean>
</beans>
login.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>登录</title>
</head>
<body>
<h1>该页面是登录页面!</h1>
</body>
</html>
register.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>注册</title>
</head>
<body>
<h1>该页面是注册页面!</h1>
</body>
</html>
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">
<!--部署DispatcherServlet-->
<servlet>
<servlet-name>dispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!--加载Spring MVC的配置文件,配置文件可以放在项目目录的任意位置,使用init-param元素加载配置文件-->
<init-param>
<param-name>contextConfigLocation</param-name>
<!--配置文件的位置-->
<param-value>/WEB-INF/config/springmvc-config/springmvc-servlet.xml</param-value>
</init-param>
<!--表示容器在启动时立即加载servlet-->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>dispatcher</servlet-name>
<!--处理所有URL-->
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
index.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>首页</title>
</head>
<body>
未注册的用户,请<a href="/index/register">注册</a>!<br>
已注册的用户,去<a href="/index/login">登录</a>!
</body>
</html>
运行效果如下:
点击【注册】
地址:http://localhost:8080/index/register
点击【登录】
地址:http://localhost:8080/index/login
如果对完整源码有兴趣。
可搜索微信公众号【Java实例程序】或者扫描下方二维码关注公众号获取更多。
注意:在公众号后台回复【CSDN201911141456】可获取本节源码。