5、SSM整合方式二--图文并茂详细版
来源:互联网 发布:苹果音乐制作软件 编辑:程序博客网 时间:2024/06/06 02:54
1、idea 2017 11.23刚过期,今天找到一个可以破解的方式:
http://blog.csdn.net/zhangwenwu2/article/details/54948959
2、上一篇我自己根据网上一个整合方式,完成了ssm的整合,但是有些操作对于新手来说比较陌生,这一篇我决定好好地以动态图或者图片的形式将我创建过程中的一些操作展现出来。
上一篇之所以不这样干,因为麻烦,上传这些动态图是不能直接在markdoen中上传的,因为超出了大小限制。
本篇其实与上一篇的整合方式是一样的,都是xml方式配置,但是稍微在结构和细节上有所不同,然后这次将更加详细一点。
源码在最后可以下载,托管于码云,免费的,很鄙视下载还要积分,晕。
希望有问题多多与我交流,到明年校招之前,我会死磕java、数据结构、jvm、mysql、spring等。
3、整合完成之后结构目录:
4、创建maven javaWeb项目:
5、生成项目之后,点击右下角让他自动导入。初始的目录结构是这样的:
6、引入依赖,pom文件:
<properties> <spring.version>4.1.4.RELEASE</spring.version> <mybatis.version>3.2.8</mybatis.version> <slf4j.version>1.7.7</slf4j.version> <log4j.version>1.2.17</log4j.version> </properties> <dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>${spring.version}</version> </dependency> <!-- 添加spring-tx包 --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-tx</artifactId> <version>${spring.version}</version> </dependency> <!-- 添加spring-jdbc包 --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> <version>${spring.version}</version> </dependency> <!-- 为了方便进行单元测试,添加spring-test包 --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-test</artifactId> <version>${spring.version}</version> </dependency> <!--添加spring-web包 --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-web</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-aop</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context-support</artifactId> <version>${spring.version}</version> </dependency> <!--添加aspectjweaver包 --> <dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjweaver</artifactId> <version>1.8.5</version> </dependency> <!-- 添加mybatis的核心包 --> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>${mybatis.version}</version> </dependency> <!-- 添加mybatis与Spring整合的核心包 --> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis-spring</artifactId> <version>1.2.2</version> </dependency> <!-- 添加servlet3.0核心包 --> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>3.0.1</version> </dependency> <dependency> <groupId>javax.servlet.jsp</groupId> <artifactId>javax.servlet.jsp-api</artifactId> <version>2.3.2-b01</version> </dependency> <!-- jstl --> <dependency> <groupId>javax.servlet</groupId> <artifactId>jstl</artifactId> <version>1.2</version> </dependency> <!-- 添加mysql驱动包 --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.34</version> </dependency> <!-- 添加druid连接池包 --> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.0.12</version> </dependency> <!-- 日志文件管理包 --> <!-- log start --> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>${log4j.version}</version> </dependency> <!-- 格式化对象,方便输出日志 --> <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.1.41</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>${slf4j.version}</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> <version>${slf4j.version}</version> </dependency> <!-- log end --> <!--apache shiro --> <dependency> <groupId>org.apache.shiro</groupId> <artifactId>shiro-core</artifactId> <version>1.2.2</version> </dependency> <!--apache shiro end--> <!-- 上传组件包 --> <dependency> <groupId>commons-fileupload</groupId> <artifactId>commons-fileupload</artifactId> <version>1.3.1</version> </dependency> <dependency> <groupId>commons-io</groupId> <artifactId>commons-io</artifactId> <version>2.4</version> </dependency> <dependency> <groupId>commons-codec</groupId> <artifactId>commons-codec</artifactId> <version>1.9</version> </dependency> <!--mybatis自动生成工具--> <dependency> <groupId>org.mybatis.generator</groupId> <artifactId>mybatis-generator-core</artifactId> <version>1.3.2</version> <scope>test</scope> </dependency> </dependencies> <build> <finalName>work_attendance</finalName> //扫描这个目录下的xml文件,使之能够被编译 <resources> <resource> <directory>src/main/java</directory> <includes> <include>**/*.xml</include> </includes> </resource> </resources> //自动生成工具插件 <plugins> <plugin> <groupId>org.mybatis.generator</groupId> <artifactId>mybatis-generator-maven-plugin</artifactId> <version>1.3.2</version> <configuration> <verbose>true</verbose> <overwrite>true</overwrite> </configuration> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <configuration> <source>1.8</source> <target>1.8</target> </configuration> </plugin> </plugins> </build>
7、增加java目录,存放源文件
8、在resources下配置spring-cfg.xml核心文件:
这部分的主要功能是配置mybatis,以及事务的管理,完成spring和mybatis的整合。
<?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:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsd"> <!--开启切面编程自动代理--> <aop:aspectj-autoproxy proxy-target-class="true"/> <!--扫描注解生成bean--> <context:annotation-config/> <!--包扫描--> <context:component-scan base-package="com.oursnail"/> <context:property-placeholder location="classpath:jdbc.properties"/> <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="dataSource" ref="dataSource"/> <property name="mapperLocations" value="classpath:com/oursnail/**/**.xml"/> </bean> <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <property name="basePackage" value="com.oursnail.*.dao"/> <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/> </bean> <!--声明事务管理 采用注解方式--> <tx:annotation-driven transaction-manager="transactionManager"/> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource"/> </bean> <!--数据库设置--> <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" destroy-method="close" init-method="init"> <property name="url" value="${jdbc_url}"/> <property name="username" value="${jdbc_username}"/> <property name="password" value="${jdbc_password}"/> <!-- 初始化连接大小 --> <property name="initialSize" value="0"/> <!-- 连接池最大使用连接数量 --> <property name="maxActive" value="20"/> <!-- 连接池最小空闲 --> <property name="minIdle" value="0"/> <!-- 获取连接最大等待时间 --> <property name="maxWait" value="60000"/> <!-- <property name="poolPreparedStatements" value="true" /> <property name="maxPoolPreparedStatementPerConnectionSize" value="33" /> --> <property name="validationQuery" value="${validationQuery}"/> <property name="testOnBorrow" value="false"/> <property name="testOnReturn" value="false"/> <property name="testWhileIdle" value="true"/> <!-- 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 --> <property name="timeBetweenEvictionRunsMillis" value="60000"/> <!-- 配置一个连接在池中最小生存的时间,单位是毫秒 --> <property name="minEvictableIdleTimeMillis" value="25200000"/> <!-- 打开removeAbandoned功能 --> <property name="removeAbandoned" value="true"/> <!-- 1800秒,也就是30分钟 --> <property name="removeAbandonedTimeout" value="1800"/> <!-- 关闭abanded连接时输出错误日志 --> <property name="logAbandoned" value="true"/> <!-- 监控数据库 --> <!-- <property name="filters" value="stat" /> --> <property name="filters" value="mergeStat"/> </bean></beans>
注意根据不同的项目路径需要改动的是:
- 扫描的包路径,我是com.oursnail
<!--包扫描--><context:component-scan base-package="com.oursnail"/>
- 扫描mybatis sql xml的路径,我是com/oursnail//.xml,即扫描com.oursnail下面的所有文件夹下面的所有xml:
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="dataSource" ref="dataSource"/> <property name="mapperLocations" value="classpath:com/oursnail/**/**.xml"/></bean>
- 配置sqlSessionFactory扫描的路径,我是com.oursnail.*.dao
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <property name="basePackage" value="com.oursnail.*.dao"/> <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/></bean>
至于为什么这么配,那么就要了解mybatis的运行机制了,这里贴一张图:
简而言之,首先构造SqlSessionFactory即会话工厂;再由会话工厂创建sqlSession即会话,操作数据库需要通过sqlSession进行;下面就是mybatis开始处理参数,形成映射返回对象。
9、在同目录下新建jdbc.properties:
driverClassName=com.mysql.jdbc.DrivervalidationQuery=SELECT 1jdbc_url=jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNulljdbc_username=rootjdbc_password=root
10、在同目录下新建spring-mvc.xml:
这部分功能是配置springMvc
<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans" xmlns:context="http://www.springframework.org/schema/context" xmlns:mvc="http://www.springframework.org/schema/mvc" 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-4.0.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-4.0.xsd"> <!--使用fastjson,返回json、字符串等--> <mvc:annotation-driven> <mvc:message-converters> <bean class="org.springframework.http.converter.StringHttpMessageConverter"/> <bean class="com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter"> <property name="supportedMediaTypes"> <list> <value>text/html;charset=UTF-8</value> <value>application/json;charset=UTF-8</value> </list> </property> </bean> </mvc:message-converters> </mvc:annotation-driven> <!--包扫描,注意路径--> <context:component-scan base-package="com.oursnail.*.web"> </context:component-scan> <!--开启注解扫描--> <mvc:annotation-driven/> <!--处理静态资源--> <mvc:default-servlet-handler/> <!--视图解析器--> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="viewClass" value="org.springframework.web.servlet.view.JstlView" /> <property name="prefix" value="/WEB-INF/views" /> <property name="suffix" value=".jsp" /> </bean></beans>
springMvc的工作原理大体是这样的:
- 用户发出请求
- springMvc的核心DispatcherServlet接受用户请求
- 寻找用户请求对应的处理器HandlerMapping
- 根据结果找到相应的controller
- controller层进行相应处理之后将结果封装到ModelAndView中再传给DispatcherServlet
- DispatcherServlet将结果传到页面上接受用户请求。
- 如图:
11、配置日志log4j.properties:
没什么可说的,都看得懂。
####################################### log4j配置相关说明#######################################%p 输出优先级,即DEBUG,INFO,WARN,ERROR,FATAL#%r 输出自应用启动到输出该log信息耗费的毫秒数#%c 输出所属的类目,通常就是所在类的全名#%t 输出产生该日志事件的线程名#%m 输出代码中指定的信息#%n 输出一个回车换行符,Windows平台为“\r\n”,Unix平台为“\n”#%d 输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式,比如:%d{yyyy MM dd HH:mm:ss,SSS},输出类似: 2002年10月18日 22:10:28,921#%l 输出日志事件的发生位置,包括类目名、发生的线程,以及在代码中的行数。举例:Testlog4.main(TestLog4.java:10)#log4j提供4种布局:#org.apache.log4j.HTMLLayout(以HTML表格形式布局)#org.apache.log4j.PatternLayout(可以灵活地指定布局模式),#org.apache.log4j.SimpleLayout(包含日志信息的级别和信息字符串),#org.apache.log4j.TTCCLayout(包含日志产生的时间、线程、类别等等信息#log4j中有五级logger 输出级别:#FATAL 0#ERROR 3#WARN 4#INFO 6#DEBUG 7####################################### log4j相关配置#######################################日志输出级别log4j.rootLogger=DEBUG,stdout,other#设置stdout的日志输出控制台log4j.appender.stdout=org.apache.log4j.ConsoleAppender#输出日志到控制台的方式,默认为System.outlog4j.appender.stdout.Target=System.out#设置使用灵活布局log4j.appender.stdout.layout=org.apache.log4j.PatternLayout#灵活定义输出格式log4j.appender.stdout.layout.ConversionPattern=[%p][%d{yyyy-MM-dd HH:mm:ss}] %l %m %n#设置other的日志输出控制台log4j.appender.other=org.apache.log4j.RollingFileAppender#设置other的输出日志log4j.appender.other.File=/work-attend/logs/log.txt#设置other的日志最大限制log4j.appender.other.MaxFileSize=1024KB#最多只保存20个备份文件log4j.appender.other.MaxBackupIndex=1000 #输出INFO级别以上的日志log4j.appender.other.Threshold=INFO#设置使用灵活布局log4j.appender.other.layout=org.apache.log4j.PatternLayout #灵活定义输出格式log4j.appender.other.layout.ConversionPattern=[%p][%d{yyyy-MM-dd HH:mm:ss}] %l %t %m %n ###显示SQL语句部分log4j.logger.com.mybatis=DEBUGlog4j.logger.com.mybatis.common.jdbc.SimpleDataSource=DEBUGlog4j.logger.com.mybatis.common.jdbc.ScriptRunner=DEBUGlog4j.logger.com.mybatis.sqlmap.engine.impl.SqlMapClientDelegate=DEBUGlog4j.logger.java.sql.Connection=DEBUGlog4j.logger.java.sql.Statement=DEBUGlog4j.logger.java.sql.PreparedStatement=DEBUGlog4j.logger.java.sql.ResultSet=DEBUG
12、web.xml:
这一部分的主要工作:配置编码过滤器、spring-cfg.xml和spring-mvc.xml被扫描启动、log4j被扫描。简而言之,就是web项目启动项和入口。
<?xml version="1.0" encoding="UTF-8"?><web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0"> <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:spring-cfg.xml</param-value> </context-param> <!-- 编码过滤器 --> <filter> <filter-name>encodingFilter</filter-name> <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> <async-supported>true</async-supported> <init-param> <param-name>encoding</param-name> <param-value>UTF-8</param-value> </init-param> </filter> <filter-mapping> <filter-name>encodingFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <!-- Spring监听器 --> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <!-- Spring MVC servlet --> <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-mvc.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> <async-supported>true</async-supported> </servlet> <servlet-mapping> <servlet-name>SpringMVC</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> <!--防止拦截器将静态资源也拦截掉--> <servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>/static/*</url-pattern> </servlet-mapping> <context-param> <param-name>log4jConfigLocation</param-name> <param-value>classpath:log4j.properties</param-value> </context-param></web-app>
13、框架整合得差不多,下面到数据库准备一张表进行测试吧。
CREATE TABLE `t_user` (`id` int NOT NULL AUTO_INCREMENT ,`name` varchar(255) NULL ,`age` int NULL ,PRIMARY KEY (`id`));
增加自动生成工具的配置generatorConfig.xml:
<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE generatorConfiguration PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN" "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd" ><generatorConfiguration> <!--路径自己改--> <!--classPathEntry:数据库的JDBC驱动 --> <classPathEntry location="D:\maven_repository\mysql\mysql-connector-java\5.1.34\mysql-connector-java-5.1.34.jar" /> <context id="MysqlTables" targetRuntime="MyBatis3"> <!-- 注意这里面的顺序确定的,不能随变更改 --> <!-- 自定义的分页插件 <plugin type="com.deppon.foss.module.helloworld.shared.PaginationPlugin"/> --> <!-- 可选的(0 or 1) --> <!-- 注释生成器 --> <commentGenerator> <!-- 是否去除自动生成的注释 true:是 : false:否 --> <property name="suppressAllComments" value="true" /> </commentGenerator> <!--连接的数据库、账号、密码都要改--> <!-- 必须的(1 required) --> <!--数据库连接的信息:驱动类、连接地址、用户名、密码 --> <jdbcConnection driverClass="com.mysql.jdbc.Driver" connectionURL="jdbc:mysql://localhost:3306/test" userId="root" password="root"> </jdbcConnection> <!-- 可选的(0 or 1) --> <!-- 类型转换器或者加类型解析器 --> <!-- 默认false,把JDBC DECIMAL 和 NUMERIC 类型解析为 Integer true,把JDBC DECIMAL 和 NUMERIC 类型解析为java.math.BigDecimal --> <javaTypeResolver> <property name="forceBigDecimals" value="false" /> </javaTypeResolver> <!--生成实体类,路径自己改--> <!-- 必须的(1 required) --> <!-- java模型生成器 --> <!-- targetProject:自动生成代码的位置 --> <javaModelGenerator targetPackage="com.oursnail.user.entity" targetProject="E:\码云\ssmuninty02\src\main\java" > <!-- TODO enableSubPackages:是否让schema作为包的后缀 --> <property name="enableSubPackages" value="true" /> <!-- 从数据库返回的值被清理前后的空格 --> <property name="trimStrings" value="true" /> </javaModelGenerator> <!--生成xml,路径自己改--> <!-- 必须的(1 required) --> <!-- map xml 生成器 --> <sqlMapGenerator targetPackage="com.oursnail.user.dao" targetProject="E:\码云\ssmuninty02\src\main\java"> <property name="enableSubPackages" value="true" /> </sqlMapGenerator> <!--生成接口,路径自己改--> <!-- 可选的(0 or 1) --> <!-- mapper 或者就是dao接口生成器 --> <javaClientGenerator targetPackage="com.oursnail.user.dao" targetProject="E:\码云\ssmuninty02\src\main\java" type="XMLMAPPER"> <property name="enableSubPackages" value="true" /> </javaClientGenerator> <!--指定表、生成类--> <!-- 必须的(1...N) --> <!-- pojo 实体生成器 --> <!-- tableName:用于自动生成代码的数据库表;domainObjectName:对应于数据库表的javaBean类名 --> <!-- schema即为数据库名 可不写 --> <table tableName="t_user" domainObjectName="User" enableInsert="true" enableCountByExample="false" enableUpdateByExample="false" enableDeleteByExample="false" enableSelectByExample="false" selectByExampleQueryId="false"> <!-- 忽略字段 可选的(0 or 1) --> <!-- <ignoreColumn column="is_use" /> --> <!--//无论字段是什么类型,生成的类属性都是varchar。 可选的(0 or 1) 测试无效 --> <!-- <columnOverride column="city_code" jdbcType="VARCHAR" /> --> </table> </context></generatorConfiguration>
配置自动生成具体步骤:
14、同上篇,写三个方法,分别测试页面显示、事务能否回滚、json返回是否正常。
UserServce接口写三个方法:
public interface UserService { List<User> showUsers(); void addUser(); User getUserById(int id);}
UserServiceImpl实现它:
在UserMapper中增加一个方法:
List<User> selectAll();
sql实现它:
<select id="selectAll" resultMap="BaseResultMap" >select<include refid="Base_Column_List" />from t_user</select>
好,下面就可以完整地实现UserServiceImpl,现在先正常插入一些数据,跑通之后再测试事务:
@Servicepublic class UserServiceImpl implements UserService{ @Autowired private UserMapper userMapper; @Override public List<User> showUsers() { return userMapper.selectAll(); } @Override public void addUser() { User user1 = new User(); user1.setName("张三"); user1.setAge(12); userMapper.insertSelective(user1); User user2 = new User(); user2.setName("李四"); user2.setAge(22); userMapper.insertSelective(user2); } @Override public User getUserById(int id) { return userMapper.selectByPrimaryKey(id); }}
我们看到userMapper报错了,其实这不是报错,只是检查时的一个错误,不影响运行,我们建议将它改为警告,快捷键是Alt+Enter:
controller中,先添加两用户试试:
@Controller@RequestMapping("user")public class UserController { @Autowired private UserService userService; @RequestMapping("addUser") public void addUser(){ userService.addUser(); }}
配置tomcat:
浏览器直接访问:http://localhost:8080/user/addUser 如果看到404页面,说明执行没有错误,查看数据库,是不是多了两条数据。
那么,此刻说明整合成功了百分之九十九。
15、测试
controller层新增几个方法:
@Controller@RequestMapping("user")public class UserController { @Autowired private UserService userService; //添加用户 @RequestMapping("addUser") public void addUser(){ userService.addUser(); } //展现所有用户 @RequestMapping("/users") public String showUsers(Model model){ List<User> users = userService.showUsers(); model.addAttribute("users",users); return "/users"; } //根据id获取用户,返回json @RequestMapping("/getUser/{id}") @ResponseBody public User getUser(@PathVariable int id){ User user = userService.getUserById(id); return user; }}
展示用户列表,需要在WEB-INF下面新建文件夹:views,这是我们在spring-mvc.xml中规定的前缀。
紧接着,新建users.jsp页面,注意,这个名字与controller中return的视图名字要一致:
<%@ page contentType="text/html;charset=UTF-8" language="java" %><%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %><html><head> <title>Title</title></head><body><c:forEach items="${users}" var="user"> id---${user.id}<br> name---${user.name}<br></c:forEach></body></html>
浏览器访问 http://localhost:8080/user/users 应该可以看到刚刚插入数据库的两条数据。
浏览器继续访问 http://localhost:8080/user/getUser/1 可以看到用户一的json数据信息
将addUser()改造:
@Override@Transactionalpublic void addUser() { User user1 = new User(); user1.setId(3); user1.setName("王二"); user1.setAge(32); userMapper.insertSelective(user1); User user2 = new User(); user2.setId(3); user2.setName("王二"); user2.setAge(32); userMapper.insertSelective(user2);}
我们可以看到重复插入id了,显然数据库会在插入第二个的时候报错,但是如果我们的事务配置正确,那么第一个用户不会插入成功,叫做回滚。
浏览器访问http://localhost:8080/user/addUser,页面报错,说不能重复插入相同id属于正常,关键看数据库有没有将第一条数据也插入了。
我经过实验,的确两条数据都不能插入的,所以事务配置成功。
至此,SSM配置成功!代码下载
- 5、SSM整合方式二--图文并茂详细版
- SSM详细 整合教程
- SSM整合方式之一
- SSM框架整合方式(二):XML配置文件代码
- SSM框架详细整合教程
- SSM框架详细整合教程
- SSM框架 -- 详细整合教程
- SSM框架整合(二)
- SSM框架(二)--Spring、SpringMVC和MyBatis整合(详细教程)
- ssm整合2(详细教程)
- SSM三大框架整合详细教程
- SSM三大框架整合详细教程
- SSM框架——详细整合教程
- SSM三大框架整合详细教程
- SSM框架的详细整合教程
- SSM框架——详细整合教程
- SSM框架——详细整合教程
- SSM框架——详细整合教程
- 跳台阶问题
- Android实战系列(三)---级联菜单
- H264 数据帧理解(转载总结)
- 本地Git服务器的搭建及使用
- OpenCV入门初体验
- 5、SSM整合方式二--图文并茂详细版
- Mysql悲观锁和乐观锁的总结与实践
- JavaScript面向对象编程——类(笔记)
- JavaWeb 学习总结
- Mybatis与JDBC批量插入MySQL数据库性能测试及解决方案
- onshape 做参考面等虚拟几何的装配和原点定位
- 结构体内存对齐以及基本数据类型夸平台大小
- BCM5482s 端接电阻PCB布局设计
- 简单图形验证码生成 代码解析