[JAVA]-SpringMVC框架
[JAVA]-SpringMVC框架
1.SpringMVC架构基础
【1】SpringMVC架构学习内容
SpringMVC的基础知识
什么是SpringMVC?
SpringMVC框架原理(掌握)
前端控制器、处理器映射器、处理器适配器、视图解析器
SpringMVC的入门程序
目的:对前端控制、处理器映射器、处理器适配器、视图解析器学习
非注解的处理器映射器、非注解的处理器适配器
注解的处理器映射器、处理器适配器
SpringMVC和MyBatis的整合
SpringMVC注解开发(重点)
常用的注解学习
参数绑定(简单类型、POJO、集合类型)
自定义参数绑定
SpringMVC的高级应用
数据回显
上传图片
JSON数据支持
RESTful支持
拦截器
【2】SpringMVC简介
SpringMVC是属于表现层的框架。它是Spring框架的一部分
架构流程说明
1.用户发送请求到前段控制器DispatchServlet
2.DispatchServlet接受到请求调用HandlerMapping处理器映射器
3.处理器映射器根据请求的URL找到具体的处理器,生成处理器对象以及拦截器并把所有的内容返回到DispatchServlet
4.DispatchServlet通过HandlerAdapter处理器适配器调用处理器
5.执行处理器(Controller-后端控制器)
6.Controller执行完成返回ModelAndView
7.HandlerAdapter将Controller执行的结果ModelAndView返回给DispatchServlet
8.DispatchServlet将ModelAndView传递给ViewReslover视图解析器
9.视图解析器解析后会返回具体的View
10.DispatchServlet对View进行渲染、将模型数据填充到视图
11.DispatchServlet响应客户端请求
2.SpringMVC架构基础
【1】SpringMVC入门基础
商品订单业务
(1)需求分析
通过商品订单业务学习SpringMVC相关的功能(利用之前的表格数据进行操作)
主要测试内容:简单实现商品的查询列表功能
(2)搭建开发环境
Mysql 5.7 、Jdk1.8、Spring5.0.8
导入相关的jar包(在之前的项目的基础上添加spring-webmvc jar包)
pom.xml:
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<spring-version>5.0.8.RELEASE</spring-version>
<logging-version>1.2</logging-version>
<mysql-version>5.1.6</mysql-version>
<c3p0-version>0.9.5.2</c3p0-version>
<druid-version>1.1.10</druid-version>
<dbcp-version>1.4</dbcp-version>
<jstl-version>1.2</jstl-version>
</properties>
<dependencies>
<!-- spring框架相关 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring-version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>${spring-version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
<version>${spring-version}</version>
</dependency>
<!-- spring数据库连接相关: mysql数据库连接、druid数据库连接池-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>${spring-version}</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>${mysql-version}</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>${druid-version}</version>
</dependency>
<!-- springMVC框架相关 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring-version}</version>
</dependency>
<!-- 日志相关 -->
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>${logging-version}</version>
</dependency>
<!-- jstl表达式相关 -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>${jstl-version}</version>
</dependency>
</dependencies>
<build>
<finalName>Spring_Day04</finalName>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.3.2</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
</plugins>
</build>
(3)springMVC流程配置
配置web.xml文件(前端控制器)
在src/main/webapp/WEB-INF下的web.xml中配置Spring的前端控制器
配置形式:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
version="3.0">
<display-name>Archetype Created Web Application</display-name>
<servlet>
<servlet-name>指定名称</servlet-name>
<!-- org.springframework.web.servlet.DispatcherServlet -->
<servlet-class>DispatcherServlet类全名</servlet-class>
<!-- 通过设置contextConfigLocation属性指定加载配置文件的位置 -->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc.xml</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>指定名称</servlet-name>
<url-pattern>*.action</url-pattern>
</servlet-mapping>
</web-app>
配置springmvc.xml的文件
在resource目录下创建springmvc.xml文件,引入spring-mvc的命名空间
<?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:p="http://www.springframework.org/schema/p"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:mvc="http://www.springframework.org/schema/mvc"
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
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd">
......配置内容
</beans>
在springmvc.xml中主要需要配置如下内容
配置处理器映射器
配置处理器适配器
配置处理器
配置视图解析器
<!--
1.配置处理器映射器:BeanNameUrlHandlerMapping
BeanNameUrlHandlerMapping表示将定于的Bean的名字作为请求的url,
需要将编写的controller在spring中进行配置并且需要指定bean的name为请求的url
-->
<bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"></bean>
<!--
2.配置处理器适配器:SimpleControllerHandlerAdapter
SimpleControllerHandlerAdapter即简单控制器处理器适配器,
所有实现了Controller接口的Bean作为SpringMVC的后端控制器
-->
<bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"></bean>
<!--
3.配置处理器:ItemsController(自定义开发的处理器)
自定义处理器实现Controller接口,传送数据到指定视图
-->
<bean id="处理器id" name="指定名称作为访问路径" class="处理器类全名"></bean>
<!-- 4.配置视图解析器:InternalResourceViewResolver -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"></bean>
处理器的开发(Handler) Controller
public class ItemsController implements Controller{
@Override
public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
// 模拟数据库实现数据的封装
Items item1 = new Items();
item1.setId(1);
item1.setName("宏碁笔记本");
item1.setPrice(8000f);
item1.setCreatetime(new Date());
item1.setDetail("宏碁笔记本超级无敌卡的");
Items item2 = new Items();
item2.setId(2);
item2.setName("联想笔记本");
item2.setPrice(6000f);
item2.setCreatetime(new Date());
item2.setDetail("联想笔记本也是超级无敌卡的");
Items item3 = new Items();
item3.setId(3);
item3.setName("苹果笔记本");
item3.setPrice(10000f);
item3.setCreatetime(new Date());
item3.setDetail("宏碁笔记本超级好用");
List list = new ArrayList();
list.add(item1);
list.add(item2);
list.add(item3);
// 创建ModelAndView对象,将数据转发到指定页面
ModelAndView modelAndView = new ModelAndView();
modelAndView.addObject("list",list);
modelAndView.setViewName("WEB-INF/jsp/list.jsp");
// 返回该ModelAndView对象
return modelAndView;
}
}
完成开发视图
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Spring入门程序测试</title>
</head>
<body>
<table border="1">
<tr>
<th>产品id</th>
<th>产品名称</th>
<th>产品价格</th>
<th>生产日期</th>
<th>详细描述</th>
<th>具体操作</th>
</tr>
<c:forEach var="item" items="${list }">
<tr>
<td>${item.id }</td>
<td>${item.name }</td>
<td>${item.price }</td>
<td>${item.createtime }</td>
<td>${item.detail }</td>
<td><a href="#">修改</a> <a href="#">删除</a></td>
</tr>
</c:forEach>
</table>
</body>
</html>
发布项目到tomcat进行测试
访问地址:(与上述处理器配置的访问地址相关)
http://localhost:8080/SpringMVC_Base/queryItems.action
(4)DispatcherServlet
DispatcherServlet.properties:(简单参考)
# Default implementation classes for DispatcherServlet's strategy interfaces.
# Used as fallback when no matching beans are found in the DispatcherServlet context.
# Not meant to be customized by application developers.
org.springframework.web.servlet.LocaleResolver=org.springframework.web.servlet.i18n.AcceptHeaderLocaleResolver
org.springframework.web.servlet.ThemeResolver=org.springframework.web.servlet.theme.FixedThemeResolver
org.springframework.web.servlet.HandlerMapping=org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping,\
org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping
org.springframework.web.servlet.HandlerAdapter=org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter,\
org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter,\
org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter
org.springframework.web.servlet.HandlerExceptionResolver=org.springframework.web.servlet.mvc.method.annotation.ExceptionHandlerExceptionResolver,\
org.springframework.web.servlet.mvc.annotation.ResponseStatusExceptionResolver,\
org.springframework.web.servlet.mvc.support.DefaultHandlerExceptionResolver
org.springframework.web.servlet.RequestToViewNameTranslator=org.springframework.web.servlet.view.DefaultRequestToViewNameTranslator
org.springframework.web.servlet.ViewResolver=org.springframework.web.servlet.view.InternalResourceViewResolver
org.springframework.web.servlet.FlashMapManager=org.springframework.web.servlet.support.SessionFlashMapManager
非注解方式的HandlerMapping处理器映射器
HandlerMapping负责根据requst请求找到对应的Handler处理器
在上述案例的基础上进行修改相应的springmvc.xml文件
(1)BeanNameUrlHandlerMapping
(2)SimpleUrlHandlerMapping
上述两种处理器映射方式是可以同时并存的,哪一个路径对应哪个映射,就执行哪个映射来确定具体的Handler
非注解方式的HandlerApater处理器适配器
(1)SimpleControllerHandlerAdapter
对应的controller实现:
(2)HttpRequestHandlerAdapter
对应的controller实现:
不同的处理器适配器对应着不同的处理器,根据实际需求去完成相关配置即可
(3)最终的配置文件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:p="http://www.springframework.org/schema/p"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:mvc="http://www.springframework.org/schema/mvc"
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
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd">
<!--
1.配置处理器映射器:BeanNameUrlHandlerMapping
BeanNameUrlHandlerMapping表示将定于的Bean的名字作为请求的url,
需要将编写的controller在spring中进行配置并且需要指定bean的name为请求的url
-->
<bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"></bean>
<!-- 配置处理器映射器形式2:SimpleUrlHandlerMapping -->
<bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="mappings">
<props>
<prop key="/queryItems2.action">itemsController</prop>
<prop key="/queryItems3.action">itemsController</prop>
<prop key="/queryItems4.action">itemsController2</prop>
</props>
</property>
</bean>
<!--
2.配置处理器适配器:SimpleControllerHandlerAdapter
SimpleControllerHandlerAdapter即简单控制器处理器适配器,
所有实现了Controller接口的Bean作为SpringMVC的后端控制器
-->
<bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"></bean>
<!--
配置处理器适配器方式2:HttpRequestHandlerAdapter
其控制器相应地需要实现HttpRequestHandler接口
-->
<bean class="org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter"></bean>
<!--
3.配置处理器:ItemsController(自定义开发的处理器)
自定义处理器实现Controller接口,传送数据到指定视图
-->
<bean id="itemsController" name="/queryItems.action" class="com.guigu.springmvc.a_quickstart.ItemsController"></bean>
<bean id="itemsController2" class="com.guigu.springmvc.a_quickstart.ItemsController2"></bean>
<!-- 4.配置视图解析器:InternalResourceViewResolver -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"></bean>
</beans>
上述配置使得下列url均能正确访问数据
http://localhost:8080/SpringMVC_Base/queryItems.action
http://localhost:8080/SpringMVC_Base/queryItems2.action
http://localhost:8080/SpringMVC_Base/queryItems3.action
http://localhost:8080/SpringMVC_Base/queryItems4.action
注解方式的映射器和适配器
采用注解方式配置映射器和适配器,在Controller不需要实现任何接口,只需要使用@ResultMapping(“控制器名称”)进行注解即可,但需要在springmvc.xml中配置组件扫描器,用以扫描指定的包下的文件
注解方式的映射器
org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping
注解方式的适配器
org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter
Springmvc.xml配置如下:
对应Controller层代码编写如下所示:
测试结果:
访问链接:http://localhost:8080/SpringMVC_Base/queryItems.action
mvc:annotation-driven(重点掌握)
将上述所有内容进一步简化,通过使用springMVC的mvc标签完成数据的自动配置,springmvc.xml中的配置如下,controller层编写代码参考上述即可
数据正常访问
http://localhost:8080/SpringMVC_Base/queryItems.action
【2】Spring整合MyBatis
为了更好的学习SpringMVC和MyBatis进行整合开发
整合的目标: 控制层采用SpringMVC 、持久层使用MyBatis实现
开发步骤:
a.需求分析
b.梳理整合思路
c.搭建开发环境
d.根据需求完成dao层、Service层、Controller层、测试界面的开发
需求分析
连接数据库,实现商品列表的查询
梳理整合思路
第一步:整合DAO层
MyBatis和Spring整合:
通过spring管理mapper接口
使用mapper的自动扫描mapper接口在spring的注册
第二步:整合service层
通过spring管理service接口:
使用配置方式将service接口配置在spring配置文件中
实现事务管理
第三步:整合springmvc
由于springmvc是是属于spring的模块 所以不需要整合 直接使用
搭建开发环境
导入相关的jar包:
包括spring 和springmvc相关的jar包、MyBaits相关的jar包
Mybatis-spring整合的jar包、数据库的驱动jar包、第三方数据库连接池驱动的jar包
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.guigu.springmvc</groupId>
<artifactId>SpringMVC_MyBatis</artifactId>
<packaging>war</packaging>
<version>0.0.1-SNAPSHOT</version>
<name>SpringMVC_MyBatis Maven Webapp</name>
<url>http://maven.apache.org</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<spring-version>5.0.8.RELEASE</spring-version>
<mybatis-version>3.4.6</mybatis-version>
<log4j-version>1.2.17</log4j-version>
<logging-version>1.2</logging-version>
<mysql-version>5.1.6</mysql-version>
<druid-version>1.1.10</druid-version>
<jstl-version>1.2</jstl-version>
<mybatis-spring-version>1.3.2</mybatis-spring-version>
</properties>
<dependencies>
<!-- spring相关的jar包 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring-version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>${spring-version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
<version>${spring-version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>${spring-version}</version>
</dependency>
<!-- springMVC相关的jar包 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring-version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>${spring-version}</version>
</dependency>
<!-- MyBatis相关的jar包 -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>${mybatis-version}</version>
</dependency>
<!-- spring整合mybatis必备的jar包 -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>${mybatis-spring-version}</version>
</dependency>
<!-- 日志相关的jar包 -->
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>${logging-version}</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>${log4j-version}</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.25</version>
<scope>test</scope>
</dependency>
<!-- mysql驱动的jar包 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>${mysql-version}</version>
</dependency>
<!-- 第三方数据库连接池相关jar包 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>${druid-version}</version>
</dependency>
<!-- jstl相关的jar -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>${jstl-version}</version>
</dependency>
</dependencies>
<build>
<finalName>SpringMVC_MyBatis</finalName>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.3.2</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
</plugins>
</build>
</project>
根据需求完成dao、service、controller
(1)dao层
目标: 使用Spring管理SqlSessionFactory 、Mapper
完成以下步骤:
a.导入db.properties文件(数据库连接配置文件)
b.导入log4j.properties日志文件
c.创建核心配置文件sqlMapConfig.xml,配置相关内容
d.使用逆向工程生成pojo类、mapper.java接口、mapper.xml配置文件
e.创建applicationContext-dao.xml配置文件,使用spring管理dao层
a.导入db.properties文件(数据库连接配置文件)
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/springmvc
jdbc.username=root
jdbc.password=root
b.导入log4j.properties日志文件
c.创建核心配置文件sqlMapConfig.xml,配置相关内
d.使用逆向工程生成pojo类、mapper.java接口、mapper.xml配置文件
v e.创建applicationContext-dao.xml配置文件,使用spring管理dao层
applicationContext-dao.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:p="http://www.springframework.org/schema/p"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:mvc="http://www.springframework.org/schema/mvc"
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
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd">
<!-- a.加载指定的配置文件:实现数据库连接 -->
<context:property-placeholder location="classpath:config/db.properties" />
<!-- 使用druid数据库连接池 -->
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"
init-method="init" destroy-method="close">
<property name="driverClassName" value="${jdbc.driver}"></property>
<property name="url" value="${jdbc.url}"></property>
<property name="username" value="${jdbc.username}"></property>
<property name="password" value="${jdbc.password}"></property>
</bean>
<!--
b.配置sqlSessionFactory :
SqlSessionFactoryBean 需要配置两个属性:
配置数据库连接池:dataSource
配置加载mybatis的文件:configLocation
-->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<!-- 配置数据库连接池 -->
<property name="dataSource" ref="dataSource"></property>
<!-- 配置加载mybatis的文件 -->
<property name="configLocation" value="classpath:mybatis/SqlMapConfig.xml"></property>
</bean>
<!--
c.定义mapper扫描器 :MapperScannerConfigurer
需要配置两个属性:
配置扫描包的路径信息:basePackage
配置sqlSessionFactory:sqlSessionFactoryBeanName
-->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<!-- 配置扫描包的路径信息 -->
<property name="basePackage" value="com.guigu.ssm.mapper"></property>
<!-- 配置sqlSessionFactory -->
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"></property>
</bean>
</beans>
(2)service层
目标:
Service交给spring管理
spring对service进行事务管理
开发步骤:
a.配置applicationContext-service.xml文件
b.配置applicationContext-transaction.xml文件
c.编写Service接口和相应的ServiceImpl实现类
v a.配置applicationContext-service.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:p="http://www.springframework.org/schema/p"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:mvc="http://www.springframework.org/schema/mvc"
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
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd">
<!-- 配置相关的service,也可以不需要配置,直接通过注解的形式进行管理 -->
</beans>
b.配置applicationContext-transaction.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:p="http://www.springframework.org/schema/p"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:mvc="http://www.springframework.org/schema/mvc"
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
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd">
<!--
事务管理配置:
对mybatis操作数据库的事务进行控制,spring使用jdbc的事务控制类
org.springframework.jdbc.datasource.DataSourceTransactionManager
-->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<!-- 配置数据源 -->
<property name="dataSource" ref="dataSource"></property>
</bean>
<!--
a.可以使用默认的配置
<tx:annotation-driven/>
-->
<!--
b.手动配置
-->
<!-- 定义通知 -->
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<!-- 传播行为定义 -->
<tx:method name="save*" propagation="REQUIRED"/>
<tx:method name="delete*" propagation="REQUIRED"/>
<tx:method name="insert*" propagation="REQUIRED"/>
<tx:method name="update*" propagation="REQUIRED"/>
<tx:method name="find*" propagation="SUPPORTS" read-only="true"/>
<tx:method name="get*" propagation="SUPPORTS" read-only="true"/>
<tx:method name="select*" propagation="SUPPORTS" read-only="true"/>
</tx:attributes>
</tx:advice>
<!-- 定义切面 -->
<aop:config>
<aop:advisor advice-ref="txAdvice" pointcut="execution (* com.guigu.ssm.service.impl.*.*(..))"/>
</aop:config>
</beans>
c.编写Service接口和相应的ServiceImpl实现类
此处为了测试商品管理相关的内容,以商品管理相关进行测试
ItemsService.java:
public interface ItemsService {
// 查找所有项目信息
public List<Items> findItemsList()throws Exception;
// 根据id查找详细信息
public Items findItemsById(Integer id)throws Exception;
// 根据主键id修改信息
public void updateItemsById(Integer id,Items item)throws Exception;
}
ItemsServiceImpl.java:
@Service("itemsService")
public class ItemsServiceImpl implements ItemsService{
@Autowired
private ItemsMapper itemsMapper;
@Override
public List<Items> findItemsList() throws Exception {
List<Items> list = itemsMapper.selectByExampleWithBLOBs(null);
// 打印数据进行验证
System.out.println(list);
return list;
}
@Override
public Items findItemsById(Integer id) throws Exception {
return itemsMapper.selectByPrimaryKey(id);
}
@Override
public void updateItemsById(Integer id, Items item) throws Exception {
// 一般是通过主键id进行修改,此处明确指定主键id
item.setId(id);
// 执行修改操作
itemsMapper.updateByPrimaryKeyWithBLOBs(item);
}
}
(3)action(controller)
目的:
完成controller层的开发
完成相关配置文件的导入并编写测试代码
开发步骤:
a.创建springmvc.xml进行配置(完成扫描包路径配置和视图解析器的配置)
b.配置web.xml文件(加载spring容器、配置springMVC的前端控制器)
c.创建xxxController.java完成控制层代码编写
d.编写测试页面进行相关测试
a.创建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:p="http://www.springframework.org/schema/p"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:mvc="http://www.springframework.org/schema/mvc"
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
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd">
<!-- 定义扫描包的路径 -->
<context:component-scan base-package="com.guigu.ssm.controller,com.guigu.ssm.service.impl"></context:component-scan>
<mvc:annotation-driven/>
<!-- 配置视图解析器 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!-- 配置视图的前缀 -->
<property name="prefix" value="WEB-INF/jsp/"></property>
<!-- 配置视图的后缀 -->
<property name="suffix" value=".jsp"></property>
</bean>
</beans>
b.配置web.xml文件(加载spring容器、配置springMVC的前端控制器)
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
version="3.0">
<display-name>Archetype Created Web Application</display-name>
<!-- 加载spring容器 -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/classes/spring/applicationContext-*.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!-- 配置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:spring/springmvc.xml</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>*.action</url-pattern>
</servlet-mapping>
</web-app>
c.创建xxxController.java完成控制层代码编写
@Controller
public class ItemsController {
@Autowired
private ItemsService itemsService;
@RequestMapping("/queryItems")
public ModelAndView queryItems() throws Exception {
List<Items> list = itemsService.findItemsList();
ModelAndView modelAndView = new ModelAndView();
// 转发数据到指定页面
modelAndView.addObject("itemList", list);
// 在配置文件中指定了前缀和后缀,此处可以省略部分内容等价于WEB-INF/jsp/xxx/xxx.jsp
modelAndView.setViewName("items/itemList");
return modelAndView;
}
}
d.编写测试页面进行相关测试
itemList.jsp:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>查阅所有商品信息</title>
</head>
<body>
<table border="1">
<tr>商品信息一览</tr>
<tr>
<th>商品id</th>
<th>商品名称</th>
<th>商品价格</th>
<th>商品描述</th>
<th>生产日期</th>
<th>操作</th>
</tr>
<c:forEach var="item" items="${itemList }">
<tr>
<td>${item.id }</td>
<td>${item.name }</td>
<td>${item.price }</td>
<td>${item.detail }</td>
<td>${item.createtime }</td>
<td><a href="${pageContext.request.contextPath }/editItems.action?id=${item.id}">修改</a></td>
</tr>
</c:forEach>
</table>
</body>
</html>
测试结果:
访问链接:http://localhost:8080/SpringMVC_MyBatis/queryItems.action,测试结果如下所示
【3】SpringMVC注解开发
基础开发说明
(1)案例:修改数据信息
需求分析
使用springMVC实现商品信息的维护
操作流程:
1、进行商品列表页面
2、点击修改,进行商品修改页面,页面中显示要修改的商品信息(数据库查询而来),
根据商品的id进行查询商品信息
3、在商品修改修改页面,修改商品信息,修改后点击提交即可
商品修改
dao层
使用逆向工程自动生成的代码:
ItemsMapper.java、ItemsMapper.xml
service层
controller层
页面
editItems.jsp:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>修改产品信息</title>
</head>
<body>
<form action="${pageContext.request.contextPath }/updateItems.action">
<table border="1">
<tr>
<td>产品名称</td>
<td>
<input type="hidden" name="id" value="${findItem.id }"/>
<input type="text" name="name" value="${findItem.name }"/>
</td>
</tr>
<tr>
<td>产品价格</td>
<td>
<input type="text" name="price" value="${findItem.price }"/>
</td>
</tr>
<tr>
<td>具体描述</td>
<td>
<textarea name="detail" rows="5" cols="20">${findItem.detail }</textarea>
</td>
</tr>
<tr>
<td>图片介绍</td>
<td>
<c:if test="${items.pic!=null }">
<img alt="图片" src="${pageContext.request.contextPath }/${items.pic}" width="100" height="100">
</c:if>
<input type="file" name="pic" />
</td>
</tr>
<tr>
<td>生产时间</td>
<td>
<input type="text" name="createtime" value='<fmt:formatDate value="${findItem.createtime }" pattern="yyyy-MM-dd HH:mm:ss"/>'/>
</td>
</tr>
<tr>
<td>操作</td>
<td>
<button type="submit">修改</button>
<button type="reset">重置</button>
</td>
</tr>
</table>
</form>
</body>
</html>
在没有了解注解开发的时候,修改的item的id是固定的,在学习注解开发相关知识之后学会利用springMVC实现动态绑定数据修改item
(2)@RequestMapping
通过RequestMapping注解可以定义不同的处理器映射规则
URL路径映射
还可以将多个url映射到同一个方法中
窄化请求映射
在当前的类上加上@RequestMapping 指定通用请求前缀 限制此类所有的方法的请求url
常见问题:在窄化请求路径的时候,会发现请求指定action跳转页面的时候,始终会多一层目录(窄化的目录),从而导致路径操作,始终跳转不到指定的jsp页面
在springmvc.xml中配置视图解析器的时候配置前缀少了个“/”,从而导致出错:
修改完成,再次进行测试,请求路径:
(如果数据还是不能正常显示,可通过更新工程或者重启服务器再次进行测试即可)
此外,由于窄化了请求,因此在修改部分也要相应地提交正确路径的action,否则会报404错误
ItemList.jsp:
EditItems.jsp:
(此处由于时间进行了格式化,在提交的时候会报400错误,是由于提交的参数值与其数据类型不汽配,需要进行调整,之后会学习通过转化器实现字符串数据与日期类的转化)
请求方法的限定
在某些业务需求中,要求只能是get或者post提交表单,其它方法报错
限定POST方法
限定访问的方式是post
如果是以get方式访问,则报错
限定GET方法
限定访问的方式是GET
如果是以post方式访问,则报错
限定GET和POST都可以
(5)Controller方法返回值
返回ModelAndView
ModelAndView封装了数据和视图页面
返回字符串
返回字符串逻辑视图名字
表示返回逻辑视图名:真正的视图是jsp路径 =前缀 +逻辑视图+后缀
Redirect重定向
可以重定向到一个url路径
Forward转发
(4)参数绑定
a.参数绑定的介绍
注解适配器RequestMapping标记的方法进行适配,对方法中的形参进行参数绑定
处理器适配器在执行Handler之前需要把Http请求的key/value数据绑定到Handler方法的形参上
b.默认支持的参数类型
在Controller的方法的形参上直接定义,就可以直接使用
HttpServletRequest
HttpServletResponse
HttpSession
Model/ModelMap
c.简单类型
当请的求的参数名称和形参的名称一致的时候,可以自动进行绑定
如果表单的传递的参数名称和方法的形参的名称是一致的,可以直接进行绑定。
所支持的数据类型有整形、字符串、单精度、双精度、布尔类型
@RequestParam
如果传递的参数名称和方法的形参是不一致的,该怎样绑定?
通过@RequestParam指定要绑定的数据名称即可:
value:参数的名称 就是表单中参数的,名称 这个是必须要传递的
required:是否是必须的,默认就是true,表示请求参数中必须有对应的id,如果没有则报错
d.POJO
针对简单的pojo类型,只需要在jsp中定义的提交的参数的name属性与pojo类中相应的属性一致,即可完成pojo的封装
e.自定义参数绑定
通过自定义转换器实现字符串数据和日期数据之间的转换:在绑定数据的时候,需要把字符串类型转换为日期类型,否则会报400错误,实则为提交的数据类型与实际数据定义的类型不匹配引发的问题
解决步骤:
1.自定义转换器Converter
2.在核心配置文件springmvc.xml中配置自定义转换器
自定义Converter
配置自定义转换器
(5)问题总结
解决中文乱码问题
为了解决中文乱码问题,在web.xml配置如下
高级开发说明
(1)数据验证
数据验证分为分为客户端校验和服务端校验
需求分析
在商品信息修改提交时,对商品信息内容进行校验。比如对商品的名称必须输入,价格必须合法。生产日期不能为空等校验
步骤分析
a.添加springMVC数据校验所需要的jar包
b.配置校验器
c.将定义的校验器添加到处理器适配器上
d.在指定的pojo类中添加校验规则并在配置文件中添加校验信息
e.捕获错误信息并回显数据
a.添加springMVC数据校验所需要的jar包
在pom.xml文件中配置校验相关的jar包(利用Hibernate验证的jar包)
b.配置校验器
c.将定义的校验器添加到处理器适配器上
d.在指定的pojo类中添加校验规则并在配置文件中添加校验信息
e.捕获错误信息并回显数据
在相应的controller层通过注解对数据进行校验,捕获相应的错误信息并转发到指定jsp页面实现校验
测试结果:
此处会有一个小问题,如果测试输入日期为空会报相应的日期转换异常问题,其余数据能够正常操作并显示,数据测试如下:
(2)分组校验
如果有多处使用同一个Items类则可以进行分组校验,通过分组校验可以对每处的校验个性化
解决办法: 定义多个校验分组,其实就是一个空接口,用来标记不同的分组
步骤:
a.定义多个校验分组(即空接口)
b.在校验规则中使用分组
c.在Controller对应方法中指定分组
a.定义多个检验分组
b.在校验规则中使用分组
c.在Controller对应方法中指定分组
测试结果:
(3)常见的注解校验
@Null 被注释的元素必须为null
@NotNull 被注释的元素不能为空
@Min 被注释的元素必须是一个数字 而且其中的值必须大于等于指定的值
@Max 被注释的元素必须是一个数字 而且其中的值必须小于于等于指定的值
@Size 被注释的元素必须处于指定的范围内
@Past 被注释的元素必须是一个过去的日期
@Future 被注释的元素必须是一个将来的日期
@Email 被注释的元素必须是一个合法的邮箱
@length 被注释的元素字符串的大小必须在指定的范围
@NotEmpty 被注释的元素字符串不能为空
(4)数据回显
需求分析:如果表单校验失败 需要再次把数据回显到表单内
根据当前页面中的属性确定传递的数据
数据校验完成,在Controller中传递的内容要与页面中的一一对应
在执行的会自动进行数据的回显
在springMVC中默认支持POJO数据的回显,要求是首字母小写 ,所以上方的代码自动回显
但如果把Controller的内容修改如下,即传递的属性和model对象不一致,则无法完成数据的回显
@ModelAttribute
通过@ModelAttribute 可以完成数据的传递
通过@ModelAttribute将数据传递到页面
【4】SpringMVC异常处理
Springmvc在处理请求的过程中,如果出现异常信息,统一交给异常处理器进行处理
异常处理思路分析
操作步骤:
a.自定义异常类和异常类处理器
b.定义相应的错误页面显示异常提示信息
c.在核心配置文件springmvc.xml中配置全局的异常处理器
d.在controller中的某个方法中针对某个异常情况抛出异常进行测试
案例分析
a.自定义异常类和异常类处理器
b.定义相应的错误页面显示异常提示信息
c.在核心配置文件springmvc.xml中配置全局的异常处理器
d.在controller中的某个方法中针对某个异常情况抛出异常进行测试
访问一个不存在的id进行测试,可以看到后台相应抛出异常,且对应的error.jsp中显示相应的异常信息
【5】SpringMVC文件上传
文件上传相关
操作步骤:
a.在pom.xml中添加文件上传相关jar包
b.配置文件解析器(在核心配置文件springmvc.xml、相关jsp文件中进行配置)
c.根据提交的数据在Controller层完成文件的上传
a.在pom.xml中添加文件上传相关jar包
b.配置文件解析器(在核心配置文件springmvc.xml、相关jsp文件中进行配置)
c.根据提交的数据在Controller层完成文件的上传
问题解决:测试的时候发现图片数据不能够回显,考虑将存储路径修改为当前工程路径下目录再进行测试
SpringMVC与JSON的数据交互
JSON数据格式在接口调用中 。html中比较常见,json的格式也比较简单,解析比较方便
User{
Id:1,
Username:zhangsan,
Age:30
}
xml和json是两种不同的数据格式 ,json的数据格式更为简单,也更为容易解析
(1)SpringMVC进行JSON的交互流程
(2)@RequestBody
作用:@RequestBody注解用于读取HTTP请求,请求的内容通过SpringmVC提供的HttpMessageConverter接口 把读取到的内容转换为JSON, 并把数据绑定到Controller方法的形参上
(3)@ResponseBody
作用:该注解是用于把Controller的方法返回的对象通过HttpMessageConvter接口转换为指定的JSON格式,xml的数据,通过Response对象响应到客户端
请求JSON、响应JSON
环境准备
springMVC默认是用org.springframework.http.converter.json.MappingJackson2HttpMessageConverter
对json数据转换,需要在相应工程的pom.xml文件下导入json相关jar包
配置JSON转换器
编写JS代码进行测试
Controller代码
测试代码
- 请求的数据格式
- 响应的数据格式
【6】SpringMVC的拦截器
SpringMVC的拦截器类似于Servlet的过滤器,用于在请求服务器之前进行拦截和请求之后进行处理。
开发步骤:
a.定义拦截器
b.在核心配置文件springmvc.xml中配置拦截器
c.进入到相应Controller的方法中执行测试
拦截器的基本使用
a.定义拦截器
b.在核心配置文件springmvc.xml中配置拦截器
c.进入到相应Controller的方法中执行测试
访问任意一个页面,查阅控制台拦截器执行的顺序(与servlet的过滤器执行顺序相同)
拦截器的应用实例
需求分析:如果用户没有登录,无法执行修改、查询等操作
开发步骤:
a.定义Controller(用户用户登录、退出)
b.定义拦截器
c.在核心配置文件springmvc.xml中配置拦截器
d.编写login.jsp,进入到相应Controller的方法中执行测试
a.定义Controller(用户用户登录、退出)
b.定义拦截器
c.在核心配置文件springmvc.xml中配置拦截器
d.编写login.jsp,进入到相应Controller的方法中执行测试
直接访问:http://localhost:8080/SpringMVC_MyBatis/items/queryItems.action
第一次访问没有进行登录,因此该action被拦截器所拦截直接跳转到登录界面要求强制进行登录
输入任意数据模拟登录,数据能够正常操作
执行logout.action清空缓存数据(模拟登录退出操作),
再次访问http://localhost:8080/SpringMVC_MyBatis/items/queryItems.action,此时又再次强制跳转到相应登录界面