IDEA快速搭建SSM框架(新手必备)

823 阅读3分钟

第一步:新建MAVEN项目

第二步:搭建项目整体架构

项目结构分析:(和三层架构类似)

  1. .controller层:控制层,处理页面请求
  2. interceptor:拦截器
  3. mapper:后台持久层(相当于三层架构中的Dao层)
  4. pojo:实体类
  5. service:业务访问层
  6. resource:存放SSM中的配置文件,方便管理
  7. webapp-static:存放静态文件,js,css,images等
  8. WEB-INF-page:存放jsp页面
  9. test-java:junit单元测试

第三步: 配置maven: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/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>cn.testssm</groupId>
    <artifactId>TestSSM</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>war</packaging>
    <name>TestSSM Maven Webapp</name>
    <url>http://www.example.com</url>
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <maven.compiler.source>1.7</maven.compiler.source>
        <maven.compiler.target>1.7</maven.compiler.target>
        <!-- 设置项目编码编码 -->
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <!--版本控制-->
        <!-- spring版本号 -->
        <spring.version>5.0.2.RELEASE</spring.version>
        <!-- mybatis版本号 -->
        <mybatis.version>3.4.5</mybatis.version>
        <!--日志记录-->
        <slf4j.version>1.6.6</slf4j.version>
        <log4j.version>1.2.12</log4j.version>
        <!--mysql版本号-->
        <mysql.version>5.1.6</mysql.version>
    </properties>
    <!--导入项目jar包-->
    <dependencies>
        <!-- spring -->
        <dependency>
            <groupId>org.aspectj</groupId>
            <artifactId>aspectjweaver</artifactId>
            <version>1.6.8</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-aop</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-web</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <!--junitb版本必须>=4.1.2-->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-test</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-jdbc</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <!-- junit单元测试,test:只有在test环境下使用,compile全局使用-->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
        </dependency>
        <!-- mysql连接驱动-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>${mysql.version}</version>
        </dependency>
        <!-- servlet,jap支持 -->
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>servlet-api</artifactId>
            <version>2.5</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>javax.servlet.jsp</groupId>
            <artifactId>jsp-api</artifactId>
            <version>2.0</version>
            <scope>provided</scope>
        </dependency>
        <!--jstl标签库-->
        <dependency>
            <groupId>jstl</groupId>
            <artifactId>jstl</artifactId>
            <version>1.2</version>
        </dependency>
        <!-- log日志记录 -->
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>${log4j.version}</version>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>${slf4j.version}</version>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-log4j12</artifactId>
            <version>${slf4j.version}</version>
        </dependency>
        <!-- log end -->
        <!-- mybatis持久层-->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>${mybatis.version}</version>
        </dependency>
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis-spring</artifactId>
            <version>1.3.0</version>
        </dependency>
        <!--c3p0连接池-->
        <!--c3p0有自动回收空闲连接功能-->
        <dependency>
            <groupId>c3p0</groupId>
            <artifactId>c3p0</artifactId>
            <version>0.9.1.2</version>
            <type>jar</type>
            <scope>compile</scope>
        </dependency>
        <!-- jackson -->
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-core</artifactId>
            <version>2.9.8</version>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>2.9.8</version>
        </dependency>
        <!--文件上传-->
        <dependency>
            <groupId>commons-fileupload</groupId>
            <artifactId>commons-fileupload</artifactId>
            <version>1.3.1</version>
        </dependency>
        <dependency>
            <groupId>commons-io</groupId>
            <artifactId>commons-io</artifactId>
            <version>2.6</version>
        </dependency>
        <!--alibaba的fastjson解析数据-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.60</version>
        </dependency>
    </dependencies>
    <build>
        <finalName>TestSSM</finalName>
        <pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) -->
            <plugins>
                <plugin>
                    <artifactId>maven-clean-plugin</artifactId>
                    <version>3.1.0</version>
                </plugin>
                <!-- see http://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_war_packaging -->
                <plugin>
                    <artifactId>maven-resources-plugin</artifactId>
                    <version>3.0.2</version>
                </plugin>
                <plugin>
                    <artifactId>maven-compiler-plugin</artifactId>
                    <version>3.8.0</version>
                </plugin>
                <plugin>
                    <artifactId>maven-surefire-plugin</artifactId>
                    <version>2.22.1</version>
                </plugin>
                <plugin>
                    <artifactId>maven-war-plugin</artifactId>
                    <version>3.2.2</version>
                </plugin>
                <plugin>
                    <artifactId>maven-install-plugin</artifactId>
                    <version>2.5.2</version>
                </plugin>
                <plugin>
                    <artifactId>maven-deploy-plugin</artifactId>
                    <version>2.8.2</version>
                </plugin>
            </plugins>
        </pluginManagement>
        <!--防止静态文件不编译-->
        <resources>
            <resource>
                <directory>src/main/java</directory>
                <includes>
                    <include>**/*.xml</include>
                </includes>
            </resource>
            <resource>
                <directory>src/main/resources</directory>
                <includes>
                    <include>**/*.xml</include>
                    <include>**/*.properties</include>
                    <include>**/*.html</include>
                </includes>
            </resource>
        </resources>
    </build>
</project>

第四步:编写四大配置文件

一.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.xsd
    http://www.springframework.org/schema/aop
    http://www.springframework.org/schema/aop/spring-aop.xsd
    http://www.springframework.org/schema/tx
    http://www.springframework.org/schema/tx/spring-tx.xsd">
    <!-- 加载配置文件 *.properties -->
    <context:property-placeholder
            location="classpath:jdbcConfig.properties"/>
    <!--配置数据库 dataSource -->
    <bean id="dataSource"
          class="com.mchange.v2.c3p0.ComboPooledDataSource">
        <!-- 加载数据库用户名 -->
        <property name="driverClass" value="${jdbc.driver}"/>
        <!-- 加载数据库密码 -->
        <property name="jdbcUrl" value="${jdbc.url}"/>
        <!-- 加载数据库连接 -->
        <property name="user" value="${jdbc.username}"/>
        <!-- 加载数据库驱动 -->
        <property name="password" value="${jdbc.password}"/>
    </bean>
    <!-- 配置sqlsessioFactory -->
    <bean id="sqlSessionFactoryBean"
          class="org.mybatis.spring.SqlSessionFactoryBean">
        <!-- 配置数据源 引用(ref)dataSource(bean) -->
        <property name="dataSource" ref="dataSource"/>
        <!-- 加载mybatis 配置文件 -->
        <property name="configLocation"
                  value="classpath:mybatis.xml"/>
        <property name="mapperLocations" value="classpath:cn/test/mapper/*Mapper.xml"/>
    </bean>
    <!-- 配置扫描包 加载mapper代理对象 -->
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <!-- 扫描mapper路径 -->
        <property name="basePackage" value="cn.test.mapper"/>
        <property name="sqlSessionFactoryBeanName" value="sqlSessionFactoryBean"/>
    </bean>
    <!-- 扫描Service包 -->
    <context:component-scan
            base-package="cn.test.service"/>
    <!--配置spring声明式事务管理-->
    <!--配置事务管理器-->
    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource"></property>
    </bean>
    <!--配置事务通知-->
    <tx:advice id="txAdvice" transaction-manager="transactionManager">
        <tx:attributes>
            <!--所有find开头(查询)的方法设置只读-->
            <tx:method name="find*" read-only="true"/>
            <!--事务的隔离级别,默认default-->
            <tx:method name="*" isolation="DEFAULT"/>
        </tx:attributes>
    </tx:advice>
    <!--配置aop增强-->
    <aop:config>
        <aop:advisor advice-ref="txAdvice" pointcut="execution(* cn.test.service.impl.*.*(..))"></aop:advisor>
    </aop:config>
</beans>

二:mybatis.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>
        <!-- 是否开启二级缓存 默认为true -->
        <setting name="cacheEnabled" value="true"/>
        <!-- 是否懒加载 -->
        <setting name="lazyLoadingEnabled" value="true"/>
    </settings>
    <typeAliases>
        <!--批量配置别名-->
        <package name="cn.test.pojo"/>
    </typeAliases>
</configuration>

三: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: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.xsd
    http://www.springframework.org/schema/context
    http://www.springframework.org/schema/context/spring-context.xsd
    http://www.springframework.org/schema/mvc
    http://www.springframework.org/schema/mvc/spring-mvc.xsd">
    <!--1.注解扫描位置-->
    <context:component-scan base-package="cn.test.controller"/>
    <!--过滤静态资源-->
    <mvc:resources location="/static/" mapping="/static/**"></mvc:resources>
    <!--开启springmvc注解支持-->
    <mvc:annotation-driven></mvc:annotation-driven>
    <mvc:annotation-driven>
        <!-- 消息转换器 -->
        <mvc:message-converters register-defaults="true">
            <bean class="org.springframework.http.converter.StringHttpMessageConverter">
                <property name="supportedMediaTypes" value="text/plain;charset=UTF-8"/>
            </bean>
            <!-- 配置Fastjson支持 -->
            <bean class="com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter">
                <property name="supportedMediaTypes">
                    <list>
                        <value>text/html;charset=UTF-8</value>
                        <value>application/json</value>
                    </list>
                </property>
                <property name="features">
                    <list>
                        <value>WriteMapNullValue</value>
                        <value>QuoteFieldNames</value>
                    </list>
                </property>
            </bean>
        </mvc:message-converters>
    </mvc:annotation-driven>
    <mvc:default-servlet-handler/>
    <!--  拦截器,拦截所有/sys/下的请求-->
    <mvc:interceptors>
        <mvc:interceptor>
            <mvc:mapping path="/sys/**"/>
            <bean class="cn.test.interceptor.SysInterceptor"></bean>
        </mvc:interceptor>
    </mvc:interceptors>
</beans>

四:web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0" 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">
    <display-name>Archetype Created Web Application</display-name>
    <!--中文乱码,过滤器-->
    <filter>
        <filter-name>characterEncodingFilter</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>forceEncoding</param-name>
            <param-value>true</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>characterEncodingFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
    <!--设置配置文件路径-->
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <!--类路径下文件-->
        <param-value>classpath:applicationContext.xml</param-value>
    </context-param>
    <!--配置spring的监听器,默认只加载web-inf目录下的applicationcontext。xml文件-->
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>
    <!--配置前端核心控制器-->
    <servlet>
        <servlet-name>dispatcherServlet</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <!--加载springmvx。xml文件-->
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:spring-mvc.xml</param-value>
        </init-param>
        <!--启动服务器创建该servlet-->
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>dispatcherServlet</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>
    <welcome-file-list>
        <welcome-file>/WEB-INF/pages/login.jsp</welcome-file>
    </welcome-file-list>
</web-app>

第五步: jdbcConfig.properties

jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/ssm?useUnicode=true&characterEncoding=utf8
jdbc.username=root
jdbc.password=root

第六步: log4j.properties

# Set root category priority to INFO and its only appender to CONSOLE.
#log4j.rootCategory=INFO, CONSOLE            debug   info   warn error fatal
log4j.rootCategory=info, CONSOLE, LOGFILE
# Set the enterprise logger category to FATAL and its only appender to CONSOLE.
log4j.logger.org.apache.axis.enterprise=FATAL, CONSOLE
# CONSOLE is set to be a ConsoleAppender using a PatternLayout.
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern=%d{ISO8601} %-6r [%15.15t] %-5p %30.30c %x - %m\n
# LOGFILE is set to be a File appender using a PatternLayout.
log4j.appender.LOGFILE=org.apache.log4j.FileAppender
log4j.appender.LOGFILE.File=d:\axis.log
log4j.appender.LOGFILE.Append=true
log4j.appender.LOGFILE.layout=org.apache.log4j.PatternLayout
log4j.appender.LOGFILE.layout.ConversionPattern=%d{ISO8601} %-6r [%15.15t] %-5p %30.30c %x - %m\n

第七步:编写Junit单元测试

/**
 * 测试类
 */
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = "classpath:applicationContext.xml")
public class TestSSM {
    @Resource
    private ApplicationContext ac;
    @Test
    public void testUserLogin() {
        UserService userService = (UserService) ac.getBean("userService", UserService.class);
        User user = new User();
        user.setUserName("admin");
        user.setUserPassword("admin");
        Integer result = userService.userLogin(user);
        System.out.println(result);
        System.out.println("送悟空");
    }
}

测试框架整合

ok,框架基本上就是已将搭建完成了,下面创建的测试界面,看框架能否正常运行。

第一步:编写User实体类

package cn.test.pojo;
import java.io.Serializable;
public class User implements Serializable {
    private Integer id;
    private String userName;
    private String userPassword;
    public Integer getId() {
        return id;
    }
    public void setId(Integer id) {
        this.id = id;
    }
    public String getUserName() {
        return userName;
    }
    public void setUserName(String userName) {
        this.userName = userName;
    }
    public String getUserPassword() {
        return userPassword;
    }
    public void setUserPassword(String userPassword) {
        this.userPassword = userPassword;
    }
    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", userName='" + userName + '\'' +
                ", userPassword='" + userPassword + '\'' +
                '}';
    }
}

第二步: 编写持久层(mapper)

这里因为是刚学习ssm,所以将xml文件和接口放在了同一包下。

  1. UserMapper.java
    ```java package cn.test.mapper;
    import cn.test.pojo.User;
    public interface UserMapper {

    /**

    • 用户登录
    • @param user
    • @return */ public Integer userLogin(User user);

}

2. UserMapper.xml
   ```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="cn.test.mapper.UserMapper">
       <select id="userLogin" resultType="Integer" parameterType="user">
           SELECT COUNT(1) FROM user WHERE userName = #{userName} and userPassword = #{userPassword}
       </select>
   </mapper>

第三步:编写业务层(Service)

UserService.java

```java package cn.test.service;

import cn.test.pojo.User;

public interface UserService {

public Integer userLogin(User user);

}

2. UserServiceImpl.java
   ```java
   package cn.test.service.impl;
   import cn.test.mapper.UserMapper;
   import cn.test.pojo.User;
   import cn.test.service.UserService;
   import org.springframework.stereotype.Service;
   import javax.annotation.Resource;
   @Service("userService")
   public class UserServiceImpl implements UserService {
       @Resource
       private UserMapper userMapper;
       @Override
       public Integer userLogin(User user) {
           return userMapper.userLogin(user);
       }
   }

第四步:编写Controller

package cn.test.controller;
import cn.test.pojo.User;
import cn.test.service.UserService;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import javax.annotation.Resource;
import java.util.HashMap;
import java.util.Map;
@Controller
@RequestMapping("/userController")
public class UserController {
    @Resource
    private UserService userService;
    @RequestMapping("/userLogin")
    public String userLogin(User user) {
        System.out.println(user);
        Integer result = userService.userLogin(user);
        return "";
    }
    @RequestMapping("/testAjax")
    @ResponseBody
    public String testAjax(User user) {
        System.out.println(user);
        Map<String, User> map = new HashMap<String, User>();
        map.put("data", user);
        return JSONArray.toJSONString(map);
    }
}

第五步:jsp页面

<%--
  Created by IntelliJ IDEA.
  User: Dell
  Date: 2020/8/8
  Time: 21:23
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<form action="userController/userLogin" method="post">
    <div>
        <p>测试登录</p>
        <p>账号*</p>
        <p><input type="text" name="userName" required placeholder="请输入账号"/></p>
        <div id="login_password">
            <p>密码*</p>
            <p><input type="text" name="userPassword" required placeholder="请输入密码"/></p>
        </div>
        <p><input type="submit" name="login" value="登陆"/></p>
    </div>
</form>
<button type="button" value="测试ajax" id="btn">测试ajax</button>
<script src="${pageContext.request.contextPath}/static/js/jquery.min.js"></script>
<script>
    $(function () {
        $("#btn").click(function () {
            $.ajax({
                url: "userController/testAjax",
                type: "POST",
                data:
                    {userName: "张三", userPassword: "1234"},
                dataType: "json",
                success: function (res) {
                    var data = JSON.parse(res);
                    alert(res);
                    alert(data);
                    for (var key in data) {
                        alert(data[key].userName);
                    }
                }
            })
        })
    })
</script>
</body>
</html>

启动服务器,在浏览器地址输入http://localhost:8080/index.jsp

整合成功

新手可能会出现的问题,以下整理了解决方法:

  1. junit单元测试时提示:Can not find Class :cn.testssm.test 解决方案:因为开发工具使用的时idea,当初在建包时将java名称改成了test,重新改成java就好了

2.我使用的spring版本时5.0.2,spring5开始要求junit单元测试版本必须>=4.1.2

3.Error creating bean with name ‘org.springframework.web.servlet.mvc.method.anRequestMappingHandlerAda

4.jsp页面不识别el表达式
解决方案:在头部加入: isELIgnored=“false”

<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>

5.控制台输出中文乱码:

-Dfile.encoding=utf-8

解决方案:

end~