一、导入
Maven:
<!--会自动依赖spring-web核心模块-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>4.3.10.RELEASE</version>
</dependency>
二、创建springmvc.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"
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
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd">
</beans>
三、在web.xml中配置SpringMVC
<servlet>
<servlet-name>SpringMVC</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc.xml</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>SpringMVC</servlet-name>
<url-pattern>*.action</url-pattern>
</servlet-mapping>
注意:url-pattern可以是.action,也可以是/,但不能是/。因为/*时Spring会匹配到jsp页面,
而Spring又没有处理jsp页面的能力,后果就是浏览器把jsp页面当作资源文件直接下载。
四、在springmvc.xml中配置bean和映射器,适配器,视图解析器
配置bean,无非就是用bean标签或自动扫描加注解,没什么好说的。
配置地址映射器:
- BeanNameUrlHandlerMapping(根据控制器bean的name属性映射控制器。默认,如果就是使用这个,可不写)
- SimpleUrlHandlerMapping(根据property子标签映射控制器)
- RequestMappingHandlerMapping(注解)
配置处理器适配器(处理自己写的业务控制类):
- SimpleControllerHandlerAdapter(处理Controller的实现类。默认,如果就是使用这个,可不写)
- HttpRequestHandlerAdapter(处理HttpRequestHandler的实现类)
- RequestMappingHandlerAdapter(注解)
配置视图解析器(给所有访问的url统一加上前后缀):
- InternalResourceViewResolver
BeanNameUrlHandlerMapping
<bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>
<bean id="loginController" name="/login.action" class="com.springmvc.controller.LoginController"/>
要求:LoginController必须实现接口org.springframework.web.servlet.mvc.Controller。
说明:当访问/login.action时,就会跳转到LoginController。优点是配置起来相对简单。
缺点是必须在配置文件中显式地声明bean,自动扫描功能component-scan就没用了。
SimpleUrlHandlerMapping
<context:component-scan base-package="com.springmvc.controller"/>
<bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<!-- 这里的name必须是mappings -->
<property name="mappings">
<props>
<prop key="/register.action">registerController</prop>
<prop key="/login.action">loginController</prop>
</props>
</property>
</bean>
要求:LoginController和RegisterController必须实现接口Controller,注解@Controller。
说明:registerController和loginController是由Spring自动推导出来的,不用手动设置。
SimpleControllerHandlerAdapter和HttpRequestHandlerAdapter
<!--处理适配器SimpleControllerHandlerAdapter,处理实现了Controller接口的类,可省略-->
<bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/>
<!-- 处理适配器HttpRequestHandlerAdapter,处理实现了Controller接口的类 -->
<bean class="org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter"/>
注:两者可同时存在。
InternalResourceViewResolver(视图解析器)
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/page"/>
<property name="suffix" value=".jsp"/>
</bean>
六、实现控制类和控制方法(使用注解的方式):
方法1【推荐】:配置文件添加\
@RequestMapping(注解控制器类)
value:控制方法地址的前缀。
@RequestMapping(注解控制方法)
params:规定参数,可以定义必须有(无)某个参数,参数必须(不)等于某个值。
"name" --> 必须有参数name
"name,!pass" --> 必须有参数name,没有参数pass
"name=wang" --> 必须有参数name且值为wang
"name!=wang" --> 必须有参数name且值不为wang
method:规定请求方法。默认是GET或POST。
注解@RequestMapping的处理方法
参数绑定
详见《SpringMVC 学习笔记2 - 参数绑定》
返回的类型
返回Null:
声明的返回类型为void,String,ModelAndView均可,需要自己实现跳转或重定向。
不会加上InternalResourceViewResolver定义的前后缀。
返回ModelAndView:
通过addObject设置传递的参数,效果等同于req.setAttribute + url显式传参。
通过setViewName设置需要跳转的页面,会加上InternalResourceViewResolver定义的前后缀。
返回String:
1. 地址:"/{path}"(效果等同于modelAndView.setViewName,会加上前后缀)
2. 转发:"forward:/{path}"(效果等同于request.getRequestDispatcher.forward,不会加上前后缀)
3. 重定向:"redirect:/{path}"(效果等同于response.sendRedirect,不会加上前后缀,Intellij IDEA不会链接)
注:转发和重定向开始的反斜杠代表根目录,而地址开始的反斜杠仅仅是作为分隔符。
参数列表可以为空,也可以是request和response,还可以是
url参数(自动通过名字获取request的参数),甚至可以是Model(类似于request)
使用示例:
// TODO : UserController完善后复制到这里作为示例