spring MVC的核心类和注解
1.@DispatcherServlet注解
作用:
是Spring MVC的核心类、流程控制中心,又称为Spring MVC的前端控制器 可以拦截客户端的请求,之后根据具体规则将请求转发给其他组件处理 所有请求都要经过DispatcherServlet进行转发处理,以降低了Spring MVC组件之间的耦合性
总结:是一个前端控制器,浏览器发送的请求先经过DispatcherServlet后分发到controler中方法去执行的。
配置Spring MVC的前端控制器
<servlet>
<servlet-name>DispatcherServlet</servlet-name>
<servlet-class>
org.springframework.web.servlet.DispatcherServlet
</servlet-class>
<!-- 配置初始化参数,用于读取Spring MVC的配置文件 -->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring-mvc.xml</param-value>
</init-param>
<!-- 应用加载时创建--> <load-on-startup>1</load-on-startup>
</servlet>
<load-on-startup>元素取值分为三种情况:
(1)如果<load-on-startup>元素的值为正整数或者0,表示在项目启动时就加载并初始化这个Servlet,值越小,Servlet的优先级越高,就越先被加载;
(2)如果<load-on-startup>元素的值为负数或者没有设置,则Servlet会在被请求时加载和初始化;
(3)如果<load-on-startup>元素的值为1,表明DispatcherServlet会在项目启动时加载并初始化。
@Controller注解
作用:
使用传统的处理器类需要在Spring MVC配置文件中定义请求和Controller 的映射关系,比较繁琐,灵活性低 Spring MVC框架提供了@Controller注解。只需要将@Controller注解标注在普通Java类上,通过Spring的扫描机制找到标注了该注解的Java类,该Java类就会成为了Spring MVC的处理器类。
基于@Controller注解的处理器类示例代码
(1)创建处理器类PageController(放com.annotation.controller包)
package com.annotation.controller;
import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping;
@Controller public class PageController { @RequestMapping("/user/page01") public String toPage01(){ return "jsp/page01"; } }
(2)创建视图页面page01.jsp(放web/WEB-INF/jsp文件夹)
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html>
<head> <title>Title</title> </head>
<body> 这是page01... </body> </html> (3)修改配置文件spring-mvc.xml,注册处理器bean。此做作法:开启对com.annotation包内组件扫描
<!-- 开启com.annotation包内组件扫描 --> <context:component-scan base-package="com.annotation"/>
<!--配置视图解析器--> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/WEB-INF/"/> <property name="suffix" value=".jsp"/> </bean>
@RequestMapping注解
作用:
@RequestMapping注解用于建立请求URL和Handler(处理器)之间的映射关系,该注解可以标注在方法上和类上。
方式一—标注在方法上
当@RequestMapping注解标注在方法上时,该方法就成了一个可以处理客户端请求的Handler(处理器),它会在Spring MVC接收到对应的URL请求时被执行。Handler在浏览器中对应的访问地址,由项目访问路径+处理方法的映射路径共同组成。
方式二—标注在类上
当@RequestMapping注解标注在类上时,@RequestMapping的value属性值相当于本处理器类的命名空间,即访问该处理器类下的任意处理器都需要带上这个命名空间。@RequestMapping标注在类上时,其value属性值作为请求URL的第一级访问目录。当处理器类和处理器都使用@RequestMapping注解指定了对应的映射路径,处理器在浏览器中的访问地址,由项目访问路径+处理器类的映射路径+处理器的映射路径共同组成。
@RequestMapping注解标注在方法上
-
该方法就是可以处理客户端请求的Handler(处理器),在Spring MVC接收到对应的URL请求时被执行
-
Handler在浏览器中对应访问地址:项目访问路径+处理器的映射路径
-
package com.annotation.controller;
import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping;
@Controller public class PageController { @RequestMapping("/say") public void sayHello(){ System.out.println("say hello..."); } @RequestMapping("/user/login") public String toUser(){ System.out.println("显示用户登录界面..."); return "jsp/user/login"; } }
@RequestMapping注解标注在类上
value属性值相当于本处理器类的命名空间,即:访问该处理器类下任意处理器都需要带上这个命名空间
value属性值作为请求URL的第一级访问目录
-
@RequestMapping注解同时标注在类和类中的方法上时,处理器在浏览器中的访问地址:项目访问路径+处理器类的映射路径+处理器的映射路径
package com.annotation.controller;
import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping;
@Controller @RequestMapping("/cookie") public class PageController { @RequestMapping("/say") public void sayHello(){ System.out.println("say hello..."); } @RequestMapping("/user/login") public String toUser(){ System.out.println("显示用户登录界面..."); return "chap11annotation/login"; } }
@RequestMapping注解的属性
value String[] 可选属性,也是默认属性,用于指定请求的URL。 method RequestMethod[] 可选属性,用于指定该方法可以处理哪种类型的请求方式。 params String[] 可选属性,用于指定客户端请求中参数的值,必须包含哪些参数的值,才可以通过其标注的方法处理。 -
value属性的两种映射路径标注
value属性是@RequestMapping注解的默认属性。当value属性是@RequestMapping注解显式使用的唯一属性时,可以省略value的属性名。例如,下面两种映射路径标注的含义相同。
@RequestMapping(value="/firstController")
@RequestMapping("/firstController")
使用value属性时,可以指定映射单个的请求URL,也可以将多个请求映射到一个方法上。在value属性中添加一个带有请求路径的列表,就可以将这个请求列表中的路径都映射到对应的方法上。
@Controller
public class AuthController {
//设定当前方法的访问映射地址列表
@RequestMapping(value = {"/addUser","/deleteUser"})
public void checkAuth(){
System.out.println("增删操作校验");
}
}
启动项目,在浏览器中访问地址http://localhost:8080/chapter11/addUser,控制台打印输出信息。
在浏览器中访问地址http://localhost:8080/chapter11/deleteUser,控制台打印输出信息。
method属性限定处理器映射
method属性可以对处理器映射的URL请求方式进行限定。当请求的URL和处理器映射成功,但请求方式和method属性指定的属性值不匹配,处理器也不能正常处理请求。
@Controller
@RequestMapping("/method")
public class MethodController {
//只展示了 处理请求方式为GET的请求,get()方法
@RequestMapping(method = RequestMethod.GET)
public void get() {
System.out.println("RequestMethod.GET"); }
//处理请求方式为DELETE的请求,delete()方法
//处理请求方式为POST的请求,post()方法
//处理请求方式为PUT的请求,put()方法
...
}
最后会发现请求的地址一样 但是因为请求的方式不一样 最终访问了不同的方式 这就是method属性的作用
method也是个数组可以限制多个路径
method{RequestMethod.GET,RequestMethod.POST}
params属性值的定义方式
params属性中定义的值可以将请求映射的定位范围缩小。当客户端进行请求时,如果请求参数的值等于params属性定义的值,可以正常执行所映射到的方法,否则映射到的方法不执行。
@Controller
public class ParamsController {
@RequestMapping(value = "/params",params = "id=1")
public void findById(String id) {
System.out.println("id="+id); }}
这就表示我们在请求中必须写在id=1这个参数
string id 表示我们可以接收到请求当中的参数
当在浏览器中加入后缀?id=1 才可以访问到页面
总结:
value限定请求的地址的(可以是数组)
params限定请求当中的参数的
method限定请求当中的方式的