从大二开始就一直关注segmentFault,在问题专区帮忙回答一些自己知晓的问题;在写这篇文章之前我一直会在朋友圈发一些自己遇到的问题以及解决办法,这是第一次写文章,感觉有那么一点生疏。
这篇文章主要讲Maven搭建SSM(Spring、SpringMVC、Mybatis)项目,之前在学习搭建项目的时候看过很多相关的文章,虽然网上有许多类似的,但是我还是想写一写,分享一下自己在搭建项目中的体会。
一、什么是Maven?
Apache Maven is a software project management and comprehension tool. Based on the concept of a project object model (POM), Maven can manage a project's build, reporting and documentation from a central piece of information.
这个是官方给出来的解释,我个人理解为:Maven就是一个不需要手动导入依赖、项目打包和项目构建的工具,这个只是个人的观点,若有不对还请指教。
二、项目搭建
了解更多关于Maven知识,可以到官网了解Maven工具的功能和使用方法,在这里主要聊一聊怎么运用Maven搭建SSM项目。
Maven中重要的两个关键词:继承和聚合。
继承:作用就是避免配置重复,对于子项目来说应该关心父项目是怎么样配置的。
聚合:字面理解就是“聚在一起合作完成工作”,就是将子模块聚集起来完成相应的项目需求
1、父工程的搭建
项目结构:
在父工程中,主要负责完成依赖的版本管理,并不是实际的依赖。
第一步:创建父工程
Group Id:项目组织的唯一标识 com为域,后面一个为公司名称
Artifact Id:项目唯一标识,一般为项目名称
pom:为父工程打包类为pom,提供依赖版本管理
第二步:依赖管理
其中
<dependencyManagement></dependencyManagement>
是依赖管理,并不是实际依赖。
Maven插件也是同样的操作,需要注意的是:配置Maven插件maven-compiler-plugin<configuration>代表编译使用jdk1.8来完成,这两步操作完成父工程配置就已经完成。
2、聚合工程搭建
名称:聚合工程web-manager
此时聚合工程,应该和父工程建立依赖关系,才可以使用父工程里面管理的相应版本的依赖。
依赖关系添加以后,pom.xml文件中就会多出<parent>节点
完成了聚合工程的搭建,后面就要开始搭建子模块了,做好准备了吗?
3、子模块搭建(一)
名称:manager-mapper
该模块主要用来管理dao层,其中有pojo以及mapper接口和文件
子模块创建需要注意,创建时需要在聚合工程上点击右键->新建->Maven module
Next:
Next:
该步骤需要注意,该模块打包方式应该为jar,将该模块打成jar包就可以供其他模块使用
聚合项目工程中就会多出一个目录结构:
![图片上传中...]
3、子模块搭建(二)
名称:manager-service
该模块主要用来管理service层,其中有事务管理等
Todo:新建操作同上,都是需要打成jar包
注意:在Service层中,由于Service层需要依赖与dao层,所以需要在pom.xml中配置依赖关系
4、子模块搭建(三)
名称:manager-web
主要用于管理jsp界面以及其他配置文件
注意:项目打包不再是jar包,而是war包,其他配置一致.]
当创建完web模块,该模块会报错,错误如下:
错误解决办法:由于模块创建时,缺少WEB-INF/web.xml文件,只需要创建文件,问题就可以解决
此时,各种模块就创建完成,由于时间有限,在这里笼统的介绍一下,每一个模块里面都有pom.xml文件应该怎么样配置呢?其实这个问题是这样解决的,每一个模块,只需要在pom文件中添加该模块需要的依赖就可以,最重要的是:开始的时候提到,父工程主要用于管理依赖版本信息,在添加依赖是不需要填写版本信息,如下:
5、Spring和SpringMVC配置
范围:配置manager-web模块
目录结构:
web.xml配置:
<!-- Spring IOC配置 -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring-config/applicationContext.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
Spring MVC配置:
<servlet>
<servlet-name>spring</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>spring</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
SpringMVC配置
<!-- 包扫描-->
<context:component-scan base-package="com.web">
<context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
</context:component-scan>
<!-- 视图解析器 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/views/"></property>
<property name="suffix" value=".jsp"></property>
</bean>
<mvc:annotation-driven/>
Spring配置
<!-- 包扫描 -->
<context:component-scan base-package="com.web">
<context:exclude-filter type="annotation"
expression="org.springframework.stereotype.Controller" />
</context:component-scan>
<!-- 加载配置文件 -->
<context:property-placeholder location="classpath:properties/mysql.properties" />
<!-- 配置c3p0数据源 -->
<bean class="com.mchange.v2.c3p0.ComboPooledDataSource" id="dataSource">
<property name="driverClass" value="${driverClass}"></property>
<property name="jdbcUrl" value="${url}"></property>
<property name="user" value="${user}"></property>
<property name="password" value="${password}"></property>
</bean>
<!-- sqlSessionFactory -->
<bean class="org.mybatis.spring.SqlSessionFactoryBean" id="sqlSessionFactory">
<property name="dataSource" ref="dataSource"></property>
<property name="configLocation" value="classpath:mybatis/mybatis.xml"></property>
<property name="mapperLocations" value="classpath:mapper/*.xml"></property>
</bean>
<!-- mapper扫描 -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"></property>
<property name="basePackage" value="com.web.dao"></property>
</bean>
<!-- 事务配置 -->
<bean class="org.springframework.jdbc.datasource.DataSourceTransactionManager" id="transactionManager">
<property name="dataSource" ref="dataSource"></property>
</bean>
<tx:annotation-driven transaction-manager="transactionManager"/>
配置mybatis.xml
<configuration>
<settings>
<setting name="lazyLoadingEnabled" value="true" />
</settings>
</configuration>
Controller
package com.web.controller;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import com.web.service.PersonService;
@Controller
public class webController {
@Autowired
PersonService personService;
@GetMapping("/test.do")
public String get(){
System.out.println(personService.selectPersonList());
return "test";
}
}
运行项目:
http://localhost:8080/manager-web/index.jsp
效果:
恭喜!整合成功,现在就需要编写dao层和service层
5、Mapper
范围:配置manager-mapper模块
目录结构:
实体类:
package com.web.entity;
public class Person {
private int id;
private String name;
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 Person(int id, String name) {
this.id = id;
this.name = name;
}
public Person() {
}
@Override
public String toString() {
return "Person [id=" + id + ", name=" + name + "]";
}
}
Mapper接口:
package com.web.dao;
import java.util.List;
import com.web.entity.Person;
public interface PersonMapper {
public List<Person> selectPersonList();
}
5、Service
范围:配置manager-service模块
目录结构:
PersonService:
package com.web.service;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import com.web.dao.PersonMapper;
import com.web.entity.Person;
@Service
public class PersonService {
@Autowired
PersonMapper personMapper;
@Transactional
public List<Person> selectPersonList(){
return personMapper.selectPersonList();
}
}
最后测试结果为:
整合已经成功!由于第一次写文章,若有不正确的地方请大家多多指教,谢谢!
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。