1.创建工程
使用idea可以快速创建SpringBoot的工程
这里选择常用的类库,SpringBoot将各种框架类库都进行了封装,可以减少pom文件中的引用配置:
比如Spring和Mybatis整合的时候,传统Spring项目中需要引入:
1 <dependency> 2 <groupId>org.mybatis</groupId> 3 <artifactId>mybatis</artifactId> 4 <version>3.4.1</version> 5 </dependency> 6 <dependency> 7 <groupId>org.mybatis</groupId> 8 <artifactId>mybatis-spring</artifactId> 9 <version>1.3.1</version> 10 </dependency>
而在SpringBoot中引入的是:
1 <dependency> 2 <groupId>org.mybatis.spring.boot</groupId> 3 <artifactId>mybatis-spring-boot-starter</artifactId> 4 <version>1.3.1</version> 5 </dependency>
可以看到这个类库中除了mybatis和mybatis-spring之外,还有spring-boot的东西
完整的pom.xml如下:
1 <parent> 2 <groupId>org.springframework.boot</groupId> 3 <artifactId>spring-boot-starter-parent</artifactId> 4 <version>1.5.10.RELEASE</version> 5 <relativePath/> <!-- lookup parent from repository --> 6 </parent> 7 8 <properties> 9 <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> 10 <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> 11 <java.version>1.8</java.version> 12 </properties> 13 14 <dependencies> 15 <dependency> 16 <groupId>org.springframework.boot</groupId> 17 <artifactId>spring-boot-starter-jdbc</artifactId> 18 </dependency> 19 <dependency> 20 <groupId>org.springframework.boot</groupId> 21 <artifactId>spring-boot-starter-web</artifactId> 22 </dependency> 23 <dependency> 24 <groupId>org.springframework.boot</groupId> 25 <artifactId>spring-boot-starter-aop</artifactId> 26 </dependency> 27 <dependency> 28 <groupId>org.mybatis.spring.boot</groupId> 29 <artifactId>mybatis-spring-boot-starter</artifactId> 30 <version>1.3.1</version> 31 </dependency> 32 <dependency> 33 <groupId>org.springframework.boot</groupId> 34 <artifactId>spring-boot-starter-tomcat</artifactId> 35 <scope>provided</scope> 36 </dependency> 37 38 <dependency> 39 <groupId>mysql</groupId> 40 <artifactId>mysql-connector-java</artifactId> 41 <scope>runtime</scope> 42 </dependency> 43 <dependency> 44 <groupId>org.springframework.boot</groupId> 45 <artifactId>spring-boot-starter-test</artifactId> 46 <scope>test</scope> 47 </dependency> 48 <!--使用jsp页面--> 49 <dependency> 50 <groupId>org.apache.tomcat.embed</groupId> 51 <artifactId>tomcat-embed-jasper</artifactId> 52 </dependency> 53 <dependency> 54 <groupId>jstl</groupId> 55 <artifactId>jstl</artifactId> 56 <version>1.2</version> 57 </dependency> 58 </dependencies> 59 60 <build> 61 <finalName>boot</finalName> 62 <plugins> 63 <plugin> 64 <groupId>org.springframework.boot</groupId> 65 <artifactId>spring-boot-maven-plugin</artifactId> 66 </plugin> 67 </plugins> 68 <resources> 69 <resource> 70 <directory>src/main/java</directory> 71 <includes> 72 <include>**/*.xml</include> 73 </includes> 74 </resource> 75 <resource> 76 <directory>src/main/resources</directory> 77 <includes> 78 <include>**/*.xml</include> 79 <include>**/*.properties</include> 80 </includes> 81 </resource> 82 </resources> 83 </build>
完整的工程路径如下:
2. 实体类和DAO
1 public class Dept { 2 private Integer id; 3 private String name; 4 5 //getter/setter方法略 6 }
1 public interface DeptDAO { 2 //查询列表,演示使用传统的mapper映射文件 3 List<Dept> getDeltList(); 4 5 //插入,演示使用注解编写sql,省略xml配置 6 @Insert("insert into DEPT(NAME) values(#{name})") 7 @Options(useGeneratedKeys = true, keyProperty = "id", keyColumn = "ID") 8 void addDept(String name); 9 }
DeptMapper.xml
1 <?xml version="1.0" encoding="UTF-8"?> 2 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" > 3 <mapper namespace="com.test.springboot.ssm.dao.DeptDAO"> 4 5 <resultMap id="deptMap" type="Dept"> 6 <id property="id" column="ID"/> 7 <result property="name" column="NAME"/> 8 </resultMap> 9 10 <select id="getDeltList" resultMap="deptMap"> 11 select ID,NAME from DEPT 12 </select> 13 </mapper>
3.Service
1 public interface DeptService { 2 List<Dept> getDeltList(); 3 4 void addDept(String name); 5 }
1 @Service 2 public class DeptServiceImpl implements DeptService { 3 @Autowired 4 private DeptDAO deptDAO; 5 6 @Override 7 public List<Dept> getDeltList() { 8 return deptDAO.getDeltList(); 9 } 10 11 @Override 12 public void addDept(String name) { 13 deptDAO.addDept(name); 14 } 15 }
4. Controller和页面
1 @Controller 2 public class DeptController { 3 @Autowired 4 private DeptService deptService; 5 6 @RequestMapping("list.html") 7 public ModelAndView list() { 8 List<Dept> deptList = deptService.getDeltList(); 9 return new ModelAndView("list", "deptList", deptList); 10 } 11 12 @RequestMapping("add.html") 13 public String add(String name) { 14 deptService.addDept(name); 15 //添加成功后重定向到列表页 16 return "redirect:list.html"; 17 } 18 }
add.jsp
1 <form action="/add.html" method="post"> 2 部门名:<input type="text" name="name"/><br/> 3 <input type="submit" value="add"/> 4 </form>
list.jsp
1 <c:forEach items="${deptList}" var="dept"> 2 ${dept.id}-${dept.name}<br/> 3 </c:forEach>
5.启动类
到目前为止,项目与传统的spring没有任何区别。
传统spring项目中需要增加下面两个配置文件,而SpringBoot中没有配置文件:
传统Spring项目中有以下文件:
spring-config.xml
1 <?xml version="1.0" encoding="UTF-8"?> 2 <beans xmlns="http://www.springframework.org/schema/beans" 3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 4 xmlns:aop="http://www.springframework.org/schema/aop" 5 xmlns:context="http://www.springframework.org/schema/context" 6 xmlns:tx="http://www.springframework.org/schema/tx" 7 xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd 8 http://www.springframework.org/schema/context 9 http://www.springframework.org/schema/context/spring-context-4.2.xsd 10 http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsd 11 http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd"> 12 <!--扫描@Service注解--> 13 <context:component-scan base-package="com.test.springboot.ssm.service"> 14 <context:include-filter type="annotation" expression="org.springframework.stereotype.Service"/> 15 </context:component-scan> 16 <!--读取配置文件--> 17 <context:property-placeholder location="classpath:db.properties" ignore-unresolvable="true"/> 18 <!--从配置文件中获取数据源--> 19 <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> 20 <property name="driverClassName" value="${jdbc.driver}"/> 21 <property name="url" value="${jdbc.url}"/> 22 <property name="username" value="${jdbc.username}"/> 23 <property name="password" value="${jdbc.password}"/> 24 </bean> 25 26 <!--spring管理session工厂--> 27 <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> 28 <property name="dataSource" ref="dataSource"/> 29 <property name="mapperLocations" value="classpath:com/test/springboot/ssm/dao/mapper/*.xml"/> 30 <!--配置实体类别名别名--> 31 <property name="typeAliasesPackage" value="com.test.springboot.ssm.pojo"/> 32 </bean> 33 34 <!--扫描所有mybatis的dao接口,生成代理实现类--> 35 <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> 36 <property name="basePackage" value="com.test.springboot.ssm.dao"/> 37 </bean> 38 39 <!-- 配置事务管理器 --> 40 <bean id="transactionManager" 41 class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> 42 <property name="dataSource" ref="dataSource"/> 43 </bean> 44 45 <!--事务增强--> 46 <tx:advice id="txAdvice" transaction-manager="transactionManager"> 47 <tx:attributes> 48 <!-- 传播行为,匹配的是方法名 --> 49 <tx:method name="add*" rollback-for="Exception"/> 50 <tx:method name="delete*" rollback-for="Exception"/> 51 <tx:method name="update*" rollback-for="Exception"/> 52 <tx:method name="get*" propagation="SUPPORTS" read-only="true"/> 53 <tx:method name="do*" rollback-for="Exception"/> 54 </tx:attributes> 55 </tx:advice> 56 57 <!-- 通过AOP配置提供事务增强,让service包下所有Bean的所有方法拥有事务 --> 58 <aop:config> 59 <aop:pointcut id="serviceMethod" 60 expression="execution(* com.test.springboot.ssm..*(..))"/> 61 <aop:advisor pointcut-ref="serviceMethod" advice-ref="txAdvice"/> 62 </aop:config> 63 64 </beans>
springMVC-servlet.xml
1 <?xml version="1.0" encoding="UTF-8"?> 2 <beans xmlns="http://www.springframework.org/schema/beans" 3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 4 xmlns:context="http://www.springframework.org/schema/context" 5 xmlns:mvc="http://www.springframework.org/schema/mvc" 6 xsi:schemaLocation=" 7 http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.2.xsd 8 http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.2.xsd 9 http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.2.xsd"> 10 11 <mvc:annotation-driven/> 12 <!--扫描Controller所在的包--> 13 <context:component-scan base-package="com.ssm.blog.controller"> 14 <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/> 15 </context:component-scan> 16 17 <!-- 配置视图解析器--> 18 <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> 19 <property name="prefix" value="/"></property><!--前缀--> 20 <property name="suffix" value=".jsp"></property><!--后缀--> 21 </bean> 22 23 </beans>
web.xml
1 <?xml version="1.0" encoding="UTF-8"?> 2 <web-app xmlns="http://java.sun.com/xml/ns/javaee" 3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 4 xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 5 http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" 6 version="3.0"> 7 <context-param> 8 <param-name>contextConfigLocation</param-name> 9 <param-value>classpath:spring-config.xml</param-value> 10 </context-param> 11 <!--配置listener,在启动Web容器的时候加载Spring的配置--> 12 <listener> 13 <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> 14 </listener> 15 <filter> 16 <filter-name>CharacterEncodingFilter</filter-name> 17 <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> 18 <init-param> 19 <param-name>encoding</param-name> 20 <param-value>UTF-8</param-value> 21 </init-param> 22 <init-param> 23 <param-name>forceEncoding</param-name> 24 <param-value>true</param-value> 25 </init-param> 26 </filter> 27 <filter-mapping> 28 <filter-name>CharacterEncodingFilter</filter-name> 29 <url-pattern>/*</url-pattern> 30 </filter-mapping> 31 <!--配置DispatcherServlet --> 32 <servlet> 33 <servlet-name>springMVC</servlet-name> 34 <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 35 </servlet> 36 <servlet-mapping> 37 <servlet-name>springMVC</servlet-name> 38 <url-pattern>*.html</url-pattern> 39 </servlet-mapping> 40 </web-app>
而SpringBoot中不需要这三个配置文件,写一个启动类,运行main方法即可:
1 @SpringBootApplication 2 @EnableTransactionManagement//开启事务管理 3 @ComponentScan("com.test.springboot.ssm")//扫描注解元素 4 @MapperScan("com.test.springboot.ssm.dao")//Mybatis的DAO所在包 5 public class SpringbootSsmApplication { 6 7 public static void main(String[] args) { 8 SpringApplication.run(SpringbootSsmApplication.class, args); 9 } 10 11 public static final String transactionExecution = "execution (* com.test.springboot.service..*(..))"; 12 13 @Autowired 14 private DataSource dataSource; 15 16 //声明式事务 17 @Bean 18 public DefaultPointcutAdvisor defaultPointcutAdvisor() { 19 AspectJExpressionPointcut pointcut = new AspectJExpressionPointcut(); 20 pointcut.setExpression(transactionExecution); 21 DefaultPointcutAdvisor advisor = new DefaultPointcutAdvisor(); 22 advisor.setPointcut(pointcut); 23 Properties attributes = new Properties(); 24 attributes.setProperty("get*", "PROPAGATION_REQUIRED,-Exception"); 25 attributes.setProperty("add*", "PROPAGATION_REQUIRED,-Exception"); 26 attributes.setProperty("update*", "PROPAGATION_REQUIRED,-Exception"); 27 attributes.setProperty("delete*", "PROPAGATION_REQUIRED,-Exception"); 28 TransactionInterceptor txAdvice = new TransactionInterceptor(new DataSourceTransactionManager(dataSource), attributes); 29 advisor.setAdvice(txAdvice); 30 return advisor; 31 } 32 }
数据库等配置信息放到application.properties中
1 #数据源的基本信息 2 spring.datasource.url = jdbc:mysql://localhost:3306/test?characterEncoding=utf-8 3 spring.datasource.username = root 4 spring.datasource.password = 5 spring.datasource.driverClassName = com.mysql.jdbc.Driver 6 7 #mybatis中mapper文件的路径 8 mybatis.mapper-locations=classpath*:com/test/springboot/ssm/dao/mappers/*.xml 9 #起别名。可省略写mybatis的xml中的resultType的全路径 10 mybatis.type-aliases-package=com.test.springboot.ssm.pojo 11 12 #springMVC中的视图信息,响应前缀 13 spring.mvc.view.prefix=/ 14 # 响应页面默认后缀 15 spring.mvc.view.suffix=.jsp 16 #DispatcherServlet中响应的url-pattern 17 server.sevlet-path=*.html 18 server.context-path=/boot 19 20 #logging.level.root=debug 21 logging.level.com.test.springboot.ssm.dao=trace
上面的程序只要启动main方法就可以访问了。
另外,如果需要打包发布到tomcat,需要再配置一个ServletInitializer,否则tomcat启动后会出现404。
1 public class ServletInitializer extends SpringBootServletInitializer { 2 @Override 3 protected SpringApplicationBuilder configure(SpringApplicationBuilder application) { 4 return application.sources(SpringbootSsmApplication.class); 5 } 6 }
5. 启动原理解析
任何一个SpringBoot程序都有一个启动类:
1 @SpringBootApplication 2 public class StartApplication { 3 public static void main(String[] args) { 4 SpringApplication.run(StartApplication.class, args); 5 } 6 }
启动类中包含@SpringBootApplication注解和SpringApplication.run()方法
[email protected]
@SpringBootApplication是一个组合注解,除了基本的原信息标注以外,重要的注解有三个:
@Configuration
@EnableAutoConfiguration
@ComponentScan
如下代码等同于使用@SpringBootApplication注解
1 @Configuration 2 @EnableAutoConfiguration 3 @ComponentScan 4 public class StartApplication { 5 public static void main(String[] args) { 6 SpringApplication.run(StartApplication.class, args); 7 } 8 }
每次写三个注解比较繁琐,所以使用@SpringBootApplication更方便。
5.1.1 @Configuration
简单的说,SpringBoot中使用一个@Configuration注解的类代替xml配置文件。
如spring-config.xml如下:
1 <?xml version="1.0" encoding="UTF-8"?> 2 <beans xmlns="http://www.springframework.org/schema/beans" 3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 4 xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd 5 "> 6 <!--定义bean--> 7 </beans>
SpringBoot中写成:
1 import org.springframework.context.annotation.Configuration; 2 3 @Configuration 4 public class SpringConfig { 5 }
如果定义一个bean,xml中写成:
1 <bean id="dept" class="com.spring.test.springboot.pojo.Dept"> 2 <property name="id" value="1"/> 3 </bean> 4 5 <bean id="employee" class="com.spring.test.springboot.pojo.Employee"> 6 <property name="name" value="tom"/> 7 <property name="dept" ref="dept"/> 8 </bean>
SpringBoot中写成:
1 @Bean 2 public Dept dept() { 3 Dept dept = new Dept(); 4 dept.setId(1); 5 return dept; 6 } 7 8 @Bean 9 public Employee employee() { 10 Employee employee = new Employee(); 11 employee.setName("tom"); 12 employee.setDept(dept());//注入依赖对象直接调用@Bean注解的方法 13 return employee; 14 }
SpringBoot中使用@Bean标注一个方法,该方法的方法名将默认成bean的id。注意@Configuration的类要被@ComponentScan扫描到。
5.1.2 @ComponentScan
@ComponentScan 自动扫描并加载符合规则的组件。可以通过basePackages指定要扫描的包。如果不指定赛秒范围,SpringBoot默认会从生命@ComponentScan所在类的包进行扫描。
1 @ComponentScan(basePackages = "com.spring.test.springboot.controller",includeFilters = {@ComponentScan.Filter(type= FilterType.ANNOTATION,value=Controller.class)})
等同于
1 <context:component-scan base-package="com.spring.test.springboot.controller"> 2 <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/> 3 </context:component-scan>
5.5.3 @EnableAutoConfiguration
这个注解的作用是将所有符合自动配置条件的bean自动加载到IoC容器。比如我们的项目引入了spring-boot-starter-web依赖,springboot 会自动帮我们配置 tomcat 和 springmvc。@EnableAutoConfigutation中@Import了EnableAutoConfigurationImportSelector,EnableAutoConfigurationImportSelector类使用了Spring Core包的SpringFactoriesLoader类的loadFactoryNamesof()方法。 SpringFactoriesLoader会查询META-INF/spring.factories文件中包含的JAR文件。 当找到spring.factories文件后,SpringFactoriesLoader将查询配置文件命名的属性。spring.factories文件,内容如下:
5.2 SpringApplication
SpringApplication的run方法的实现是我们本次旅程的主要线路,该方法的主要流程大体可以归纳如下:
1) 如果我们使用的是SpringApplication的静态run方法,那么,这个方法里面首先要创建一个SpringApplication对象实例,然后调用这个创建好的SpringApplication的实例方法。在SpringApplication实例初始化的时候,它会提前做几件事情:
a) 根据classpath里面是否存在某个特征类(org.springframework.web.context.ConfigurableWebApplicationContext)来决定是否应该创建一个为Web应用使用的ApplicationContext类型。
b) 使用SpringFactoriesLoader在应用的classpath中查找并加载所有可用的ApplicationContextInitializer。
c) 使用SpringFactoriesLoader在应用的classpath中查找并加载所有可用的ApplicationListener。
d) 推断并设置main方法的定义类。
2) SpringApplication实例初始化完成并且完成设置后,就开始执行run方法的逻辑了,方法执行伊始,首先遍历执行所有通过SpringFactoriesLoader可以查找到并加载的SpringApplicationRunListener。调用它们的started()方法,告诉这些SpringApplicationRunListener,“嘿,SpringBoot应用要开始执行咯!”。
3) 创建并配置当前Spring Boot应用将要使用的Environment(包括配置要使用的PropertySource以及Profile)。
4) 遍历调用所有SpringApplicationRunListener的environmentPrepared()的方法,告诉他们:“当前SpringBoot应用使用的Environment准备好了咯!”。
5) 如果SpringApplication的showBanner属性被设置为true,则打印banner。
6) 根据用户是否明确设置了applicationContextClass类型以及初始化阶段的推断结果,决定该为当前SpringBoot应用创建什么类型的ApplicationContext并创建完成,然后根据条件决定是否添加ShutdownHook,决定是否使用自定义的BeanNameGenerator,决定是否使用自定义的ResourceLoader,当然,最重要的,将之前准备好的Environment设置给创建好的ApplicationContext使用。
7) ApplicationContext创建好之后,SpringApplication会再次借助Spring-FactoriesLoader,查找并加载classpath中所有可用的ApplicationContext-Initializer,然后遍历调用这些ApplicationContextInitializer的initialize(applicationContext)方法来对已经创建好的ApplicationContext进行进一步的处理。
8) 遍历调用所有SpringApplicationRunListener的contextPrepared()方法。
9) 最核心的一步,将之前通过@EnableAutoConfiguration获取的所有配置以及其他形式的IoC容器配置加载到已经准备完毕的ApplicationContext。
10) 遍历调用所有SpringApplicationRunListener的contextLoaded()方法。
11) 调用ApplicationContext的refresh()方法,完成IoC容器可用的最后一道工序。
12) 查找当前ApplicationContext中是否注册有CommandLineRunner,如果有,则遍历执行它们。
13) 正常情况下,遍历执行SpringApplicationRunListener的finished()方法、(如果整个过程出现异常,则依然调用所有SpringApplicationRunListener的finished()方法,只不过这种情况下会将异常信息一并传入处理)
去除事件通知点后,整个流程如下:
6. Thymeleaf
SpringBoot官方不推荐使用JSP,官方推荐使用Thymeleaf。
Thymeleaf是一款用于渲染XML/XHTML/HTML5内容的模板引擎。类似JSP,Velocity,FreeMaker等,它也可以轻易的与Spring MVC等Web框架进行集成作为Web应用的模板引擎。与其它模板引擎相比,Thymeleaf最大的特点是能够直接在浏览器中打开并正确显示模板页面,而不需要启动整个Web应用。
6.1 搭建示例工程
引入thymeleaf的包:
1 <dependency> 2 <groupId>org.springframework.boot</groupId> 3 <artifactId>spring-boot-starter-thymeleaf</artifactId> 4 </dependency>
在application.properties文件中配置thymeleaf的视图解析:
1 spring.thymeleaf.content-type=text/html 2 spring.thymeleaf.mode =LEGACYHTML5 3 #开发时关闭缓存,不然没法看到实时页面 4 spring.thymeleaf.cache=false 5 #配置静态资源路径 6 spring.mvc.static-path-pattern=/static/**
controller中的代码和以前的项目一样:
1 @RequestMapping("hello") 2 public String helloWorld(Model model) { 3 //向页面传值 4 model.addAttribute("welcome", "hello thymeleaf"); 5 return "hello"; 6 }
页面写在/resources/templates下
页面hello.html,页面的文件名与controller中方法的返回值一致。注意页面的<html>标签中有一个<html xmlns:th="http://www.thymeleaf.org">
1 <!DOCTYPE html> 2 <html xmlns:th="http://www.thymeleaf.org"> 3 <head> 4 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> 5 <title>Title</title> 6 </head> 7 <body> 8 <p th:text="${welcome}"></p> 9 </body> 10 </html>
页面中所有动态的内容都使用“th:”前缀。
并且在thymeleaf的页面中,html语法要求很严格,比如标签必须闭合。如果要在解析时自动进行标签补全,需要引入jar包:
1 <dependency> 2 <groupId>net.sourceforge.nekohtml</groupId> 3 <artifactId>nekohtml</artifactId> 4 <version>1.9.22</version> 5 </dependency>
6.2 基础语法
spring-boot很多配置都有默认配置,比如默认页面映射路径为
classpath:/templates/*.html
同样静态文件路径为
classpath:/static/
首先页面的<html>标签要改写:
<html xmlns:th="http://www.thymeleaf.org">
6.2.1 获取变量值
thymeleaf通过${变量名.属性名}来获取属性值,这个语法和EL表达式一样。
页面中所有动态的内容都使用“th:”前缀,并且要写在标签中。
<p th:text=${message}>this is tag p</p>
如果直接访问静态页面,会显示“this is tag p”
如果访问动态内容,那么${message}的值会替换掉原来<p>标签中的静态内容。
常见页面操作如下:
1 @RequestMapping("hello") 2 public String helloWorld(Model model) { 3 //向页面传值,普通文本 4 model.addAttribute("text", "hello thymeleaf"); 5 //html转义文本 6 model.addAttribute("htmlText", "<h1>html</h1>"); 7 model.addAttribute("ahref", "test"); 8 List<String> list = new ArrayList<>(); 9 list.add("a"); 10 list.add("b"); 11 model.addAttribute("list", list); 12 13 List<Dept> deptList = new ArrayList<>(); 14 deptList.add(new Dept(1, "技术部")); 15 deptList.add(new Dept(2, "测试部")); 16 deptList.add(new Dept(3, "行政部")); 17 model.addAttribute("deptList", deptList); 18 return "hello"; 19 }
1 <p th:text="${text}">我是文本</p> 2 <p th:utext="${htmlText}">我是转义文本</p> 3 <p><a th:href="@{{ahref}?pa={text}(ahref=${ahref},text=${text})}">我是a标签</a></p> 4 我是表格<br/> 5 <table border="1"> 6 <tr th:each="dept:${deptList}"> 7 <td th:text="${dept.id}">id</td> 8 <td th:text="${dept.name}">name</td> 9 </tr> 10 </table> 11 我是下拉框 12 <select > 13 <option th:each="dept:${deptList}" th:value="${dept.id}" th:text="${dept.name}" th:selected="${dept.id}==${param.id[0]}"></option> 14 </select><br/> 15 <input th:value="${text}"> 16 <script th:src="@{static/test.js}" type="text/javascript"></script>
6.2.2 条件判断
1 <div th:if="${ahref == ‘test‘}">xxxxxxx</div>
原文地址:https://www.cnblogs.com/sueyyyy/p/9576415.html