zoukankan      html  css  js  c++  java
  • SpringMVC-Mybatis-Maven项目整合

    上次不知道为什么,把写好的系列文章都搞成一样了。结果,五篇文章,都变成了最后一篇文章。

    悲剧,好吧,只好重新写了。

    这系列文章写的是SpringMVC-Mybatis-Maven项目整合。说白了,其实就是写一个用maven构造的SpringMVC与Mybatis的demo项目。

    既然是Maven项目,首先肯定看看pom.xml。

    在看pom.xml之前,请自行构架一个空的maven项目。

    然后打开我们的pom.xml文件。

    好了。我们先看看所需要的jar包吧。

    下面是maven的dependencies的截图,只需要在dependencies里面添加下面包就可以了。

    所需jar包_大叔

    看来,其实所需jar包也并不多。下面一个一个来分析。

    junit,就是junit包,测试用的,这个包一般在构建maven项目的时候会自动包含。

    spring-webmvc包,这个包,就是SpringMVC的包。似乎里面已经基本包含了SpringMVC所需的jar包了。

    mybatis-spring包是mybatis与spring结合的包,因为使用maven来构建的项目,所以会自动把mybatis相关的包也包含进来。

    aspectjweaver就是面向方面(面向切面)的包,虽然SpringMVC已经实现了aop面向方面,但是SpringMVC的aop也是基于这个包,所以必须导入。

    javax.servlet-api,这个servlet的api,不用说了,你懂的。

    mysql-connector-java是mysql的java驱动。

    commons-dbcp-all这个是连接池。

    cglib就是代理的包,通常aop都是通过代理来实现的。

    jstl就是jstl的包,因为项目里面,视图层用的是jstl。

    在这里,所需的jar包基本已经包含。

    上一章稍微说了SpringMVC-Mybatis-Maven项目整合项目所需要的jar包,但是关是jar包还是不行的。

    这章,我们看看项目的基本配置以及控制层吧。

    web项目基本配置,首先肯定得看看web.xml。在这里,我这里项目的web.xml是这样子的。

    ?
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    <!DOCTYPE web-app PUBLIC
     "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
    <web-app>
      <display-name>attg</display-name>
      <servlet>
            <servlet-name>spring</servlet-name>
            <servlet-class>
                org.springframework.web.servlet.DispatcherServlet
            </servlet-class>
            <init-param>
                <param-name>contextConfigLocation</param-name>
                <param-value>classpath*:*.xml</param-value>
            </init-param>
            <load-on-startup>1</load-on-startup>
        </servlet>
        <servlet-mapping>
            <servlet-name>spring</servlet-name>
            <url-pattern>*.do</url-pattern>
        </servlet-mapping>
    </web-app>

    大概的意思就是配置了org.springframework.web.servlet.DispatcherServlet这个spring自带的servlet来接受所有*.do的请求。

    而这个servlet的初始化参数,在classpath下面的xml文件中读取。这样子,项目启动的时候就会读取配置文件,来初始化spring自带servlet,让这个servlet来处理所有.do请求。

    好吧,然后我们在resource下面,新建一个spring-servlet.xml,这是初始化住servlet的配置文件。

    文件内容是:

    ?
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    <?xml version="1.0" encoding="UTF-8"?>  
        xsi:schemaLocation="
     
        <aop:aspectj-autoproxy/>
         
        <!-- enable component scanning (beware that this does not enable mapper scanning!)   --> 
        <context:component-scan base-package="me.idashu.attg" />
         
        <!-- enable autowire -->
        <context:annotation-config />
         
        <!-- 启动Spring MVC的注解功能,完成请求和注解POJO的映射 -->
        <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter" />
              
        <bean id="viewResolver"
            class="org.springframework.web.servlet.view.UrlBasedViewResolver">
            <property name="viewClass"
                value="org.springframework.web.servlet.view.JstlView" />
            <property name="prefix" value="/WEB-INF/jsp/" />
            <property name="suffix" value=".jsp" />
        </bean>
              
     </beans>

    <aop:aspectj-autoproxy/>就是关于aop的。

    <context:component-scan base-package="me.idashu.attg" />配置说明要扫瞄哪些包,因为这里是用全注解的方式配置的。

    <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter" /> 配置会是spring自动注入。

    <bean id="viewResolver"
    class="org.springframework.web.servlet.view.UrlBasedViewResolver">
    <property name="viewClass"
    value="org.springframework.web.servlet.view.JstlView" />
    <property name="prefix" value="/WEB-INF/jsp/" />
    <property name="suffix" value=".jsp" />
    </bean>

    这个viewResolver,就是配置视图层。在这里使用的是jstl的视图。然后视图的前缀是/WEB-INF/jsp/,而且后缀是jsp。

    配置这两个文件,SpringMVC就基本配置完,我们只需简单地新建一个controller,就可以处理请求了。

    基本配置_大叔

    controller里面,要用@Controller注解来告诉系统,这个类是一个controller类。

    然后@RequestMapping("/test")注解,就是告诉spring,这个方法,处理host/test.do的请求。

    最后方法里面返回了一个“test”,就是调用了test视图。因为配置文件里面视图设置了前后缀,所以这里视图应该是/WEB-INF/jsp/test.jsp。也就是说,要有一个这样子的文件,否则系统会报错。


    今天先接着上次项目整合来写。

    上次说到了怎么配置控制层。

    当我们配好了控制层,接着当然是配置我们的数据层了。

    而我们的数据层,就是由我们的Mybatis来构成的。

    上一次刚说完怎么来配置controller层,今天来看看怎么配置Mybatis。

    Mybatis的配置,写在src下面的applicationContext.xml文件里面。

    ?
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    <!-- 数据库连接池 -->
        <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
            <property name="driverClassName" value="com.mysql.jdbc.Driver" />
            <property name="url" value="jdbc:mysql://localhost:3306/test" />
            <property name="username" value="root" />
            <property name="password" value="" />
        </bean>
     
        <!-- transaction manager, use JtaTransactionManager for global tx -->
        <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
            <property name="dataSource" ref="dataSource" />
        </bean>
     
        <!-- enable transaction demarcation with annotations -->
        <tx:annotation-driven />
     
        <!-- define the SqlSessionFactory -->
        <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
            <property name="dataSource" ref="dataSource" />
            <property name="typeAliasesPackage" value="me.idashu.attg.domain" />
        </bean>
     
        <!-- scan for mappers and let them be autowired -->
        <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
            <property name="basePackage" value="me.idashu.attg.persistence" />
        </bean>

    首先配的,当然是我们的数据可连接池。也就是dataSource,这里用的mysql数据库。

    接下来下面几行,配置了transaction manager,也就是事务管理器。这里了事务是用注解的方式配置的。

    然后sqlSessionFactory,就是我们mybatis的配置,忘记叫了叫什么了。。。me.idashu.attg.domain就是说,我们的domain在这个包的下面。

    最后这里:

    ?
    1
    2
    3
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
            <property name="basePackage" value="me.idashu.attg.persistence" />
    </bean>

    就是说,我们的mybatis的mapper,是写在me.idashu.attg.persistence这个包的下面,而且,这些mapper会自动注入。

    就这样,mybatis的配置就完成了。

    上次说到配置Mybatis,可是,单单是配置Mybatis还是不行的,我们还要用Mybatis来开发。

    相信有Mybatis开发经验的人都知道,Mybatis开发时,我们需要编写mapper。

    今天我们来看看怎么使用Mybatis。

    还记得上次说到,我们的mybatis的mapper是写在me.idashu.attg.persistence这个包下面的,那么,mapper就下载这个下面吧。

    下看看我们的接口,我在me.idashu.attg.persistence这个包下面,新建了一个UserMapper接口:

    ?
    1
    2
    3
    4
    5
    6
    7
    8
    9
    public interface UserMapper {
         
        void insertUser(User user);
         
        void updateUser(User user);
         
        User getUser(User user);
     
    }

    这只是个接口,但是我们还要有具体的操作内容,所以,要在同一个包的下面,新建一个UserMapper.xml:

    ?
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    <mapper namespace="me.idashu.attg.persistence.UserMapper">
     
        <cache />
     
        <insert id="insertUser" parameterType="User">
            INSERT INTO
            user
            (
                username,
                password
            )
            VALUES
            (
            #{username},
            #{password}
            )
      </insert>
     
        <update id="updateUser" parameterType="User">
            update user set
            username = #{username},
            password = #{password}
            WHERE id = #{id}
      </update>
       
        <select id="getUser" parameterType="User" resultType="User">
            select * from user where id=#{id}
        </select>
         
    </mapper>

    这个xml文件,就是上面的那个接口的实现。这样子就可以把我们的mapper写好。

    然后我们看看service层。mapper操作数据层,而我们的事务,是service层。下面是service的截图:

    SpringMVC-Mybatis-Maven项目整合_大叔

    在service层的类中,用@Service来说明这个类是一个实体类,方便注入,然后

    ?
    1
    2
    @Autowired
    private UserMapper userMapper;

    就是为了注入刚才上面所写的mybatis的mapper。在下面,我们就可以直接使用接口定义的方法了。

    那么@Transactional(rollbackFor=Exception.class)这段代码的作用呢,就是定义了一个事物,这个事务是在update方法里面,如果这个方法抛出异常,那么就会rollback。

    如果要在controller层使用我们的service,直接注入就行了。好了,mybatis的配置也说完了。

    前面的四篇文章,基本上已经把SpringMVC-Mybatis-Maven项目整合说清楚了,只需按照前面四篇文章来说的那样子配置,基本上都可以把这项目跑起来。

    今天说说怎么在这个项目里面使用面向切面(AOP)吧。

    其实面向切面的编程可以说是面向对象编程的一种补充吧。这种编程方法,可以解决一些相同的重复的事情。

     

    在src下面新建me.idashu.attg.aop这个包。然后在包下,新建一个ControllerSelectorInterceptor类,写上下面代码:

    ?
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    @Aspect
    public class ControllerSelectorInterceptor {
         
        @Before("execution(* me.idashu.attg..*.*Controller.*Do(..,javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse))")
        public void doBefore(JoinPoint jp) {
            Object[] args = jp.getArgs();
            HttpServletRequest request = (HttpServletRequest) args[args.length-2];
            request.setAttribute("aop", "ok");
            System.out.println("before");
        }
     
         @After("execution(* me.idashu.attg..*.*Controller.*Do(..,javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse))")
         public void doAfter(JoinPoint jp) { 
            Object[] args = jp.getArgs();
            HttpServletRequest request = (HttpServletRequest) args[args.length-2];
            String aop = (String) request.getAttribute("aop");
            System.out.println("after "+aop);
         }
    }

    这样子,我们就配置好aop了。

    @Aspect这个注解,就是说,这个类是一个切面,也就是用来处理相同的事情的一个类。

    @Before("execution(* me.idashu.attg..*.*Controller.*Do(..,javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse))")这一句的意思就是在执行*Do()方法之前我要执行下面的doBefore方法。其实这里还有一些约束,就是这个*Do()方法,必须在me.idashu.attg这个包或者子包的下面,而且这个方法,在一个名叫*Controller的类里面。同时,这个方法的参数最后两个分别是javax.servlet.http.HttpServletRequest和javax.servlet.http.HttpServletResponse,也就是我们常用的request和response。

    我这里的代码,其实就是说,在执行*Do()方法之前,先执行doBefore()方法。在这方法里面,先获取request,然后再里面放入一个名叫aop的变量。然后再执行完这个方法折后,程序会执行doAfter()方法。先获取request,然后冲request中取出aop变量,这样子我们就可以看到这两个方法有没有正确执行了。

    好了,在这里,SpringMVC-Mybatis-Maven项目整合系列终于写完了,虽然水平确实不怎么样。但是希望对有兴趣的童鞋有点参考作用。

    项目源码地址:SpringMVC-Mybatis-Maven项目整合源码 


  • 相关阅读:
    python+opencv实现图像缩放
    vim 常用指令-持续更新
    python实现简单的SVM
    linux查看当前目录下,各文件夹大小
    python解析json文件信息到csv中
    根据小图文件名在原图画框
    BZOJ1079: [SCOI2008]着色方案 (记忆化搜索)
    BZOJ1044: [HAOI2008]木棍分割 (二分 + DP)
    gym100825G. Tray Bien(轮廓线DP)
    BZOJ1237: [SCOI2008]配对
  • 原文地址:https://www.cnblogs.com/daichangya/p/12958648.html
Copyright © 2011-2022 走看看