结缘一个基于java config的spring,mybatis和thymeleaf

工作到现在即将1年半了,一向未曾时间自己开班搭建个框架,那一个周末实际是无聊,真的不想打lol了,(肉色玫瑰开黑的喊我!),正好把以前埋下的坑填完.
你要求以下工具:
IDE : Intellij idea15
jdk : 1.7.0_59
maven : 3.2.2
tomcat : 7.0.54

  • new an empty project,相当于eclipse中的workspace
Paste\_Image.png
  • new a maven
    module,相当于eclipse中的project,拔取maven后一路next,设置自己的名称即可.
Paste\_Image.png
  • 在idea中配置maven,在preferences中将maven_home指向本地的设置路径即可.至于怎么安插maven_home环境,左转百度,右转google
Paste\_Image.png
  • 下边放上一张搭建好的工程结构图
Paste\_Image.png
  • 以下是负有应用的到的jar包器重. (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>com.sam</groupId>    
<artifactId>spring-mybatis</artifactId>    
<version>1.0-SNAPSHOT</version>    
<packaging>war</packaging>    
<properties>        
      <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>        
      <spring.version>4.1.6.RELEASE</spring.version>                  
      <cxf.version>2.7.15</cxf.version>        
      <aspectj.version>1.6.8</aspectj.version>        
      <slf4j-version>1.7.12</slf4j-version>
      <thymeleaf.version>2.1.3.RELEASE</thymeleaf.version>        
      <thymeleaf-layout.version>1.2.5</thymeleaf-layout.version>        
      <log4j-version>1.2.17</log4j-version>        
      <mybatis-version>3.3.0</mybatis-version>        
      <mybatis-spring-version>1.2.3</mybatis-spring-version> 
      <jackson.version>2.4.3</jackson.version>
      <json.version>1.9.13</json.version>            
      <diamond.version>0.0.18</diamond.version>    </properties>    
<dependencies>       
       <!-- 日志配置-->        
       <dependency>            
            <groupId>ch.qos.logback</groupId>   
            <artifactId>logback-classic</artifactId>      
            <version>1.0.13</version>        
       </dependency>        
       <dependency>            
            <groupId>org.slf4j</groupId> 
            <artifactId>slf4j-api</artifactId>    
            <version>${slf4j-version}</version>               
       </dependency>        
       <dependency>            
            <groupId>javax.servlet</groupId>           
            <artifactId>javax.servlet-api</artifactId>     
            <version>3.1.0</version>        
       </dependency>        
       <dependency>                   
            <groupId>org.apache.commons</groupId>            
            <artifactId>commons-lang3</artifactId>                
            <version>3.3</version>        
       </dependency>        
       <dependency>         
            <groupId>com.alibaba</groupId>     
            <artifactId>fastjson</artifactId>      
            <version>1.2.1</version>      
        </dependency>        
        <!-- 数据源配置 -->        
        <dependency>            
             <groupId>commons-dbcp</groupId>     
             <artifactId>commons-dbcp</artifactId>      
             <version>1.4</version>        
        </dependency>        
        <!--mysql-->        
        <dependency>            
             <groupId>mysql</groupId>          
             <artifactId>mysql-connector-java</artifactId>    
             <version>5.1.37</version>     
        </dependency>        
        <dependency>            
             <groupId>org.mybatis</groupId>   
             <artifactId>mybatis-spring</artifactId>           
             <version>${mybatis-spring-version}</version>  
        </dependency>        
        <dependency>            
             <groupId>org.mybatis</groupId>    
             <artifactId>mybatis</artifactId>       
             <version>${mybatis-version}</version>     
         </dependency>        
         <dependency> 
             <groupId>org.mybatis.generator</groupId>         
             <artifactId>mybatis-generator-core</artifactId>      
             <version>1.3.2</version>          
         </dependency>        
         <!-- spring用到的包 -->        
         <dependency>          
             <groupId>org.springframework</groupId>     
             <artifactId>spring-web</artifactId>            
             <version>${spring.version}</version>     
         </dependency>        
         <dependency>     
             <groupId>org.springframework</groupId> 
             <artifactId>spring-core</artifactId>            
             <version>${spring.version}</version>        
         </dependency>        
         <dependency>        
             <groupId>org.springframework</groupId>     
             <artifactId>spring-context</artifactId>            
             <version>4.1.1.RELEASE</version>  
         </dependency>        
         <dependency>            
             <groupId>org.springframework</groupId>          
             <artifactId>spring-beans</artifactId>            
             <version>${spring.version}</version>        
         </dependency>        
         <dependency>         
             <groupId>org.springframework</groupId>    
             <artifactId>spring-aop</artifactId>            
             <version>${spring.version}</version>        
         </dependency>        
         <dependency>          
             <groupId>org.springframework</groupId>         
             <artifactId>spring-jdbc</artifactId>            
             <version>${spring.version}</version>        
         </dependency>       
         <dependency>         
             <groupId>org.springframework</groupId>    
             <artifactId>spring-webmvc</artifactId>    
             <version>${spring.version}</version>       
         </dependency>        
         <dependency>          
             <groupId>org.springframework</groupId>         
             <artifactId>spring-tx</artifactId>            
             <version>${spring.version}</version>        
         </dependency>        
          <!--测试-->        
         <dependency>         
             <groupId>junit</groupId>    
             <artifactId>junit</artifactId>       
             <version>4.11</version>   
             <scope>test</scope>        
         </dependency>        
         <dependency>         
             <groupId>org.springframework</groupId>   
             <artifactId>spring-test</artifactId>            
             <version>4.1.1.RELEASE</version>          
             <scope>test</scope>     
         </dependency>        
         <dependency>       
             <groupId>javax</groupId>            
             <artifactId>javaee-api</artifactId>   
             <version>7.0</version>       
             <scope>provided</scope>       
         </dependency>        
         <!-- thymeleaf -->   
         <dependency>            
             <groupId>org.thymeleaf</groupId>      
             <artifactId>thymeleaf-spring4</artifactId>    
             <version>${thymeleaf.version}</version>   
             <exclusions>     
                  <exclusion>              
                  <groupId>org.slf4j</groupId>     
                  <artifactId>slf4j-api</artifactId>     
                  </exclusion>            
             </exclusions>        
         </dependency>        
         <dependency>           
             <groupId>nz.net.ultraq.thymeleaf</groupId>          
             <artifactId>thymeleaf-layout-dialect</artifactId> 
             <version>${thymeleaf-layout.version}</version>   
         </dependency>       
        <!--diamond-->     
        <dependency>      
              <groupId>com.github.bingoohuang</groupId>     
              <artifactId>diamond-sdk</artifactId>            
              <version>0.0.5</version>
        </dependency>        
        <dependency>         
              <groupId>com.github.bingoohuang</groupId>     
              <artifactId>diamond-client</artifactId>           
              <version>${diamond.version}</version>    
        </dependency>     
        <dependency>         
              <groupId>org.aspectj</groupId>  
              <artifactId>aspectjrt</artifactId>  
              <version>${aspectj.version}</version>     
       </dependency>        
       <dependency>           
            <groupId>org.aspectj</groupId>      
            <artifactId>aspectjweaver</artifactId>   
            <version>${aspectj.version}</version>   
       </dependency>        
       <!--jackson-->       
       <dependency>     
            <groupId>org.codehaus.jackson</groupId>     
            <artifactId>jackson-mapper-asl</artifactId>    
            <version>${json.version}</version>        
       </dependency>        
       <dependency>

            <groupId>org.codehaus.jackson</groupId>

            <artifactId>jackson-core-asl</artifactId>

            <version>${json.version}</version>

       </dependency>
       <dependency>          
            <groupId>com.fasterxml.jackson.core</groupId>          
            <artifactId>jackson-databind</artifactId>        
            <version>${jackson.version}</version>
      </dependency>
      <dependency>
            <groupId>commons-io</groupId>
            <artifactId>commons-io</artifactId>
            <version>2.4</version>
        </dependency>
        <dependency>
            <groupId>commons-fileupload</groupId>
            <artifactId>commons-fileupload</artifactId>
            <version>1.3</version>
        </dependency>
        <dependency>
            <groupId>commons-collections</groupId>
            <artifactId>commons-collections</artifactId>
            <version>3.2.1</version>
        </dependency>
    </dependencies>
        <build>
        <plugins>
            <plugin>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>2.3.2</version>
                <configuration>
                    <source>1.7</source>
                    <target>1.7</target>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>
  • 概念一个WebMvcConfig类完毕WebMvcConfigurer艾达pter

/**
 * 继承web mvc adapter
 * 包含通用的配置
 * Created by sam on 16/5/26.
 */
public class WebMvcConfig extends WebMvcConfigurerAdapter {

    //static resources
    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/css/**").addResourceLocations("/css/");
        registry.addResourceHandler("/img/**").addResourceLocations("/img/");
        registry.addResourceHandler("/js/**").addResourceLocations("/js/");
    }

    // 配置thymeleaf视图解析器,
    // 保留原有配置
    // 加入自定义参数 如${e.res()}
    @Bean
    public ThymeleafViewResolver thymeleafViewResolver() {
        ThymeleafViewResolver viewResolver = new ThymeleafViewResolver();
        viewResolver.setTemplateEngine(templateEngine());
        viewResolver.setCharacterEncoding("UTF-8");

        Map<String, Object> oldStaticVariables = viewResolver.getStaticVariables();
        Map<String, Object> staticVariables = Maps.newHashMap(oldStaticVariables);
        staticVariables.put("e", new SpringUtils());
        viewResolver.setStaticVariables(staticVariables);
        return viewResolver;
    }

    //配置模板引擎
    @Bean
    public SpringTemplateEngine templateEngine() {
        SpringTemplateEngine engine = new SpringTemplateEngine();
        engine.setTemplateResolver(templateResolver());
        engine.addDialect(new LayoutDialect());
        return engine;
    }

    //配置模板解析器
    @Bean
    public TemplateResolver templateResolver() {
        ClassLoaderTemplateResolver templateResolver;
        templateResolver = new ClassLoaderTemplateResolver();
        templateResolver.setTemplateMode("XHTML");
        templateResolver.setPrefix("views/");
        templateResolver.setCharacterEncoding("UTF-8");
        templateResolver.setSuffix(".html");
        templateResolver.setCacheable(false); // true by default
        return templateResolver;
    }

    //定义spring文件上传编码
    @Bean
    public CommonsMultipartResolver multipartResolver() {
        CommonsMultipartResolver multipartResolver = new CommonsMultipartResolver();
        multipartResolver.setDefaultEncoding("UTF-8");
        return multipartResolver;
    }

    //解析json返回数据
    @Override
    public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
        MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter();
        List<MediaType> mediaTypes = new ArrayList(converter.getSupportedMediaTypes());
        converter.setSupportedMediaTypes(mediaTypes);
        mediaTypes.addAll(asList(MediaType.TEXT_PLAIN, MediaType.TEXT_HTML, MediaType.TEXT_XML));
        converters.add(converter);
    }

    //配置diamond,如果本地没有配置diamond可以注释该段代码
    @Bean
    public DiamondSDK diamondSDK() {
        Minerable minerable = new Miner().getMiner("poet.diamond", "diamondConfig");
        DiamondSDK diamondSDK = new DiamondSDK(
                new DiamondSDKConf(
                        Lists.newArrayList(new DiamondConf(
                                minerable.getString("diamondIp"),
                                minerable.getInt("diamondPort"),
                                minerable.getString("diamondUsername"),
                                minerable.getString("diamondPassword")))));
        return diamondSDK;
    }

    //快捷定义ViewController
    @Override
    public void addViewControllers(ViewControllerRegistry registry) {
        registry.setOrder(Ordered.HIGHEST_PRECEDENCE);
    }
}
  • 概念实际应用到的spring mvc config

/**
 * 实际使用到的配置文件
 * 可以将该文件放入不同的工程来辨别使用不同的spring配置,如不同的interceptor
 * Created by sam on 16/5/26.
 */
@EnableWebMvc
@Configuration
@EnableAspectJAutoProxy
public class SpringMvcConfig extends WebMvcConfig {

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new SpringInterceptor());
    }
}
  • 以下是地点配置中选拔到的interceptor

/**
 * Created by sam on 16/5/26.
 */
@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
@Component
public class SpringInterceptor extends HandlerInterceptorAdapter {

    private Logger logger = LoggerFactory.getLogger(SpringInterceptor.class);

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        logger.debug("interceptor works --------- return true");
        return true;
    }
}
  • 注册DispatcherServlet

/**
 * 注册Spring DispatcherServlet
 * Created by sam on 16/5/26.
 */
public class SpringMvcInitializer extends AbstractAnnotationConfigDispatcherServletInitializer{

    //配置扫描根路径
    @Override
    protected Class<?>[] getRootConfigClasses() {
        return new Class[]{RootConfig.class};
    }

    @Override
    protected Class<?>[] getServletConfigClasses() {
        return new Class<?>[]{};
    }

    @Override
    protected String[] getServletMappings() {
        return new String[]{"/"};
    }

    @Override
    protected Filter[] getServletFilters() {
        CharacterEncodingFilter characterEncodingFilter = new CharacterEncodingFilter();
        characterEncodingFilter.setEncoding("UTF-8");
        characterEncodingFilter.setForceEncoding(true);
        return new Filter[]{characterEncodingFilter};
    }

    @Override
    protected void customizeRegistration(ServletRegistration.Dynamic registration) {
       registration.setInitParameter("throwExceptionIfNoHandlerFound", "true");
    }
}
  • 计划方面配置中的RootConfig,包罗陈设包的围观路径,配置mybatis要求的数据源等

/**
 * 定义扫描的根路径,数据源
 * Created by sam on 16/5/26.
 */
@Configuration
@ComponentScan(basePackages = "com.sam")
@MapperScan(basePackages = "com.sam")
public class RootConfig {

    private static String diver = "com.mysql.jdbc.Driver";

    private static String url = "jdbc:mysql://localhost:3306/YOUR_INSTANCE_NAME";

    private static String user = "YOUR_NAME";

    private static String pwd = "YOUR_PASSWORD";

    @Bean
    public BasicDataSource dataSource() {
        BasicDataSource dataSource = new BasicDataSource();
        dataSource.setDriverClassName(diver);
        dataSource.setUrl(url);
        dataSource.setUsername(user);
        dataSource.setPassword(pwd);
        return dataSource;
    }

    @Bean
    public DataSourceTransactionManager dataSourceTransactionManager() throws NamingException {
        return new DataSourceTransactionManager(dataSource());
    }

    @Bean
    public SqlSessionFactoryBean sqlSessionFactory(ApplicationContext ap) throws Exception {
        SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
        sessionFactory.setDataSource(dataSource());
        sessionFactory.setTypeAliasesPackage("com.sam");
        return sessionFactory;
    }
}
  • 概念SpringUtils类完毕thymeleaf中利用到的自定义参数,这一个布局写在WebMvcConfig中

/**
 * 配置thymeleaf自定义参数的相关方法
 * Created by sam on 16/5/26.
 */
public class SpringUtils {

    // 可以在html中使用${e.res('/')}
    // 将会自动代理到相关静态资源下面
    public static String res(String relativeResPath) {
        Minerable resConfig = new Miner().getMiner("poet.base", "res");

        String resVersion = resConfig.getString("version", "1");
        String baseResPath = resConfig.getString("prefix");
        if (baseResPath == null) throw new RuntimeException("prefix config is NULL.");

        return new StringBuilder(removeEnd(baseResPath, "/")).append("/").append(removeStart(relativeResPath, "/")).append("?v=").append(resVersion).toString();
    }
}
  • 定义helloWorldController来测试下

/** 
  * Created by sam on 16/5/26. 
  */
@Controller
@RequestMapping("/hello")
public class HelloWorldController {

    @Autowired
    UserDao userDao;

    private Logger logger = LoggerFactory.getLogger(HelloWorldController.class);

    @RequestMapping("/world")
    public String hello(Model model) {
        String email = "sam@balabala.com";
        String name = userDao.queryUserNameByEmail(email);
        User user = userDao.queryUserInfoByEmail(email);

        logger.debug("you have been here !");
        model.addAttribute("hello", "您好! " + name);
        model.addAttribute("world", "everything is " + user.getUserId());
        return "sam";
    }

    @RequestMapping("/test")
    public String test(Model model){
        logger.debug(">>>>>>>>我就测试下日志 debug  <<<<<<<<<");
        logger.info(">>>>>>>> 我就测试下日志 info   <<<<<<<<<");
        model.addAttribute("hello", "您好! test");
        model.addAttribute("world", "everything is id");
        return "sam";
    }
}
  • 在resources下建views夹子,sam.html如下

<html lang="en">
<head>
    <meta charset="UTF-8"/>
    <title>my first html</title>
</head>
<body>
<h1 data-th-text="${hello}"></h1>
<h1 data-th-text="${world}"></h1>
</body>
</html>
  • UserDao

/**
 * Created by sam on 16/5/29.
 */
@Service
public interface UserDao {

    @Select("select customer_name from customer where email= #{email}")
    String queryUserNameByEmail(@Param("email") String email);

    User queryUserInfoByEmail(@Param("email") String email);
}
  • User

/**
 * Created by sam on 16/5/29.
 */
public class User {

    private String userId;

    private String userName;

    private String email;

    //get set toString and so on;
}
  • 在你的MySQL中建一个Customer表(customer_id,customer_name,email)即可
  • 在resources下创设与dao相同包名的xml文件,在您的MySQL中建一个Customer表,包蕴customer_id,customer_name,email即可,

<?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="com.sam.dao.UserDao">
    <resultMap id="User" type="com.sam.domain.User">
        <id column="customer_id" property="userId" jdbcType="VARCHAR"/>
        <result column="customer_name" property="userName" jdbcType="VARCHAR"/>
        <result column="email" property="email" jdbcType="VARCHAR"/>
    </resultMap>

    <select id="queryUserInfoByEmail" resultMap="User" parameterType="java.lang.String">
        select customer_id,customer_name,email
        from customer
        where email= #{email,jdbcType=VARCHAR}
    </select>
</mapper>
网站地图xml地图