Maven搭建SSM框架

来源:互联网 发布:初中英语词汇软件 编辑:程序博客网 时间:2024/05/18 04:50

Maven搭建SSM框架

此笔记是在学习XXXSSM整合视频后的一般总结

Maven创建web项目

原来使用maven创建web项目,选择的是webapp模板,这里在创建Maven项目时,选中create a simple project(skip archetype selection)

1

此时的项目只是一个普通的java项目,需要把它变成一个web项目

然后右键项目,选中properties中,在Project Facets中,取消选中的Dynamic Web ModuleApply之后,再选中Dynamic Web Module,测试,选择如下的红色框所示:

2

弹出如下所示的输入框,在Content directory中输入src/main/webapp(表示生成的web.xml的位置),勾选上Generate web.xml deployment descriptor

3

创建好后,一个基本的web项目就成型了,也可能还需要对web.xml做一些响应的修改

pom.xml

创建好后,就需要导入jar包了,引入的jar包。需要引入的jar包包括:

1.Spring
2.SpringMVC
3.Mybatis
4.数据库连接池,驱动包
5.其它模块

  • jstl
  • servlet-api,注意其scopeprovided,表示服务器提供的有
  • junit,注意其scopetest
  • jackson,返回json数据用

6.其它可选的包,根据自己需求,导入的包,如

  • mybatis generator的包,自动生成mybatis相关的mapper和sql
  • mybatis的pagehelper,分页插件
  • spring-test包,用于测试
  • hibernate-validator,JSR303数据校验

一些注意点是:
1.在maven中依赖spring-webmvc后,会自动导入如下的包,所以就不用导入其它的包了,可参考spring核心框架体系结构(各个jar包作用),来了解各个jar包之间的依赖关系:

  • spring-webmvc
  • spring-aop
  • spring-beans
  • spring-context
  • spring-core
  • commons-logging
  • spring-expression
  • spring-web

pom.xml中导入的主要包如下:

    <properties>        <!-- spring版本号 -->        <spring.version>4.1.1.RELEASE</spring.version>        <!-- mybatis版本号 -->        <mybatis.version>3.4.2</mybatis.version>    </properties>    <dependencies>        <!-- Springmvc Spring的包 -->        <!-- https://mvnrepository.com/artifact/org.springframework/spring-webmvc -->        <dependency>            <groupId>org.springframework</groupId>            <artifactId>spring-webmvc</artifactId>            <version>${spring.version}</version>        </dependency>        <!-- Spring jdbc -->        <!-- https://mvnrepository.com/artifact/org.springframework/spring-jdbc -->        <dependency>            <groupId>org.springframework</groupId>            <artifactId>spring-jdbc</artifactId>            <version>${spring.version}</version>        </dependency>        <!-- Spring 面向切面编程 -->        <!-- https://mvnrepository.com/artifact/org.springframework/spring-aspects -->        <dependency>            <groupId>org.springframework</groupId>            <artifactId>spring-aspects</artifactId>            <version>${spring.version}</version>        </dependency>        <!-- Mybatis -->        <!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->        <dependency>            <groupId>org.mybatis</groupId>            <artifactId>mybatis</artifactId>            <version>${mybatis.version}</version>        </dependency>        <!-- Mybatis整合Spring的适配包 -->        <!-- https://mvnrepository.com/artifact/org.mybatis/mybatis-spring -->        <dependency>            <groupId>org.mybatis</groupId>            <artifactId>mybatis-spring</artifactId>            <version>1.3.1</version>        </dependency>        <!-- 数据库连接池 驱动的包 -->        <!-- https://mvnrepository.com/artifact/c3p0/c3p0 -->        <dependency>            <groupId>c3p0</groupId>            <artifactId>c3p0</artifactId>            <version>0.9.1</version>        </dependency>        <!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->        <dependency>            <groupId>mysql</groupId>            <artifactId>mysql-connector-java</artifactId>            <version>5.1.41</version>        </dependency>        <!-- jstl, servlet-api, junit -->        <!-- https://mvnrepository.com/artifact/jstl/jstl -->        <dependency>            <groupId>jstl</groupId>            <artifactId>jstl</artifactId>            <version>1.2</version>        </dependency>        <!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api -->        <dependency>            <groupId>javax.servlet</groupId>            <artifactId>javax.servlet-api</artifactId>            <version>3.0.1</version>            <scope>provided</scope>        </dependency>        <!-- https://mvnrepository.com/artifact/junit/junit -->        <dependency>            <groupId>junit</groupId>            <artifactId>junit</artifactId>            <version>4.12</version>            <scope>test</scope>        </dependency>        <!-- https://mvnrepository.com/artifact/org.mybatis.generator/mybatis-generator-core -->        <dependency>            <groupId>org.mybatis.generator</groupId>            <artifactId>mybatis-generator-core</artifactId>            <version>1.3.5</version>        </dependency>        <!-- spring测试模块 -->        <!-- https://mvnrepository.com/artifact/org.springframework/spring-test -->        <dependency>            <groupId>org.springframework</groupId>            <artifactId>spring-test</artifactId>            <version>${spring.version}</version>            <scope>test</scope>        </dependency>        <!-- 引入pageHelper分页插件 -->        <dependency>            <groupId>com.github.pagehelper</groupId>            <artifactId>pagehelper</artifactId>            <version>5.0.0</version>        </dependency>        <!-- Jackson返回json数据用 -->        <!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind -->        <dependency>            <groupId>com.fasterxml.jackson.core</groupId>            <artifactId>jackson-databind</artifactId>            <version>2.8.8</version>        </dependency>        <!-- JSR303数据校验支持 1.tomcat7以上的服务器,直接导入hibernate-validator即可 2.tomcat7以下的服务器,el表达式不是新的标准,所以额外的给服务器lib包中替换新的标准的el -->        <!-- https://mvnrepository.com/artifact/org.hibernate.validator/hibernate-validator -->        <dependency>            <groupId>org.hibernate.validator</groupId>            <artifactId>hibernate-validator</artifactId>            <version>6.0.2.Final</version>        </dependency>    </dependencies>

静态文件的处理

对于js、css,image等静态资源,可在webapp文件下,创建一个static文件夹,将所有的静态资源放在static文件夹下,如下:

4

配置文件

配置文件主要包括如下的几个部分:

  • web.xml的配置
  • Spring的配置
  • SpringMVC的配置
  • Mybatis的配置

web.xml的配置

web.xml的配置主要包括:

  1. 启动Spring的容器的配置,配置一个ContextLoaderListener,指定spring配置文件的位置
  2. 配置SpringMVC的前端控制器DispatcherServlet。其默认配置文件名为servlet的名字-servlet.xml,其默认的位置是位于WEB-INF文件夹下。但我们也可以指定SpringMVC配置文件的文件名和位置
  3. 字符编码过滤器
  4. 如果是使用REST风格的URI,配置HiddenHttpMethodFilter过滤器。如果想直接可以发送PUT请求,可配置一个HttpPutFormContentFilter过滤器

配置文件都位于src/main/resources下:

5

web.xml中的内容如下:

<?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_2_5.xsd"    id="WebApp_ID" version="2.5">    <!-- 1.启动Spring的容器 -->    <context-param>        <param-name>contextConfigLocation</param-name>        <param-value>classpath:applicationContext.xml</param-value>    </context-param>    <listener>        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>    </listener>    <!-- 2.SpringMVC的前端控制器 -->    <servlet>        <servlet-name>dispatcherServlet</servlet-name>        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>        <init-param>            <param-name>contextConfigLocation</param-name>            <param-value>classpath:dispatcherServlet-servlet.xml</param-value>        </init-param>        <load-on-startup>1</load-on-startup>    </servlet>    <servlet-mapping>        <servlet-name>dispatcherServlet</servlet-name>        <url-pattern>/</url-pattern>    </servlet-mapping>    <!-- 3.字符编码过滤器,一定放在所有过滤器之前 -->    <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>        <init-param>            <param-name>forceRequestEncoding</param-name>            <param-value>true</param-value>        </init-param>        <init-param>            <param-name>forceResponseEncoding</param-name>            <param-value>true</param-value>        </init-param>    </filter>    <filter-mapping>        <filter-name>encodingFilter</filter-name>        <url-pattern>/*</url-pattern>    </filter-mapping>    <!-- 4.使用Restful风格的URI,把post请求转为delete或put请求 -->    <filter>        <filter-name>HiddenHttpMethodFilter</filter-name>        <filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class>    </filter>    <filter-mapping>        <filter-name>HiddenHttpMethodFilter</filter-name>        <url-pattern>/*</url-pattern>    </filter-mapping>    <!-- HttpPutFormContentFilter 可直接发送put请求 -->    <filter>        <filter-name>HttpPutFormContentFilter</filter-name>        <filter-class>org.springframework.web.filter.HttpPutFormContentFilter</filter-class>    </filter>    <filter-mapping>        <filter-name>HttpPutFormContentFilter</filter-name>        <url-pattern>/*</url-pattern>    </filter-mapping></web-app>

SpringMVC的配置

SpringMVC的配置dispatcherServlet-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:context="http://www.springframework.org/schema/context"    xmlns:mvc="http://www.springframework.org/schema/mvc"    xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.1.xsd        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-4.2.xsd        http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.3.xsd">    <!-- SpringMVC的配置文件,包含网站跳转逻辑的控制,配置 -->    <!-- 只扫描控制器,需要把use-default-filters设置为false -->    <context:component-scan base-package="com.wz" use-default-filters="false">        <!-- 只扫描控制器 -->        <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>    <!-- 两个标准配置 -->    <!-- 将springmvc不能处理的资源交给tomcat -->    <mvc:default-servlet-handler/>    <!-- 能支持springmvc更高级的功能,比如JSR303校验,快捷的ajax..... -->    <mvc:annotation-driven/></beans>

Spring的配置

Spring的配置文件applicationContext.xml,包括:

1.数据源
2.事务控制
3.Mybatis的整合

  • mybatis配置文件的位置
  • mybatis的数据源
  • 指定mapper映射文件的位置
  • 扫描路径,即dao接口的位置

创建一个dbconfig.properties,包含数据源相关信息:

jdbc.driverClass=com.mysql.jdbc.Driverjdbc.jdbcUrl=jdbc:mysql://127.0.0.1:3306/ssm_crud?useUnicode=true&characterEncoding=utf8jdbc.user=rootjdbc.password=

applicationContext.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: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.xsd        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.1.xsd        http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.1.xsd        http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.1.xsd">    <!-- Spring的配置文件,主要配置和业务逻辑有关的 -->    <context:component-scan base-package="com.wz">        <!-- 不扫描控制器 -->        <context:exclude-filter type="annotation"            expression="org.springframework.stereotype.Controller" />    </context:component-scan>    <!-- 数据源 -->    <context:property-placeholder location="classpath:dbconfig.properties" />    <bean id="pooledDataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">        <property name="driverClass" value="${jdbc.driverClass}"></property>        <property name="jdbcUrl" value="${jdbc.jdbcUrl}"></property>        <property name="user" value="${jdbc.user}"></property>        <property name="password" value="${jdbc.password}"></property>    </bean>    <!-- 配置和Mybatis的整合 -->    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">        <property name="dataSource" ref="pooledDataSource"></property>        <!-- 指定mybatis全局配置文件的位置 -->        <property name="configLocation" value="classpath:mybatis-config.xml"></property>        <!-- 指定mybatis mapper文件 -->        <property name="mapperLocations" value="classpath:mapper/*.xml"></property>    </bean>    <!-- 配置扫描器,将mybatis接口的实现加入到ioc容器 -->    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">        <!-- 扫描所有dao接口的实现,加入到ioc容器 -->        <property name="basePackage" value="com.wz.crud.dao"></property>    </bean>    <!-- 配置一个批量插入的sqlSession 可选 -->    <bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate">        <constructor-arg name="sqlSessionFactory" ref="sqlSessionFactory"></constructor-arg>        <constructor-arg name="executorType" value="BATCH"></constructor-arg>    </bean>    <!-- 事务控制的配置 -->    <bean id="transactionManager"        class="org.springframework.jdbc.datasource.DataSourceTransactionManager">        <property name="dataSource" ref="pooledDataSource"></property>    </bean>    <!-- 开启基于注解的事务,使用xml配置形式的事务(主要使用的都是配置式) -->    <aop:config>        <!--切入点表达式 -->        <aop:pointcut expression="execution (* com.wz.crud.service..*(..))" id="txPoint" />        <!-- 配置事务增强 -->        <aop:advisor advice-ref="txAdvice" pointcut-ref="txPoint" />    </aop:config>    <!-- 配置事务增强,事务如何增强 -->    <tx:advice id="txAdvice" transaction-manager="transactionManager">        <tx:attributes>            <!-- 所有的方法都是事务方法 -->            <tx:method name="*" />            <!-- 以get开始的方法 -->            <tx:method name="get*"  read-only="true"/>        </tx:attributes>    </tx:advice></beans>

Mybatis配置

Mybatis的全局配置文件mybatis-config.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>    <settings>        <!-- 驼峰转换 -->        <setting name="mapUnderscoreToCamelCase" value="true" />    </settings>    <typeAliases>        <package name="com.wz.crud.bean" />    </typeAliases>    <!-- 在 MyBatis 配置 xml 中配置拦截器插件 可选 -->    <plugins>        <!-- com.github.pagehelper为PageHelper类所在包名 -->        <plugin interceptor="com.github.pagehelper.PageInterceptor">            <!-- 使用下面的方式配置参数,后面会有所有的参数介绍 -->            <!-- 分页合理化参数 -->            <property name="reasonable" value="true" />        </plugin>    </plugins></configuration>

测试

框架基本搭建起来后,就需要验证测试了。

官网Testing

可参考:

  • 使用 Spring 进行单元测试
  • Spring Test 整合 JUnit 4 使用总结

DAO测试

原来通常的方法是,加载IoC容器获取bean,但这样做还是比较麻烦的。Spring有一个测试框架,能够整合JUnit进行测试。
1.需要导入Spring Test ,在maven中添加依赖即可:

        <!-- spring测试模块 -->        <!-- https://mvnrepository.com/artifact/org.springframework/spring-test -->        <dependency>            <groupId>org.springframework</groupId>            <artifactId>spring-test</artifactId>            <version>${spring.version}</version>            <scope>test</scope>        </dependency>

2.配置测试类,添加如下的注解,指定spring配置文件的位置:

@RunWith(SpringJUnit4ClassRunner.class)@ContextConfiguration(locations = { "classpath:applicationContext.xml" })
  • @RunWith 注释标签是 Junit 提供的,用来说明此测试类的运行者,这里用了 SpringJUnit4ClassRunner,这个类是一个针对 Junit 运行环境的自定义扩展,用来标准化在 Spring 环境中 Junit4.5 的测试用例,例如支持的注释标签的标准化
  • @ContextConfiguration 注释标签是 Spring test context 提供的,用来指定 Spring 配置信息的来源,支持指定 XML 文件位置或者 Spring 配置类名,这里我们指定 classpath 下的 applicationContext.xml 为配置文件的位置

Mapper的测试如下:

@RunWith(SpringJUnit4ClassRunner.class)@ContextConfiguration(locations = { "classpath:applicationContext.xml" })public class MapperTest {    @Autowired    DepartmentMapper departmentMapper;    @Autowired    EmployeeMapper employeeMapper;    @Autowired    SqlSession sqlSession;// 批量的sqlSession    @Test    public void testCRUD() {        // ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");        // context.getBean(DepartmentMapper.class);        System.out.println(departmentMapper);        // 1.插入几个部门        // departmentMapper.insertSelective(new Department(null, "开发部"));        // departmentMapper.insertSelective(new Department(null, "测试部"));        // 2.插入几个员工        // employeeMapper.insertSelective(new Employee(null, "Jerry", "M", "jerry@163.com", 3));        // 批量插入        EmployeeMapper mapper = sqlSession.getMapper(EmployeeMapper.class);        for (int i = 0; i < 1000; i++) {            String uid = UUID.randomUUID().toString().substring(0, 5) + i;            mapper.insertSelective(new Employee(null, uid, "M", uid + "@163.com", 3));        }    }}

SpringMVC测试

可参考:

  • pring MVC测试框架详解——服务端测试
  • 基于Spring MVC做单元测试(一)——使用Spring Test框架

如下的分页测试:

@RunWith(SpringJUnit4ClassRunner.class)@WebAppConfiguration@ContextConfiguration(locations = { "classpath:applicationContext.xml",  "classpath:dispatcherServlet-servlet.xml"})public class MVCTest {    @Autowired    WebApplicationContext context;    //虚拟mvc请求,获得处理结果    MockMvc mockMvc;    @Before    public void initMockMVC() {        mockMvc = MockMvcBuilders.webAppContextSetup(context).build();    }    @Test    public void testPage() throws Exception{        MvcResult result = mockMvc.perform(MockMvcRequestBuilders.get("/emps").param("pn", "1")).andReturn();        MockHttpServletRequest request = result.getRequest();        PageInfo pi = (PageInfo) request.getAttribute("pageInfo");        System.out.println("当前页码:" + pi.getPageNum());        System.out.println("总页码:" + pi.getPages());        System.out.println("总记录数:" + pi.getTotal());        System.out.println("在页面连续显示的页码:");        int[] nums = pi.getNavigatepageNums();        for (int i : nums) {            System.out.print(" " + i);        }        List<Employee> list = pi.getList();        for (Employee employee : list) {            System.out.println(employee);        }    }}

参考

  • xxxSSM整合视频
原创粉丝点击