1. Spring与Web环境集成
1.1 环境集成
① 导入坐标
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>5.0.5.RELEASE</version>
</dependency>
② 配置监听器
<!--Spring的监听器(用来加载Spring的配置文件)-->
<listener>
<listener-class>
org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>
<!--全局参数,指定Spring配置文件所在位置-->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext.xml</param-value>
</context-param>
1.2 Web环境使用Spring
普通环境下使用(Servlet中使用)
// 1.使用spring自带的工具类, 获取Spring的核心容器
ApplicationContext app = WebApplicationContextUtils.getWebApplicationContext(request.getServletContext());
// 2.通过Spring核心容器的getBean方法, 获取指定的对象
AccountService as = app.getBean(AccountService.class);
SpringMVC环境下使用
@Autowired
private AccountService accountService; // 直接依赖注入即可
2. SpringMVC的简介
2.1 SpringMVC概述
SpringMVC 是一种基于 Java 的实现 MVC 设计模型的轻量级 Web 框架,属于SpringFrameWork 的后续产品.
SpringMVC 已经成为目前最主流的MVC框架之一,它通过一套注解,让一个简单的 Java 类成为处理请求的控制器,而无须实现任何接口。同时它还支持 RESTful 编程风格的请求。
2.2 SpringMVC快速入门
需求:客户端发起请求,服务器端接收请求,执行逻辑并进行视图跳转。
2.2.1 开发步骤
①导入坐标
②配置SpringMVC核心控制器DispathcerServlet
③配置SpringMVC核心文件 springmvc.xml
④创建Controller类
⑤使用注解配置Controller类中业务方法的映射地址
⑥客户端发起请求测试
2.2.2 代码实现
① 导入坐标
<!--Spring坐标-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.0.5.RELEASE</version>
</dependency>
<!--SpringMVC坐标-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.0.5.RELEASE</version>
</dependency>
<!--Servlet坐标-->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
<!--Jsp坐标-->
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>javax.servlet.jsp-api</artifactId>
<version>2.3.0</version>
<scope>provided</scope>
</dependency>
② 在web.xml配置SpringMVC的核心控制器
<servlet>
<servlet-name>DispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!--指定Springmvc的配置文件所在位置-->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc.xml</param-value>
</init-param>
<!--让前端控制器随着项目的启动而加载-->
<load-on-startup>2</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>DispatcherServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
③ 创建spring-mvc.xml,并配置
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<!--配置注解扫描(SpringMVC只扫描自己的Controller)-->
<context:component-scan base-package="com.ittest.controller"/>
</beans>
④ 创建Controller和业务方法
public class QuickController {
public String quickMethod(){
System.out.println("quickMethod running.....");
return "index";
}
}
⑤ 配置注解
@Controller
public class QuickController {
//当前方法的访问路径是"quick"
@RequestMapping("/quick")
public String quickMethod(){
System.out.println("quickMethod running.....");
// 请求结束后, 跳转到success.jsp页面
return "/success.jsp";
}
}
⑥ 测试地址
http://localhost:8080/springmvcWeb/quick
2.3 SpringMVC组件解析
前端控制器:DispatcherServlet
DispatcherServlet 是SpringMVC整个流程控制的中心,用户的所有请求,都需要先到达前端控制器
处理器映射器:HandlerMapping
HandlerMapping负责根据用户请求路径,找到该路径对应的执行流程
处理器适配器:HandlerAdapter
拿到请求路径对应的"执行流程"后,HandlerAdapter负责调用对应的方法进行执行.
处理器:Handler
负责真正的执行方法
视图解析器:View Resolver
负责处理"方法执行之后的结果",特别是跳转页面,由视图解析器负责处理要跳转的页面
视图:View
页面
2.4 RequestMapping注解解析
作用
RequestMapping: 用于设置方法的请求路径, 当浏览器的请求路径符合要求的时候,执行对应的方法
属性:
value:用于指定请求的URL。它和path属性的作用是一样的
method:用于指定请求的方式
位置:
@Controller
@RequestMapping("/page") //类的访问路径
public class PageController {
@RequestMapping("/show") //方法的访问路径
public String show(){
return "/success.jsp";
}
//如果类上没有RequestMapping, 则该方法的请求路径是 "/show"
//如果类上也有RequestMapping, 则该方法的请求路径是 "/page/show"
}
2.5 组件扫描
在以后的开发中, 一个程序经常会既包含Spring, 也包含SpringMVC, 那这个时候就会要求他们各自扫描各自的.
Spring
<!--扫描整个com.ittest包-->
<context:component-scan base-package="com.ittest">
<!--排除掉Controller注解,该注解交给SpringMVC处理,Spring不处理-->
<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
</context:component-scan>
SpringMVC
<context:component-scan base-package="com.ittest.cotroller"/>
2.6 页面跳转(视图解析器)
在SpringMVC的Controller中, 有时候返回值会有重复性内容, 这个时候, 我们可以把返回值中重复部分提取, 那这个就是SpringMVC的前端控制器
2.6.1 案例
**配置"视图解析器"之前代码: **
@RequestMapping("/show02")
public String show02(){
return "/jsp/aaa.jsp";
}
@RequestMapping("/show03")
public String show03(){
return "/jsp/bbb.jsp";
}
抽取"视图解析器"
<!--配置内部资源视图解析器-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!--前缀(前边重复性内容)-->
<property name="prefix" value="/jsp/"></property>
<!--后缀(后边重复性内容)-->
<property name="suffix" value=".jsp"></property>
</bean>
配置视图解析器后的Controller代码
@RequestMapping("/show02")
public String show02(){
return "aaa";
}
@RequestMapping("/show03")
public String show03(){
return "bbb";
}
2.6.2 注意事项
当一个项目配置了"视图解析器"之后, 所有Controller方法的返回值, 都会被"视图解析器"解析.
@RequestMapping("/show01")
public String show01(){
return "/success.jsp";
//如果项目配置了上边的"视图解析器",则当前方法的返回值,会被自动解析为"/jsp/success.jsp.jsp"
}
**解决方案: **
如果想让方法的返回值不被"视图解析器"解析, 则可以在返回值之前,加上"forward"或者"redirect"前缀
@RequestMapping("/show01")
public String show01(){
return "forward:/success.jsp"; //转发到success.jsp, 并且不允许视图解析器解析
//return "redirect:/success.jsp"; //重定向到success.jsp, 并且不允许视图解析器解析
}