工作中每开始一个新项目就需要搭建项目基本框架,在此记录Java中搭建常见的SSM框架的基本步骤及注意事项,后续会跟进记录项目搭建完成后,使用代码生成器生成基础代码。
一、创建多模块的Maven项目
目前项目工程中主要使用maven进行项目管理,maven相关知识自行查找,在此简要介绍创建多模块Maven项目的步骤。
本文中项目主要包括三部分,父模块:pro-root,核心模块:pro-core;web模块:pro-webapp。
1.创建父模块
(1)在IDEA IDE中依次点击File->New->Project:
(2)新建项目中选择左侧Maven类型项目,由于此处我们新建的是父模块,所以右侧直接点击next即可,无需从archetype中创建,如下图所示:
(3)补全所需的工程相关信息:
(4)之后输入项目名,此处我们新建的项目名为:AmateurProject,后续的项目子模块则是在此项目下创建。
(5)至此,我们就创建好了一个普通的项目,由于此项目是作为整个项目的父模块,则可以将其src文件删除,创建成功后可在pro-root下创建子模块。
2.创建子模块:pro-core
(1)选中上节所创建的AmateurProject父项目,File->new->module,创建子模块:
(2)同创建parent模块一样,选择左侧maven项目,此pro-core模块主要包含项目中service、domain、utils,所以也无需从archetype中创建,直接点击next:
(3)填写ArtifactId项目名:pro-core。
(4)填写模块名称,此处与项目名一直即可:pro-core。
自此,子模块pro-core创建完成。
3.创建子模块:pro-webapp
(1)创建webapp模块即web项目模块,第一步骤与创建pro-core子模块相同。
(2)由于此子模块为创建web项目,则从maven框架中选择webapp模块,点击next。
(3)groupId和version继承自Parent project,这里只用填写ArtifactId:pro-webapp,next
(4)选择maven配置,此处是默认maven配置。
(5)填写模块名称,与前面设置的项目名称相同:pro-webapp。点击Finish。
最终项目结构如下:
4.项目测试
由于在pro-webapp项目中使用了pro-core中的接口和类,则在pro-webapp项目的pom文件中引入pro-core项目依赖:
<dependencies>
<dependency>
<groupId>com.mykelly</groupId>
<artifactId>pro-core</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
</dependencies>
在pro-core项目中创建方法:
public class UserInfoServiceImpl {
public List<UserInfo> getUserInfoList() {
List<UserInfo> userInfos = new ArrayList<UserInfo>();
UserInfo userInfo = new UserInfo();
userInfo.setId(1);
userInfo.setName("kelly");
userInfos.add(userInfo);
return userInfos;
}
}
在pro-webapp项目中调用,则在pro-webapp项目中创建main方法并调用UserInfoServiceImpl类。
public class IndexController {
public static void main(String[] args){
UserInfoServiceImpl userInfoService = new UserInfoServiceImpl();
List<UserInfo> userInfos = userInfoService.getUserInfoList();
for(UserInfo userInfo : userInfos){
System.out.println(userInfo.getName());
}
}
}
最后输出:kelly,则说明maven多模块项目创建成功。
后续spring框架搭建。
二、SSM框架搭建
SSM框架搭建完成后,项目目录结构如下:
spring相关配置文件有spring-app.xml、spring-mybatis.xml、spring-servlet.xml、spring-sqlmapper.xml。
1. 引入pom.xml文件
在pom文件中引入jar包依赖,pom.xml文件内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<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>
<packaging>war</packaging>
<name>amateurPro</name>
<groupId>com.my.kelly</groupId>
<artifactId>amateurPro</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<!-- 设置项目编码编码 -->
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<!-- spring版本号 -->
<spring.version>5.1.4.RELEASE</spring.version>
<!-- mybatis版本号 -->
<mybatis.version>3.5.0</mybatis.version>
</properties>
<dependencies>
<!-- java ee -->
<dependency>
<groupId>javax</groupId>
<artifactId>javaee-api</artifactId>
<version>7.0</version>
</dependency>
<!-- 单元测试 -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
<!-- 实现slf4j接口并整合 -->
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.2.2</version>
</dependency>
<!-- JSON -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.8.7</version>
</dependency>
<!-- 数据库 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.12</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.3.1</version>
</dependency>
<!-- Spring -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>${spring.version}</version>
</dependency>
<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-test</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>javax.servlet.jsp.jstl</groupId>
<artifactId>jstl-api</artifactId>
<version>1.2</version>
<exclusions>
<exclusion>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
</exclusion>
<exclusion>
<groupId>javax.servlet.jsp</groupId>
<artifactId>jsp-api</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.glassfish.web</groupId>
<artifactId>jstl-impl</artifactId>
<version>1.2</version>
<exclusions>
<exclusion>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
</exclusion>
<exclusion>
<groupId>javax.servlet.jsp</groupId>
<artifactId>jsp-api</artifactId>
</exclusion>
<exclusion>
<groupId>javax.servlet.jsp.jstl</groupId>
<artifactId>jstl-api</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-dbcp2</artifactId>
<version>2.5.0</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-pool2</artifactId>
<version>2.5.0</version>
</dependency>
</dependencies>
<build>
<finalName>AmateurProject</finalName>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<!-- 设置JDK版本 -->
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
</plugins>
</build>
</project>
2.spring-app.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:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:util="http://www.springframework.org/schema/util"
xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.1.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-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/util http://www.springframework.org/schema/util/spring-util-3.1.xsd">
<context:component-scan base-package="com.my.kelly" />
<import resource="spring-mybatis.xml" />
</beans>
3.spring-servlet.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:mvc="http://www.springframework.org/schema/mvc"
xmlns:util="http://www.springframework.org/schema/util"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.1.xsd
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
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.1.xsd
http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-4.0.xsd">
<context:component-scan base-package="com.my.kelly" />
<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>
4.spring-mybatis.xml
在此配置文件中,注意mysql使用的版本,若数据库连接连接不上注意可能是数据库连接依赖版本不一致
<?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-3.0.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.1.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.1.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd">
<bean id="dataSource" destroy-method="close" class="org.apache.commons.dbcp2.BasicDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost/*******"/>
<property name="username" value="*****"/>
<property name="password" value="******"/>
<property name="maxIdle" value="10"/>
<property name="minIdle" value="2"/>
<property name="timeBetweenEvictionRunsMillis" value="60000"/>
<property name="minEvictableIdleTimeMillis" value="180000"/>
<property name="testWhileIdle" value="true"/>
<property name="testOnBorrow" value="true"/>
<property name="testOnReturn" value="true"/>
<property name="validationQuery" value="select 1"/>
<property name="removeAbandonedTimeout" value="180"/>
</bean>
<!-- 配置事务管理器 -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<!-- 注入数据库连接池 -->
<property name="dataSource" ref="dataSource"/>
</bean>
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean" >
<property name="dataSource" ref="dataSource" />
<property name="configLocation" value="classpath:spring/spring-sqlmapper.xml" />
<property name="mapperLocations">
<value>classpath:mybatis/*.xml</value>
</property>
</bean>
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.my.kelly.dao" />
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory" />
</bean>
</beans>
5.spring-sqlmapper.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<typeAliases>
<package name="com.my.kelly.domain" />
</typeAliases>
</configuration>
6.web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
version="3.1">
<display-name>Amateur Project</display-name>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring/spring-app.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!-- 编码过滤器 -->
<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>
<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/spring-servlet.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>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
</welcome-file-list>
</web-app>
三、编写测试程序
1.UserInfo domain
public class UserInfo {
private Integer id;
private String name;
private String password;
public Integer getId() {
return id;
}
public void setId(Integer 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;
}
}
2.Controller class
@Controller
@RequestMapping("/")
public class IndexController {
@Autowired
private UserInfoService userInfoService;
@RequestMapping("/index")
public ModelAndView index(HttpServletRequest req, HttpServletResponse resp){
ModelAndView mv = new ModelAndView("/index");
List<UserInfo> userInfoList = userInfoService.getUserInfoList();
for (UserInfo userInfo:userInfoList) {
System.out.println(userInfo.getId());
}
return mv;
}
}
3. UserInfoService class
public interface UserInfoService {
List<UserInfo> getUserInfoList();
}
4.UserInfoServiceImpl class
@Service
public class UserInfoServiceImpl implements UserInfoService {
@Autowired
private UserInfoDao userInfoDao;
@Override
public List<UserInfo> getUserInfoList() {
List<UserInfo> userInfoList = userInfoDao.getUserInfoList();
return userInfoList;
}
}
5.UserInfoDao class
public interface UserInfoDao {
List<UserInfo> getUserInfoList();
}
6.UserInfoMapper.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.my.kelly.dao.UserInfoDao">
<select id="getUserInfoList" resultType="UserInfo">
SELECT * FROM userinfo
</select>
</mapper>
4.测试
编辑tomcat启动配置:
点击左侧➕,选择tomcat–>local
填写config_name,其他默认即可。
在第二个deployment选项中,点击➕,选择所要编译的项目即可。
启动上面配置的tomcat server,在浏览器中输入localhost:8080/projectname/index,若出现正确的前端页面并打印相应数据,则说明配置成功。