任务驱动 搭建SSM开发环境
本篇主要阐述(IntelliJ IDEA + Maven + Spring + Spring MVC + Mybatis)搭建
为什么想要搭建ssm?
近期正好自己有一个小的点子要实现,恰好这学期开了java web的课,也算是略懂一些,所以技术方案采用java做后端,使用ssm框架。前几天把需求简单分析了一下,喏,仅仅纸上谈兵对程序员来说可不是一个好的习惯,所以准备整合一下ssm框架,供后期编码做地基。
遇到的问题:
不得不说,百度的东西鱼龙混杂,看了几篇博客,最终都没能搭建一个完整的ssm环境。不是这有问题就是那有问题。一想到这里就气,不过气归气,想到可能以后也会有好多人也会像我一样遇到类似的情况,但又得不到一个有效的指导,往严重了说,可能就此 一个梦想成为大牛的童鞋就此陨落🤨,所以,我决定自己再坚持搞一搞,然后出一篇文章,希望未来可以帮助到需要帮助的童鞋。
本教程思路:
本文采用任务驱动方式来搭建ssm开发环境,这样可以更加清晰的了解整个流程,且目标性更强,使得整个流程更为连贯,方便理解。
任务:
使用ssm框架实现简单的用户信息的增删查改(数据库采用Mysql)
纸上得来终觉浅,说干就干:
1. 首先,在本地创建一个数据库名为SSM,然后在库中建张user表,具体如下:
1 -- ---------------------------- 2 -- Table structure for `user` 3 -- ---------------------------- 4 DROP TABLE IF EXISTS `user`; 5 CREATE TABLE `user` ( 6 `id` int(11) NOT NULL AUTO_INCREMENT, 7 `name` varchar(255) DEFAULT NULL, 8 `password` varchar(255) DEFAULT NULL, 9 PRIMARY KEY (`id`) 10 ) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;
如图,
那么,准备工作结束后,我们便开始正式的环境搭建。
2. 打开IDEA,点击创建新项目,如图
然后,按图中标注的序号选择Maven,并勾选“Create from archetype”,选择“ ................22-archetype-webapp”,最后Next,如图
然后填写Groupid和artifactid,如图
名词解释:
然后下一步,这里引用另一位博主的说法,我没做测试,大家可以做个参考
引用: 这里需要注在Properties中添加一个参数 archetypeCatalog=internal,不加这个参数,在maven生成骨架的时候将会非常慢,有时候直接卡住。来自网上的解释:archetypeCatalog表示插件使用的archetype元数据,不加这个参数时默认为remote,local,即中央仓库archetype元数据,由于中央仓库的archetype太多了所以导致很慢,指定internal来表示仅使用内部元数据。
我直接下一步,这里会让你输入项目名词和存储路径,用默认的就OK。
点击Finish,完成创建。
3. 创建完成后,默认的目录结构如图:
所以,我们需要重新编排一下项目的结构,更改后如下:
这里,各个文件夹及包的意义已经在图中做简要说明,若不理解,请自行学习。
至此,项目的基本框架已经搭建完成,接下来我们继续学习 使用maven来集成ssm框架。
4. 这里我们使用maven类管理jar包,和他们之间的依赖(自行了解maven相关知识),下面我们来编辑项目下的pom.xml文件
1 <?xml version="1.0" encoding="UTF-8"?> 2 3 <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"> 4 5 6 <modelVersion>4.0.0</modelVersion> 7 <packaging>war</packaging> 8 9 <name>SSMTest</name> 10 <groupId>com.xykj</groupId> 11 <artifactId>SSMTest</artifactId> 12 <version>1.0-SNAPSHOT</version> 13 14 <build> 15 <plugins> 16 <plugin> 17 <groupId>org.mortbay.jetty</groupId> 18 <artifactId>maven-jetty-plugin</artifactId> 19 <version>6.1.7</version> 20 <configuration> 21 <connectors> 22 <connector implementation="org.mortbay.jetty.nio.SelectChannelConnector"> 23 <port>8888</port> 24 <maxIdleTime>30000</maxIdleTime> 25 </connector> 26 </connectors> 27 <webAppSourceDirectory>${project.build.directory}/${pom.artifactId}-${pom.version}</webAppSourceDirectory> 28 <contextPath>/</contextPath> 29 </configuration> 30 </plugin> 31 </plugins> 32 </build> 33 34 35 <properties> 36 <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> 37 <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> 38 39 <!-- spring版本号 --> 40 <spring.version>4.2.5.RELEASE</spring.version> 41 42 <!-- mybatis版本号 --> 43 <mybatis.version>3.2.8</mybatis.version> 44 45 <!-- mysql驱动版本号 --> 46 <mysql-driver.version>5.1.29</mysql-driver.version> 47 48 <!-- log4j日志包版本号 --> 49 <!--<slf4j.version>1.7.18</slf4j.version>--> 50 <!--<log4j.version>1.2.17</log4j.version>--> 51 <!--暂时 用不到--> 52 </properties> 53 54 <dependencies> 55 <!--dependency> 56 <groupId>com.xykj</groupId> 57 <artifactId>[the artifact id of the block to be mounted]</artifactId> 58 <version>1.0-SNAPSHOT</version> 59 </dependency--> 60 61 <!-- 添加junit4依赖 --> 62 <dependency> 63 <groupId>junit</groupId> 64 <artifactId>junit</artifactId> 65 <version>4.11</version> 66 <!-- 指定范围,在测试时才会加载 --> 67 <scope>test</scope> 68 </dependency> 69 70 <!-- 添加spring核心依赖 --> 71 <dependency> 72 <groupId>org.springframework</groupId> 73 <artifactId>spring-core</artifactId> 74 <version>${spring.version}</version> 75 </dependency> 76 <dependency> 77 <groupId>org.springframework</groupId> 78 <artifactId>spring-web</artifactId> 79 <version>${spring.version}</version> 80 </dependency> 81 <dependency> 82 <groupId>org.springframework</groupId> 83 <artifactId>spring-oxm</artifactId> 84 <version>${spring.version}</version> 85 </dependency> 86 <dependency> 87 <groupId>org.springframework</groupId> 88 <artifactId>spring-tx</artifactId> 89 <version>${spring.version}</version> 90 </dependency> 91 <dependency> 92 <groupId>org.springframework</groupId> 93 <artifactId>spring-jdbc</artifactId> 94 <version>${spring.version}</version> 95 </dependency> 96 <dependency> 97 <groupId>org.springframework</groupId> 98 <artifactId>spring-webmvc</artifactId> 99 <version>${spring.version}</version> 100 </dependency> 101 <dependency> 102 <groupId>org.springframework</groupId> 103 <artifactId>spring-context</artifactId> 104 <version>${spring.version}</version> 105 </dependency> 106 <dependency> 107 <groupId>org.springframework</groupId> 108 <artifactId>spring-context-support</artifactId> 109 <version>${spring.version}</version> 110 </dependency> 111 <dependency> 112 <groupId>org.springframework</groupId> 113 <artifactId>spring-aop</artifactId> 114 <version>${spring.version}</version> 115 </dependency> 116 117 <dependency> 118 <groupId>org.springframework</groupId> 119 <artifactId>spring-test</artifactId> 120 <version>${spring.version}</version> 121 </dependency> 122 123 <!-- 添加mybatis依赖 --> 124 <dependency> 125 <groupId>org.mybatis</groupId> 126 <artifactId>mybatis</artifactId> 127 <version>${mybatis.version}</version> 128 </dependency> 129 130 <!-- 添加mybatis/spring整合包依赖 --> 131 <dependency> 132 <groupId>org.mybatis</groupId> 133 <artifactId>mybatis-spring</artifactId> 134 <version>1.2.2</version> 135 </dependency> 136 137 <!-- 添加mysql驱动依赖 --> 138 <dependency> 139 <groupId>mysql</groupId> 140 <artifactId>mysql-connector-java</artifactId> 141 <version>${mysql-driver.version}</version> 142 </dependency> 143 <!-- 添加数据库连接池依赖 --> 144 <dependency> 145 <groupId>commons-dbcp</groupId> 146 <artifactId>commons-dbcp</artifactId> 147 <version>1.2.2</version> 148 </dependency> 149 150 <!--添加jackson--> 151 <dependency> 152 <groupId>com.fasterxml.jackson.core</groupId> 153 <artifactId>jackson-databind</artifactId> 154 <version>2.7.0</version> 155 </dependency> 156 157 <dependency> 158 <groupId>commons-io</groupId> 159 <artifactId>commons-io</artifactId> 160 <version>1.3.2</version> 161 </dependency> 162 163 <dependency> 164 <groupId>commons-fileupload</groupId> 165 <artifactId>commons-fileupload</artifactId> 166 <version>1.2.1</version> 167 </dependency> 168 169 170 171 </dependencies>
以上,就是我们项目中用到的组件,只需要在<dependency>标签中引入maven就会自动帮我们引入并管理。
5. 接下来,我们在resource文件夹下,新建新建jdbc.properties文件,具体如下:
模板如下,相关参数,请自行更改:
driverClasss=com.mysql.jdbc.Driver jdbcUrl=jdbc:mysql://localhost:3306/SSM?useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull username=root password=admin #定义初始连接数 initialSize=0 #定义最大连接数 maxActive=20 #定义最大空闲 maxIdle=20 #定义最小空闲 minIdle=1 #定义最长等待时间 maxWait=60000
6. 紧接着,在resource文件夹下,继续新建spring-mvc.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: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-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/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd"> <!-- 自动扫描 @Controller--> <context:component-scan base-package="com.xykj.controller"/> <!--避免IE执行AJAX时,返回JSON出现下载文件 --> <bean id="mappingJacksonHttpMessageConverter" class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"> <property name="supportedMediaTypes"> <list> <value>text/html;charset=UTF-8</value> </list> </property> </bean> <!-- 启动SpringMVC的注解功能,完成请求和注解POJO的映射 --> <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"> <property name="messageConverters"> <list> <ref bean="mappingJacksonHttpMessageConverter"/> <!-- JSON转换器 --> </list> </property> </bean> <!-- 定义跳转的文件的前后缀 ,视图模式配置 --> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/WEB-INF/" /> <property name="suffix" value=".jsp"/> </bean> <!-- 文件上传配置 --> <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> <!-- 默认编码 --> <property name="defaultEncoding" value="UTF-8"/> <!-- 上传文件大小限制为31M,31*1024*1024 --> <property name="maxUploadSize" value="32505856"/> <!-- 内存中的最大值 --> <property name="maxInMemorySize" value="4096"/> </bean> </beans>
7. 继续在resource下,新建spring和mybatis整合所需的配置文件,名为spring-mybatis.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:tx="http://www.springframework.org/schema/tx" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd"> <!-- 开启组件扫描 --> <context:component-scan base-package="com.xykj.blog"/> <!-- 第一种方式:加载一个properties文件 --> <bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> <property name="location" value="classpath:jdbc.properties"/> </bean> <!-- 第二种方式:加载多个properties文件 <bean id="configProperties" class="org.springframework.beans.factory.config.PropertiesFactoryBean"> <property name="locations"> <list> <value>classpath:jdbc.properties</value> <value>classpath:common.properties</value> </list> </property> <property name="fileEncoding" value="UTF-8"/> </bean> <bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PreferencesPlaceholderConfigurer"> <property name="properties" ref="configProperties"/> </bean> --> <!-- 配置数据源 --> <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> <property name="driverClassName" value="${driverClasss}"/> <property name="url" value="${jdbcUrl}"/> <property name="username" value="${username}"/> <property name="password" value="${password}"/> <!-- 初始化连接大小 --> <property name="initialSize" value="${initialSize}"></property> <!-- 连接池最大数量 --> <property name="maxActive" value="${maxActive}"></property> <!-- 连接池最大空闲 --> <property name="maxIdle" value="${maxIdle}"></property> <!-- 连接池最小空闲 --> <property name="minIdle" value="${minIdle}"></property> <!-- 获取连接最大等待时间 --> <property name="maxWait" value="${maxWait}"></property> </bean> <!-- mybatis和spring完美整合,不需要mybatis的配置映射文件 --> <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="dataSource" ref="dataSource"/> <!-- 自动扫描mapping.xml文件 --> <property name="mapperLocations" value="classpath:sql/*.xml"></property> </bean> <!-- DAO接口所在包名,Spring会自动查找其下的类 --> <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <property name="basePackage" value="com.xykj.dao"/> <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"></property> </bean> <!-- (事务管理)transaction manager, use JtaTransactionManager for global tx --> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource"/> </bean> <!-- (事务管理)transaction manager, use JtaTransactionManager for global tx --> <tx:annotation-driven transaction-manager="transactionManager"/> </beans>
8. web.xml配置,如下:
<?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"> <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:spring-mybatis.xml</param-value> </context-param> <!-- 编码过滤器 --> <filter> <filter-name>encodingFilter</filter-name> <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> <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内存溢出监听器,比如quartz --> <!-- 话说这个我也不知道干嘛的 --> <listener> <listener-class>org.springframework.web.util.IntrospectorCleanupListener</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> <!-- 此处也可以配置成 *.do 形式 --> <url-pattern>/</url-pattern> </servlet-mapping> <welcome-file-list> <welcome-file>/index.jsp</welcome-file> </welcome-file-list> <!-- session配置 --> <session-config> <session-timeout>15</session-timeout> </session-config> </web-app>
忘记上这张图,进入File -> Project Structure,把对应文件夹,修改成,我这个样子:
9. 配置tomcat,步骤如下:
然后,点击窗口左上角➕,配置一个本地tomcat server
选择第一个,跳转到如下界面,点击OK。
10. tomcat配置完成后,在entity包下新建一个User实体类,如下:
User类代码:
package com.xykj.entity; import java.io.Serializable; public class User implements Serializable{ private int id; private String name; private String password; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } @Override public String toString() { return "User [id= " + id + " ,name= " + name + " ,password= " + password + " ]"; } }
接着,我们在dao包下新增一个接口,名为:UserDao
UserDao代码如下:
package com.xykj.dao; import com.xykj.entity.User; public interface UserDao { public User findByUserId(int id); }
然后,在resource下的sql包下新建一个UserMapper.xml文件,具体如下:
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.xykj.dao.UserDao"> <select id="findByUserId" parameterType="int" resultType="com.xykj.entity.User"> SELECT * FROM user WHERE id = #{id} </select> </mapper>
好嘞,到这里,我们就可以简单的测试一下我们的增删查改功能了,当然,我们的例子是findByUserId,按id查询,那么我们先在数据库中增加一条记录。
然后,在test文件夹下新建一个测试类,名为TestUserDao,如图:
TestUserDao代码如下:
import com.xykj.dao.UserDao; import com.xykj.entity.User; import org.junit.Test; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; public class TestUserDao { ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring-mybatis.xml"); UserDao userDao = applicationContext.getBean(UserDao.class); @Test public void test1(){ User user = userDao.findByUserId(1); System.out.println(user); } }
这里,我们使用了Junit的单元测试,详情请自行了解。
运行test(),输出:
说明我们的mybatis和spring的整合已经完成。
11. 接下来我们继续测试spring及spring mvc
同样的方法,我们来编写service层及其单元测试
首先,在service包下,新建接口UserService,如下
代码为:
package com.xykj.service; import com.xykj.entity.User; import org.springframework.stereotype.Service; @Service public interface UserService { //查询User User queryUser(int id); }
然后,继续在service包下,新建一个该接口的实现类UserServiceImp,如下:
代码为:
package com.xykj.service; import com.xykj.dao.UserDao; import com.xykj.entity.User; import org.springframework.stereotype.Service; import javax.annotation.Resource; @Service public class UserServiceImp implements UserService { @Resource private UserDao userDao; public User queryUser(int id) { User user = userDao.findByUserId(id); return user; } }
到这里之后,我们在test目录下,新建测试类TestUserService,如下
代码为:
import com.xykj.entity.User; import com.xykj.service.UserService; import com.xykj.service.UserServiceImp; import org.junit.Test; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; public class TestUserService { ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring-mybatis.xml"); UserService userService = applicationContext.getBean(UserService.class); @Test public void test1(){ User user = userService.queryUser(1); System.out.println(user); } }
运行,得到如下结果,则成功,否则检查上述操作是否有误
👌,到了这步,其实我们的spring已经测试完成了。在这过程中,我们使用的注解和自动注入等spring功能都可正常使用。
12. 13
首先,我们在controller包下新建一个类,如图:
代码为:
package com.xykj.controller; import com.xykj.entity.User; import com.xykj.service.UserService; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.ResponseBody; import javax.annotation.Resource; @Controller @RequestMapping("/test") public class UserController { @Resource private UserService userService; @ResponseBody @RequestMapping(method = RequestMethod.GET) public User func(){ User user = userService.queryUser(1); return user; } }
👌,接下来我们在webapp目录下新建一个index.jsp文件(默认启动该页面),编写该页面测试UserController,进而测试spring mvc.
不过在这之前,请先将UserController的func()方法添加一个参数,更改如下:
index.jsp如下:
13. 最后,我们启动tomcat服务器,进行最后的测试:
输入1,点击提交
见到改返回,那么一切大功告成。
希望大家遇到什么问题,可以在留言区留言,有时间的话会第一时间给予解答😁