从零开始搭建SSM框架-详细

一、环境

jdk1.8

IntelliJ IDEA  

Spring版本号:

<spring.version>5.2.5.RELEASE</spring.version>

二、项目集成SpringMvc

2.1 创建项目

 

 

 2.2 引入依赖 并配置配置文件

<!-- spring  Mvc 依赖-->
    <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>

sping mvc 需要在web.xml配置Servlet

<?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" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
         xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
         id="WebApp_ID" version="3.0" metadata-complete="true">







  <!-- springMVC核心配置 -->
  <servlet>
    <servlet-name>dispatcherServlet</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
      <param-name>contextConfigLocation</param-name>
      <!--spingMVC的配置路径 -->
      <param-value>classpath:spring-mvc.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>
</web-app>
web.xml

注:如 DispatcherServlet报错,则可以引入servlet或者引入tomcat

 或者引入jar包

    <dependency>
      <groupId>javax.servlet</groupId>
      <artifactId>javax.servlet-api</artifactId>
      <version>4.0.0</version>
    </dependency>

 

 

 

然后在项目的resource spring-mvc.xml配置如下:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:p="http://www.springframework.org/schema/p"
       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-3.2.xsd
    http://www.springframework.org/schema/context
    http://www.springframework.org/schema/context/spring-context-3.2.xsd
    http://www.springframework.org/schema/mvc
    http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd">

    <!-- 扫描controller(controller层注入) -->
    <context:component-scan base-package="cn.wh.controller" use-default-filters="false">
        <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
    </context:component-scan>

    <!--注解驱动,以使得访问路径与方法的匹配可以通过注解配置-->
    <mvc:annotation-driven />


    <!-- 当在web.xml 中   DispatcherServlet使用 <url-pattern>/</url-pattern> 映射时,能映射静态资源 -->
    <!--    静态页面,如html,css,js,images可以访问-->
    <mvc:default-servlet-handler />
    <!-- 静态资源映射 -->
    <mvc:resources mapping="/static/**" location="/WEB-INF/static/"/>


    <!-- 对模型视图添加前后缀 -->
    <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"
          p:prefix="/WEB-INF/jsp/" p:suffix=".jsp"/>

<!--        另一种写法 -->
<!--    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">-->
<!--        <property name="viewClass"-->
<!--                  value="org.springframework.web.servlet.view.JstlView" />-->
<!--        <property name="prefix" value="/WEB-INF/jsp/" />-->
<!--        <property name="suffix" value=".jsp" />-->
<!--    </bean>-->

</beans>
spring-mvc.xml

2.3 测试

新建Controller后项目目录如下:

 

 Controller内容如下:

@Controller
@RequestMapping("/index")
public class IndexController {


    @RequestMapping("/test")
    @ResponseBody
    public String test(){
        return "测试ok";
    }
    @RequestMapping("/index")
    public String index(){
        return "index";
    }
}

配置Tomcat之后启动并访问

启动后请求,可以发现响应是乱码的。

参考这个链接确认IDE配置是UTF-8编码,如果访问

InteliJ IDEA解决乱码

然后访问如果依然乱码,

  1. web.xml添加字符过滤器
<!-- Spring字符集过滤器 -->
  <filter>
    <filter-name>SpringEncodingFilter</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>SpringEncodingFilter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>

如果依然乱码,则分为

1、页面乱码,则在页面添加设置编码标签

<%@ page contentType="text/html;charset=UTF-8" pageEncoding="UTF-8"%>
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title>测试测试测试</title>
</head>
<body>
<h2>测试页面!!Hello World!</h2>
</body>
</html>

2、如果json乱码,则配置json返回

可以查看下面的json配置,设置编码

2.4 配置项目返回json格式化

以下是spring4.2+ 用fastjson替换spring自带的json框架的配置
这里配置的,优先顺序为 string > json > html 可以更改配置调整顺序
<!--注册驱动-->
    <mvc:annotation-driven>

        <!-- 以下是spring4.2+ 用fastjson替换spring自带的json框架的配置 -->
        <mvc:message-converters register-defaults="true">
            <ref bean="stringHttpMessageConverter"/>
            <ref bean="fastJsonHttpMessageConverter"/>
        </mvc:message-converters>

    </mvc:annotation-driven>


    <bean id="stringHttpMessageConverter"
          class="org.springframework.http.converter.StringHttpMessageConverter">
        <constructor-arg value="UTF-8" index="0"/>
        <property name="supportedMediaTypes">
            <list>
                <value>text/plain;charset=UTF-8</value>
            </list>
        </property>
    </bean>

    <bean id="fastJsonHttpMessageConverter" class="com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter">
        <property name="supportedMediaTypes">
            <list>
                <value>application/json;charset=UTF-8</value>
                <value>text/html;charset=UTF-8</value>
            </list>
        </property>
        <property name="fastJsonConfig">
            <bean class="com.alibaba.fastjson.support.config.FastJsonConfig">
                <property name="features">
                    <list>
                        <value>AllowArbitraryCommas</value>
                        <value>AllowUnQuotedFieldNames</value>
                        <value>DisableCircularReferenceDetect</value>
                    </list>
                </property>
                <property name="dateFormat" value="yyyy-MM-dd HH:mm:ss"/>
            </bean>
        </property>
    </bean>

配置好的spring-mvc.xml如下:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:p="http://www.springframework.org/schema/p"
       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-3.2.xsd
    http://www.springframework.org/schema/context
    http://www.springframework.org/schema/context/spring-context-3.2.xsd
    http://www.springframework.org/schema/mvc
    http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd">

    <!-- 扫描controller(controller层注入) -->
    <context:component-scan base-package="cn.wh.controller" use-default-filters="false">
        <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
    </context:component-scan>

    <!--注解驱动,以使得访问路径与方法的匹配可以通过注解配置-->
    <mvc:annotation-driven />



    <!--注册驱动-->
    <mvc:annotation-driven>

        <!-- 以下是spring4.2+ 用fastjson替换spring自带的json框架的配置 -->
        <mvc:message-converters register-defaults="true">
            <ref bean="stringHttpMessageConverter"/>
            <ref bean="fastJsonHttpMessageConverter"/>
        </mvc:message-converters>

    </mvc:annotation-driven>


    <bean id="stringHttpMessageConverter"
          class="org.springframework.http.converter.StringHttpMessageConverter">
        <constructor-arg value="UTF-8" index="0"/>
        <property name="supportedMediaTypes">
            <list>
                <value>text/plain;charset=UTF-8</value>
            </list>
        </property>
    </bean>

    <bean id="fastJsonHttpMessageConverter" class="com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter">
        <property name="supportedMediaTypes">
            <list>
                <value>application/json;charset=UTF-8</value>
                <value>text/html;charset=UTF-8</value>
            </list>
        </property>
        <property name="fastJsonConfig">
            <bean class="com.alibaba.fastjson.support.config.FastJsonConfig">
                <property name="features">
                    <list>
                        <value>AllowArbitraryCommas</value>
                        <value>AllowUnQuotedFieldNames</value>
                        <value>DisableCircularReferenceDetect</value>
                    </list>
                </property>
                <property name="dateFormat" value="yyyy-MM-dd HH:mm:ss"/>
            </bean>
        </property>
    </bean>


    <!-- 当在web.xml 中   DispatcherServlet使用 <url-pattern>/</url-pattern> 映射时,能映射静态资源 -->
    <!--    静态页面,如html,css,js,images可以访问-->
    <mvc:default-servlet-handler />
    <!-- 静态资源映射 -->
    <mvc:resources mapping="/static/**" location="/WEB-INF/static/"/>


    <!-- 对模型视图添加前后缀 -->
    <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"
          p:prefix="/WEB-INF/jsp/" p:suffix=".jsp"/>

<!--        另一种写法 -->
<!--    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">-->
<!--        <property name="viewClass"-->
<!--                  value="org.springframework.web.servlet.view.JstlView" />-->
<!--        <property name="prefix" value="/WEB-INF/jsp/" />-->
<!--        <property name="suffix" value=".jsp" />-->
<!--    </bean>-->

</beans>
spring-mvc.xml

 可以看到SpringMvc依赖配置文件夹涉及如下:

 

 

三、项目集成Spring

3.1 引入依赖 并配置配置文件

web.xml添加监听器,监听SpringBean

  <!-- 读取spring配置文件 -->
  <context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>classpath:applicationContent.xml</param-value>
  </context-param>



  <listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
  </listener>

然后添加applicationContent.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:context="http://www.springframework.org/schema/context"
       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"
       xsi:schemaLocation="
        http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/tx
        http://www.springframework.org/schema/tx/spring-tx.xsd
        http://www.springframework.org/schema/aop
        http://www.springframework.org/schema/aop/spring-aop.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd">
    <!-- 自动加载构建bean -->
    <context:component-scan base-package="cn.wanghao"/>

</beans>
applicationContent.xml

 

3.2 新增Service与实现类,编写测试代码

 

 

@Controller
@RequestMapping("/index")
public class IndexController {


    @Autowired
    IIndexService indexService;

    @RequestMapping("/test")
    @ResponseBody
    public Object test(){
        ApplicationContext act = SpringBeanUtil.getApplicationContext();
        Map<String,String> map = new HashMap<>();
        map.put("测试ok","123");
        return map;
    }
    @RequestMapping("/index")
    public String index(){
        return "index";
    }
    @RequestMapping("/getBean")
    @ResponseBody
    public String getBean(){
        return indexService.say();
    }
}
Controller
@Service
public class IndexService implements IIndexService {


    public String say() {
        System.out.println("IndexService say");
        return "IndexService say";
    }
}
IndexService
public interface IIndexService {

    String say();
}
IIndexService

执行结果如下:

 

 由于Controller已经被Mvc扫描这里就不需要扫描Controller了,所以排除Controller的扫描

    <context:component-scan base-package="cn.wanghao">
        <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
    </context:component-scan>

 3.3 疑惑

本来我以为SpringMvc是独立的,如果要使用控制反转与依赖注入需要重新引入jar包,

后来试了不需要,然后看了依赖关系,SpringMvc 包里存在core和context以及aop

 3.4 总体依赖关系如下:

 四、项目集成MyBatis

4.1 项目依赖包与配置文件

4.1.1 添加项目依赖

    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-jdbc</artifactId>
      <version>${spring.version}</version>
    </dependency>

<!--Mysql数据库连接客户端-->
    <dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
      <version>5.1.48</version>
    </dependency>
    <!-- druid -->
    <dependency>
      <groupId>com.alibaba</groupId>
      <artifactId>druid</artifactId>
      <version>1.1.10</version>
    </dependency>



    <!-- mybatis -->
    <dependency>
      <groupId>org.mybatis</groupId>
      <artifactId>mybatis</artifactId>
      <version>3.4.6</version>
    </dependency>
    <!-- mybatis-spring -->
    <dependency>
      <groupId>org.mybatis</groupId>
      <artifactId>mybatis-spring</artifactId>
      <version>1.3.2</version>
    </dependency>

4.2.2 修改配置文件

修改applicationContent.xml,并新建spring-mybatis.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:context="http://www.springframework.org/schema/context"
       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"
       xsi:schemaLocation="
        http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/tx
        http://www.springframework.org/schema/tx/spring-tx.xsd
        http://www.springframework.org/schema/aop
        http://www.springframework.org/schema/aop/spring-aop.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd">


        <!-- 加载配置属性文件 -->
        <context:property-placeholder
                ignore-unresolvable="true" location="classpath:/config-dev.properties"/>

        <!-- 自动加载构建bean -->
        <context:component-scan base-package="cn.wanghao">
            <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
        </context:component-scan>
        <!-- 配置数据源 -->
        <bean id="dataSource"
              class="com.alibaba.druid.pool.DruidDataSource">
            <!--class="org.springframework.jdbc.datasource.DriverManagerDataSource">-->
            <property name="driverClassName" value="${jdbc.driver}"/>
            <property name="url" value="${jdbc.url}"/>
            <property name="username" value="${jdbc.username}"/>
            <property name="password" value="${jdbc.password}"/>
        </bean>
        <!-- 配置mybatis的sqlSessionFactory -->
        <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
            <property name="dataSource" ref="dataSource"/>
            <!-- 自动扫描mappers.xml文件 -->
            <property name="mapperLocations" value="classpath:/mappers/*.xml"/>
            <!-- mybatis配置文件 -->
            <property name="configLocation" value="classpath:/spring-mybatis.xml"/>
            <!-- 扫描entity包 使用别名 -->
            <property name="typeAliasesPackage" value="cn.wanghao.entity" />
        </bean>
        <!-- DAO接口所在包名,Spring会自动查找其下的类 -->
        <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
            <property name="basePackage" value="cn.wanghao.mapper"/>
            <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
        </bean>
        <!-- - - - - - - spring 声明式事务 - - - - - - - -->
        <bean id="transactionManager"
              class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
            <property name="dataSource" ref="dataSource"/>
        </bean>
        <!-- 注解方式配置事物 -->
        <tx:annotation-driven transaction-manager="transactionManager"/>
        <!--使用AOP注解-->
        <aop:aspectj-autoproxy/>
</beans>
applicationContent.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>
        <!-- 使用jdbc的getGeneratedKeys获取数据库自增主键值 -->
        <setting name="useGeneratedKeys" value="true" />

        <!-- 使用列别名替换列名 默认:true -->
        <setting name="useColumnLabel" value="true" />

        <!-- 开启驼峰命名转换:Table{create_time} -> Entity{createTime} -->
        <setting name="mapUnderscoreToCamelCase" value="true" />
    </settings>
</configuration>
spring-mybatis.xml

如果报错如下,则添加下面jar包

 

 

<dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-aspects</artifactId>
      <version>${spring.version}</version>
    </dependency>
View Code

 4.2 添加测试类

依次新建

@Repository
public interface IndexMapper {


    List<Map<String,String>> getAll();
}
IndexMapper
<?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.wanghao.mapper.IndexMapper" >

    <select id="getAll" resultType="java.util.Map">
        select * from user
    </select>
</mapper>
index.xml

修改Service调用

@Service
public class IndexService implements IIndexService {


    @Autowired
    IndexMapper indexMapper;

    public String say() {
        System.out.println("IndexService say");
        System.out.println(indexMapper.getAll());
        return "IndexService say";
    }
}
IndexService

执行结果为:

 

 

 

 五、集成log日志

5.1 引入配置文件

引入slfj

<!-- logback start -->
    <dependency>
      <groupId>org.slf4j</groupId>
      <artifactId>slf4j-api</artifactId>
      <version>1.7.21</version>
    </dependency>
    <dependency>
      <groupId>ch.qos.logback</groupId>
      <artifactId>logback-classic</artifactId>
      <version>1.1.7</version>
    </dependency>
    <dependency>
      <groupId>ch.qos.logback</groupId>
      <artifactId>logback-core</artifactId>
      <version>1.1.7</version>
    </dependency>
    <dependency>
      <groupId>org.logback-extensions</groupId>
      <artifactId>logback-ext-spring</artifactId>
      <version>0.1.4</version>
    </dependency>
    <dependency>
      <groupId>org.projectlombok</groupId>
      <artifactId>lombok</artifactId>
      <version>1.18.22</version>
      <optional>true</optional>
    </dependency>
    <!-- logback end -->

 

5.2 新建log配置文件

<?xml version="1.0" encoding="UTF-8"?>
<!--TRACE < DEBUG < INFO < WARN < ERROR-->
<configuration debug="false">
    <!--配置文件输出路径 -->
    <property name="LOG_HOME" value="/Users/wanghao/Downloads/logs/" />
    <!-- 控制台输出 -->
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>DEBUG</level>
        </filter>
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
        </encoder>
    </appender>
    <!-- 文件输出-->
    <!-- 按照每天生成日志文件 -->
    <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <!--日志文件输出的文件名-->
            <FileNamePattern>${LOG_HOME}/TestWeb.log.%d{yyyy-MM-dd}.%i.log</FileNamePattern>
            <!--日志文件保留天数-->
            <MaxHistory>30</MaxHistory>
            <maxFileSize>200MB</maxFileSize>
        </rollingPolicy>
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
            <charset>UTF-8</charset>
        </encoder>
    </appender>

    <!--other log configure-->
    <logger name="org.springframework" level="ERROR"/>
    <logger name="org.springframework" level="ERROR"/>


    <!-- 日志输出 开关/级别 -->
    <root level="TRACE">
        <appender-ref ref="STDOUT" />
        <appender-ref ref="FILE" />
    </root>
</configuration>
logback.xml

 

5.3 web.xml 监听日志

<!-- 添加日志监听器 -->
  <context-param>
    <param-name>logbackConfigLocation</param-name>
    <param-value>classpath:logback.xml</param-value>
  </context-param>
  <listener>
    <listener-class>ch.qos.logback.ext.spring.web.LogbackConfigListener</listener-class>
  </listener>

然后项目启动即可正常打印日志

 

posted @ 2021-11-02 16:22  苦心明  阅读(499)  评论(0)    收藏  举报