使用Spring、SpringMvc、MyBatis搭建SSM框架

SpringMvc架构流程图

使用Spring、SpringMvc、MyBatis搭建SSM框架_第1张图片

博客中使用到的jar文件 在文末Demo中会给出

1、带你一步步使用IntelliJ IDEA开发神器创建一个空白的Web Application项目 配置SSM web项目框架

使用Spring、SpringMvc、MyBatis搭建SSM框架_第2张图片

2、我们需要添加必要的jar(包括:Spring(包括SpringMvc)、MyBatis、MyBatis-Spring整合包、数据库驱动、第三方连接池)

在与src同级的目录下创建一个libs目录用来放.jar文件, 对于web项目感觉就是jar包一顿拷贝 粘贴。
jackson-annotations-2.4.0jackson-core-2.4.2jackson-databind-2.4.2返回json数据支持。
mysql-connector-java-5.1.7-bin 数据库驱动包。
log4j-1.2.17log4j-api-2.0-rc1log4j-core-2.0-rc1slf4j-api-1.7.5slf4j-log4j12-1.7.5 log4j 日志框架包。
依赖jar 如下图:右键Add As Library

使用Spring、SpringMvc、MyBatis搭建SSM框架_第3张图片

当 依赖jar包之后(或者移除一个jar包) 记得进入项目设置 查看依赖的jar是否需要添加至:artifact;只要点击Fix 选择第一个即可

使用Spring、SpringMvc、MyBatis搭建SSM框架_第4张图片

使用Spring MVC 实现文件上传遇到的问题以及解决方案

3、创建项目的目录结构 其中 controller、dao、pojo(简单的Java对象(Plain Old Java Object)、service 为必需的目录结构 其他的就看你自己创建了。

使用Spring、SpringMvc、MyBatis搭建SSM框架_第5张图片

4、接下来就是配置 配置 配置 创建一堆配置文件;在src同级目录下创建一个config目录专门用来存放配置文件。

这里需要将这个文件夹设为资源文件夹,在文件夹上右键如下操作:
使用Spring、SpringMvc、MyBatis搭建SSM框架_第6张图片

  • 首先配置Dao层:

    • MyBatis配置sqlMapConfig.xml 空文件即可 需要文件头
    
    <configuration>
    configuration>
    • 配置数据库连接 db.properties jdbc驱动 地址 用户名 密码
    jdbc.driver=com.mysql.jdbc.Driver
    jdbc.url=jdbc:mysql://192.168.0.3:3306/azhon?characterEncoding=utf-8
    jdbc.username=root
    jdbc.password=123456
    • 配置applicationContextDao.xml,让spring管理sql session factory 使用mybatis和spring整合包中的、配置Mapper扫描器
    
    <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" 
    xsi:schemaLocation="http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
    http://www.springframework.org/schema/context
    http://www.springframework.org/schema/context/spring-context-4.0.xsd">
    
    
    <context:property-placeholder location="classpath:db.properties" />
    
    
    <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
        <property name="driverClassName" value="${jdbc.driver}" />
        <property name="url" value="${jdbc.url}" />
        <property name="username" value="${jdbc.username}" />
        <property name="password" value="${jdbc.password}" />
        <property name="maxActive" value="10" />
        <property name="maxIdle" value="5" />
    bean>
    
    
    
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        
        <property name="dataSource" ref="dataSource" />
        
        <property name="configLocation" value="classpath:sqlMapConfig.xml" />
    bean>
    
    
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <property name="basePackage" value="com.azhon.dao" />
    bean>
    beans>
  • 配置Service层:

    • applicationContextService.xml 配置包扫描器,扫描@Service注解的类。
    
    <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" 
    xsi:schemaLocation="http://www.springframework.org/schema/beans 
    http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
    http://www.springframework.org/schema/context 
    http://www.springframework.org/schema/context/spring-context-4.0.xsd">
    
    
    <context:component-scan base-package="com.azhon.service" />
    beans>
    
    • applicationContextTrans.xml 配置事务
     
     <beans xmlns="http://www.springframework.org/schema/beans"
        xmlns:aop="http://www.springframework.org/schema/aop"
        xmlns:tx="http://www.springframework.org/schema/tx"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
        xsi:schemaLocation="http://www.springframework.org/schema/beans 
        http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
        http://www.springframework.org/schema/aop 
        http://www.springframework.org/schema/aop/spring-aop-4.0.xsd
        http://www.springframework.org/schema/tx
        http://www.springframework.org/schema/tx/spring-tx-4.0.xsd">
    
        
        <bean id="transactionManager"
            class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
            
            <property name="dataSource" ref="dataSource" />
        bean>
    
        
        <tx:advice id="txAdvice" transaction-manager="transactionManager">
            <tx:attributes>
                
                <tx:method name="save*" propagation="REQUIRED" />
                <tx:method name="insert*" propagation="REQUIRED" />
                <tx:method name="delete*" propagation="REQUIRED" />
                <tx:method name="update*" propagation="REQUIRED" />
                <tx:method name="find*" propagation="SUPPORTS" read-only="true" />
                <tx:method name="get*" propagation="SUPPORTS" read-only="true" />
            tx:attributes>
        tx:advice>
    
        
        <aop:config>
            <aop:advisor advice-ref="txAdvice" pointcut="execution(* com.azhon.service.*.*(..))" />
        aop:config>
    beans>
  • 配置表现层

    • springMvc.xml 自动配置最新版的处理器映射器和处理器适配器、配置@Controller注解扫描
    
    <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">
    
    
    <mvc:annotation-driven>
        
        <mvc:message-converters register-defaults="true">
            <bean class="org.springframework.http.converter.StringHttpMessageConverter">
                <constructor-arg value="UTF-8" />
            bean>
        mvc:message-converters>
    mvc:annotation-driven>
    
    
    
    <context:component-scan base-package="com.azhon.controller" />
    
    
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        
        
        <property name="prefix" value="/jsp/" />
        
        <property name="suffix" value=".jsp" />
    bean>
    beans>
    • 视图解析器 可以配置 也可以不配置、当你项目用的都是同一种文件类型的时候你可以配置 可以很方便的使用。当你同时用到了 .html .jsp文件的时候这个就没什么用了,所以我在项目中就直接注释了。
  • 配置log4j2.properties日志,更多的配置可以前往官网或者百度查找。

log4j.rootLogger=DEBUG, CONSOLE, FILE
## for console
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern=%5p [%t] - %m%n

5、来看下config的最终样子

使用Spring、SpringMvc、MyBatis搭建SSM框架_第7张图片

6、配置前端控制器web.xml 文件位于项目的/web/WEB-INF/


<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee 
    http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" 
    version="3.1">

    
    <servlet-mapping>
        <servlet-name>springMvcservlet-name>
        <url-pattern>/url-pattern>
    servlet-mapping>

    
    <servlet>
        <servlet-name>springMvcservlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServletservlet-class>
        <init-param>
            <param-name>contextConfigLocationparam-name>
            <param-value>classpath:springMvc.xmlparam-value>
        init-param>
        
        <load-on-startup>1load-on-startup>
    servlet>

    
    
    <servlet-mapping>
        <servlet-name>defaultservlet-name>
        <url-pattern>*.jpgurl-pattern>
    servlet-mapping>
    <servlet-mapping>
        <servlet-name>defaultservlet-name>
        <url-pattern>*.jsurl-pattern>
    servlet-mapping>
    <servlet-mapping>
        <servlet-name>defaultservlet-name>
        <url-pattern>*.cssurl-pattern>
    servlet-mapping>
    <servlet-mapping>
        <servlet-name>defaultservlet-name>
        <url-pattern>*.gifurl-pattern>
    servlet-mapping>
    <servlet-mapping>
        <servlet-name>defaultservlet-name>
        <url-pattern>*.pngurl-pattern>
    servlet-mapping>
    <servlet-mapping>
        <servlet-name>defaultservlet-name>
        <url-pattern>*.htmlurl-pattern>
    servlet-mapping>

    
    <context-param>
        <param-name>contextConfigLocationparam-name>
        <param-value>classpath:applicationContext*.xmlparam-value>
    context-param>
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListenerlistener-class>
    listener>

    
    <welcome-file-list>
        <welcome-file>login.htmlwelcome-file>
    welcome-file-list>

    
    <filter>
        <filter-name>characterEncodingFilterfilter-name>
        <filter-class>org.springframework.web.filter.CharacterEncodingFilterfilter-class>
        <init-param>
            <param-name>encodingparam-name>
            <param-value>UTF-8param-value>
        init-param>
        <init-param>
            <param-name>forceEncodingparam-name>
            <param-value>trueparam-value>
        init-param>
    filter>
    <filter-mapping>
        <filter-name>characterEncodingFilterfilter-name>
        <url-pattern>/*url-pattern>
    filter-mapping>

web-app>

在上面我配置了项目一启动的时候加载login.html这个文件(这是我在网上找的一个登录模版),你这里就可以在/web目录下随便创建一个空白的html文件或者jsp文件 替换就好了。

7、配置Tomcat服务器 我这里使用的是v7.0.82,如下图操作:

1、进入项目设置
使用Spring、SpringMvc、MyBatis搭建SSM框架_第8张图片
2、添加一个Tomcat
使用Spring、SpringMvc、MyBatis搭建SSM框架_第9张图片
3、在Application server处 配置本地Tomcat路径,点击Fix 然后 点击OK就添加成功了
使用Spring、SpringMvc、MyBatis搭建SSM框架_第10张图片

8、经过了上面一大堆的配置现在项目终于可以run起来了,点击下图的绿色三角 然后静静地等待就行了。

这里写图片描述
启动的效果图:

9、项目可以跑起来了 那就开始处理需求和逻辑了,这里我们来实现这个登录的功能 看下目录结构:

使用Spring、SpringMvc、MyBatis搭建SSM框架_第11张图片

10、首先通过数据库 MyBatis逆向工程生成 dao 和 pojo 层文件 (下面的jar文件 会在最后Demo下载中给出)

使用Spring、SpringMvc、MyBatis搭建SSM框架_第12张图片

  • 我的数据库表结构(sql文件Demo转会给出):

使用Spring、SpringMvc、MyBatis搭建SSM框架_第13张图片

  • generatorConfig.xml文件配置

<generatorConfiguration>
    <classPathEntry location="mysql-connector-java-5.1.25-bin.jar" />
    <context id="DB2Tables" targetRuntime="MyBatis3">
        <commentGenerator>
            <property name="suppressDate" value="true" />
            <property name="suppressAllComments" value="true" />
        commentGenerator>
        
        <jdbcConnection driverClass="com.mysql.jdbc.Driver"
            connectionURL="jdbc:mysql://地址:端口/数据库名字" userId="用户名"
            password="密码"/>
        <javaTypeResolver>
            <property name="forceBigDecimals" value="false" />
        javaTypeResolver>
        
        <javaModelGenerator targetPackage="com.azhon.pojo" targetProject="src">
            <property name="enableSubPackages" value="true" />
            <property name="trimStrings" value="true" />
        javaModelGenerator>
        
        <sqlMapGenerator targetPackage="com.azhon.dao" targetProject="src">
            <property name="enableSubPackages" value="true" />
        sqlMapGenerator>
        
        <javaClientGenerator type="XMLMAPPER" targetPackage="com.azhon.dao" targetProject="src">
            <property name="enableSubPackages" value="true" />
        javaClientGenerator>
        
        <table tableName="tb_member" domainObjectName="TbMember" enableCountByExample="true"
            enableUpdateByExample="true" enableDeleteByExample="true"
            enableSelectByExample="true" selectByExampleQueryId="true"/>
    context>
generatorConfiguration>

文件中有注释的地方都是需要修改的地方,执行如下命令进行文件生成:
在 cmd/Terminal 中进入到generatorConfig.xml文件夹目录下 执行如下命令:
Java -jar mybatis-generator-core-1.3.2.jar -configfile generatorConfig.xml -overwrite

11、现在就只剩Service和Controller中的代码编写了,那就先来写Service层:

  • Service层:

    • LoginService.java 定义一个接口 编写一个根据用户名 密码查询数据库的方法
    public interface LoginService {
    /**
     * 根据用户名 密码查询数据库
     *
     * @param tmName 用户名
     * @param tmPass 密码
     * @throws Exception
     */
    List findUserByName(String tmName, String tmPass) throws Exception;
    }
    • LoginServiceImpl.java 实现接口的方法,编写数据查询。千万别落了@Service注解
    @Service
    public class LoginServiceImpl implements LoginService {
    
            @Autowired
            TbMemberMapper tbMemberMapper;
    
            @Override
            public List findUserByName(String tmName, String tmPass) throws Exception {
                //添加查询条件
                TbMemberExample example = new TbMemberExample();
                TbMemberExample.Criteria criteria = example.or();
                criteria.andTmNameEqualTo(tmName);
                criteria.andTmPassEqualTo(tmPass);
                return tbMemberMapper.selectByExample(example);
            }
    }
  • Controller层:方法上的参数也就是 网页表单提交传输过来的参数 名字要一一对应

    • LoginController.java 处理用户请求,千万别落了@Controller注解
        @Controller
    public class LoginController {
    
            public final Logger logger = LogManager.getLogger(getClass());
    
            @Autowired
            public LoginService loginService;
    
            /**
             * 添加这个映射 这样输入 localhost:8080/login 就可以直接访问我们的登录页面
             *
             * @return 返回文件的路径
             */
            @RequestMapping("/login")
            public String login() {
                return "login.html";
            }
    
            @RequestMapping("/userlogin")
            public String userLogin(String username, String password) throws Exception {
                List members = loginService.findUserByName(username, password);
                if (members.size() > 0) {
                    logger.error(members.get(0).getTmName());
                    //返回登录成功的页面
                    return "/jsp/success.jsp";
                }
                //返回登录失败的页面
                return "/jsp/fail.jsp";
            }
    }

注意:当如果想返回一串JSON数据给用户时我们需要在方法上添加@ResponseBody注解,如下代码:

/**
 * 返回json数据
 *
 * @return 因为添加了jackson 支持 所以会自动转化为json数据
 */
@ResponseBody
@RequestMapping("/json")
public Map json() {
    Map result = new HashMap<>();
    result.put("code", 100);
    result.put("message", "请求成功");
    return result;
}
/**
 * @return 返回一个字符串
 * @see #login() 如果返回的是一个文件路径 (上面的登录方法) 那么视图解析器就会自动识别返回这个页面
 * 如果是字符串那就直接返回当前字符串
 */
@ResponseBody
@RequestMapping("/string")
public String string() {
    return "请求成功";
}

请求的效果图:
这里写图片描述

这里写图片描述

Demo下载隆重登场

好了写到这里 一个简单的SSM登录操作就完成了。

你可能感兴趣的:(Java,Web)