Maven搭建SSM框架

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.Driver
jdbc.jdbcUrl=jdbc:mysql://127.0.0.1:3306/ssm_crud?useUnicode=true&characterEncoding=utf8
jdbc.user=root
jdbc.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

可参考:

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", "[email protected]", 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测试

可参考:

如下的分页测试:

@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);
        }
    }

}

参考

猜你喜欢

转载自blog.csdn.net/winfredzen/article/details/78447738