zoukankan      html  css  js  c++  java
  • Integrating Thymeleaf with Spring

    这个是基于注解的配置方式,基于配置文件的http://www.cnblogs.com/honger/p/6875148.html

    一、整体结构图

    二、web.xml文件,这里使用了注解的方式

    <?xml version="1.0" encoding="utf-8"?>
    
    <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" metadata-complete="true">
    
        <!-- Configure ContextLoaderListener to use AnnotationConfigWebApplicationContext
            instead of the default XmlWebApplicationContext -->
        <context-param>
            <param-name>contextClass</param-name>
            <param-value>
                org.springframework.web.context.support.AnnotationConfigWebApplicationContext
            </param-value>
        </context-param>
    
        <!-- Configuration locations must consist of one or more comma- or space-delimited
            fully-qualified @Configuration classes. Fully-qualified packages may also be
            specified for component-scanning -->
        <context-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>com.test.dao.configure.ApplicationConfigure</param-value>
        </context-param>
    
        <listener>
            <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
        </listener>
    
        <servlet>
            <servlet-name>springMVC</servlet-name>
            <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
            <!-- Configure DispatcherServlet to use AnnotationConfigWebApplicationContext
                instead of the default XmlWebApplicationContext -->
            <init-param>
                <param-name>contextClass</param-name>
                <param-value>
                    org.springframework.web.context.support.AnnotationConfigWebApplicationContext
                </param-value>
            </init-param>
            <!-- Again, config locations must consist of one or more comma-(逗号) or space-delimited(空格)
                and fully-qualified @Configuration classes -->
            <init-param>
                <param-name>contextConfigLocation</param-name>
                <param-value>com.test.mvc.configure.SpringWebConfig</param-value>
            </init-param>
            <load-on-startup>1</load-on-startup>
        </servlet>
        <servlet-mapping>
            <servlet-name>springMVC</servlet-name>
            <url-pattern>/</url-pattern>
        </servlet-mapping>
        <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>
    
    </web-app>

    三、SpringMVC注解配置文件

    package com.test.mvc.configure;
    
    import org.springframework.beans.BeansException;
    import org.springframework.context.ApplicationContext;
    import org.springframework.context.ApplicationContextAware;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.ComponentScan;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.context.annotation.FilterType;
    import org.springframework.context.support.ResourceBundleMessageSource;
    import org.springframework.format.FormatterRegistry;
    import org.springframework.web.servlet.config.annotation.EnableWebMvc;
    import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
    import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
    import org.thymeleaf.spring4.SpringTemplateEngine;
    import org.thymeleaf.spring4.templateresolver.SpringResourceTemplateResolver;
    import org.thymeleaf.spring4.view.ThymeleafViewResolver;
    import org.thymeleaf.templatemode.TemplateMode;
    
    import com.test.fomatter.MyDateFormatter;
    
     
    @Configuration
    @EnableWebMvc//<mvc:annotation-driven/>
    @ComponentScan(basePackages = { "com.test.controller" }, includeFilters = {
            @ComponentScan.Filter(type = FilterType.ANNOTATION, classes = {
                    org.springframework.stereotype.Controller.class }) })
    public class SpringWebConfig extends WebMvcConfigurerAdapter implements ApplicationContextAware {
        private ApplicationContext applicationContext;
    
        public SpringWebConfig() {
            super();
        }
    
        public void setApplicationContext(final ApplicationContext applicationContext) throws BeansException {
            this.applicationContext = applicationContext;
        }
    
        /* ******************************************************************* */
        /* GENERAL CONFIGURATION ARTIFACTS */
        /* Static Resources, i18n Messages, Formatters (Conversion Service) */
        /* 配置静态资源,i18n 信息, 格式转换器 */
        /* ******************************************************************* */
        @Override
        public void addResourceHandlers(final ResourceHandlerRegistry registry) {
            super.addResourceHandlers(registry);
            registry.addResourceHandler("/images/**").addResourceLocations("/WEB-INF/images/");
            registry.addResourceHandler("/css/**").addResourceLocations("/WEB-INF/css/");
            registry.addResourceHandler("/js/**").addResourceLocations("/WEB-INF/js/");
        }
    
        @Bean
        public ResourceBundleMessageSource messageSource() {
            ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource();
            // 设置国际化资源的baseName
            messageSource.setBasename("messages");
            return messageSource;
        }
    
        /**
         * 添加转换器
         */
        @Override
        public void addFormatters(final FormatterRegistry registry) {
            super.addFormatters(registry);
            registry.addFormatter(varietyFormatter());
        }
    
        @Bean
        public MyDateFormatter varietyFormatter() {
            return new MyDateFormatter("yyyy-MM-dd");
        }
    
        /* **************************************************************** */
        /* THYMELEAF-SPECIFIC ARTIFACTS */
        /* TemplateResolver <- TemplateEngine <- ViewResolver */
        /* **************************************************************** */
        /**
         * thymeleaf的模板解析器
         * 
         * @return
         */
        @Bean
        public SpringResourceTemplateResolver templateResolver() {
            // SpringResourceTemplateResolver automatically integrates with Spring's
            // own
            // resource resolution infrastructure, which is highly recommended.
            SpringResourceTemplateResolver templateResolver = new SpringResourceTemplateResolver();
            templateResolver.setApplicationContext(this.applicationContext);
    
            templateResolver.setPrefix("/WEB-INF/templates/");
    
            templateResolver.setSuffix(".html");
            // HTML is the default value, added here for the sake of clarity.
            // 模板解析模式使用HTML模式
            templateResolver.setTemplateMode(TemplateMode.HTML);
            // Template cache is true by default. Set to false if you want
            // templates to be automatically updated when modified.
            // 是否缓存模板,默认是true,不过在调试的时候最好是false,因为模板随时需要改变
            templateResolver.setCacheable(false);
            
            templateResolver.setCharacterEncoding("UTF-8");
            
            return templateResolver;
        }
    
        /**
         * thymeleaf的模板引擎
         * 
         * @return
         */
        @Bean
        public SpringTemplateEngine templateEngine() {
            // SpringTemplateEngine automatically applies SpringStandardDialect and
            // enables Spring's own MessageSource message resolution mechanisms.
            SpringTemplateEngine templateEngine = new SpringTemplateEngine();
            templateEngine.setTemplateResolver(templateResolver());
            // Enabling the SpringEL compiler with Spring 4.2.4 or newer can
            // speed up execution in most scenarios, but might be incompatible
            // with specific cases when expressions in one template are reused
            // across different data types, so this flag is "false" by default
            // for safer backwards compatibility.
            templateEngine.setEnableSpringELCompiler(true);
            return templateEngine;
        }
    
        /**
         * thymeleaf的视图解析器
         * 
         * @return
         */
        @Bean
        public ThymeleafViewResolver viewResolver() {
            ThymeleafViewResolver viewResolver = new ThymeleafViewResolver();
            viewResolver.setTemplateEngine(templateEngine());
            viewResolver.setCharacterEncoding("UTF-8");
            return viewResolver;
        }
    }

    四、spring注解配置类

    package com.test.dao.configure;
    
    import javax.sql.DataSource;
    
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.beans.factory.annotation.Value;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.ComponentScan;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.context.annotation.PropertySource;
    import org.springframework.core.env.Environment;
    import org.springframework.jdbc.datasource.DataSourceTransactionManager;
    
    import com.alibaba.druid.pool.DruidDataSource;
    
    @Configuration
    @ComponentScan(basePackages={"com.test.service"})
    @PropertySource("classpath:jdbc.properties")
    public class ApplicationConfigure {
        
        @Autowired
        Environment env;
        //配置数据源
        @Bean(name="dataSource")
        public DataSource dataSource() {
            
            DruidDataSource dataSource = new DruidDataSource();
            
            dataSource.setUrl(env.getProperty("jdbc.url"));
            
            dataSource.setUsername(env.getProperty("jdbc.username"));
            
            dataSource.setPassword(env.getProperty("jdbc.password"));
            
            dataSource.setDriverClassName(env.getProperty("jdbc.driverClassName"));
            
            return dataSource;
        }
        //配置事物
        @Bean(name="txManager")
        public DataSourceTransactionManager txManager() {
            
            DataSourceTransactionManager txM = new DataSourceTransactionManager();
            
            txM.setDataSource(dataSource());
            
            return txM;
        }
        
    
    }

    五、实体类

    package com.test.entity;
    
    public class User {
        
        private Integer id;
        
        private String username;
        
        
        public User() {
            
        }
        
        public User(Integer id, String username) {
            
            this.id = id;
            
            this.username = username;
            
        }
    
        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;
        }
    
        @Override
        public int hashCode() {
            final int prime = 31;
            int result = 1;
            result = prime * result + ((id == null) ? 0 : id.hashCode());
            result = prime * result + ((username == null) ? 0 : username.hashCode());
            return result;
        }
    
        @Override
        public boolean equals(Object obj) {
            if (this == obj)
                return true;
            if (obj == null)
                return false;
            if (getClass() != obj.getClass())
                return false;
            User other = (User) obj;
            if (id == null) {
                if (other.id != null)
                    return false;
            } else if (!id.equals(other.id))
                return false;
            if (username == null) {
                if (other.username != null)
                    return false;
            } else if (!username.equals(other.username))
                return false;
            return true;
        }
    
        @Override
        public String toString() {
            return "User [id=" + id + ", username=" + username + "]";
        }
        
        
    
    }

    六、controller

    package com.test.controller;
    
    import java.util.List;
    
    import javax.servlet.http.HttpSession;
    
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Controller;
    import org.springframework.ui.Model;
    import org.springframework.web.bind.annotation.RequestMapping;
    
    import com.test.entity.User;
    import com.test.service.IndexService;
    
    @Controller
    public class Indexer {
        
        @Autowired
        private IndexService service;
        
        @RequestMapping(value="/")
        public String index(Model model, HttpSession session) {
            
            List<User> users = service.findAll();
            
            model.addAttribute("users", users);
            
            return "thymeleaf";
        }
        
    }

    七、service类

    package com.test.service.impl;
    
    import java.sql.ResultSet;
    import java.sql.SQLException;
    import java.util.List;
    
    import javax.sql.DataSource;
    
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.jdbc.core.JdbcTemplate;
    import org.springframework.jdbc.core.RowMapper;
    import org.springframework.stereotype.Service;
    import org.springframework.transaction.annotation.Transactional;
    
    import com.test.entity.User;
    import com.test.service.IndexService;
    
    @Service
    public class IndexServiceImpl extends JdbcTemplate implements IndexService {
        
        @Autowired
        public IndexServiceImpl(DataSource dataSource) {
            
            super(dataSource);
            
        }
        
        @Transactional(transactionManager="txManager")
        public List<User> findAll() {
            String sql = "select id,username from t_user";
            return this.query(sql, new Object[]{}, new RowMapper<User>(){
    
                @Override
                public User mapRow(ResultSet rs, int rowNum) throws SQLException {
                    
                    User user = new User(rs.getInt("id"), rs.getString("username"));
                    System.out.println(user);
                    return user;
                }
                
                
                
            });
        }
    
    }

    八、html

    <!DOCTYPE html>
    <html xmlns:th="http://www.thymeleaf.org"><head>
    <meta charset="UTF-8">
    <title>spring thymeleaf Integrating</title>
    </head>
    <body>
        
        
        <table>
            <tr>
                <th>ID</th>
                <th>username</th>
            </tr>
            <tr th:each="user,userStat : ${users}">
                <td th:text="${user.id}">ID</td>
                <td th:text="${user.username}">username</td>
            </tr>
        
        </table>
        
       
        
    </body>
    </html>
  • 相关阅读:
    http-Content-Type
    ip地址和端口号
    node中的js-核心模块
    http-url 发送请求
    http 发送请求
    node http核心模块
    node 写文件
    bzoj-3170 3170: [Tjoi 2013]松鼠聚会(计算几何)
    codeforces 710E E. Generate a String(dp)
    codeforces 710C C. Magic Odd Square(构造)
  • 原文地址:https://www.cnblogs.com/honger/p/6876097.html
Copyright © 2011-2022 走看看