SpringBoot整合ssm

1.建立工程

使用idea能夠快速建立SpringBoot的工程javascript

 

這裏選擇經常使用的類庫,SpringBoot將各類框架類庫都進行了封裝,能夠減小pom文件中的引用配置:html

 

好比Spring和Mybatis整合的時候,傳統Spring項目中須要引入:java

  <dependency>
     <groupId>org.mybatis</groupId>
     <artifactId>mybatis</artifactId>
     <version>3.4.1</version>
  </dependency>
  <dependency>
     <groupId>org.mybatis</groupId>
     <artifactId>mybatis-spring</artifactId>
     <version>1.3.1</version>
  </dependency>

而在SpringBoot中引入的是:mysql

 <dependency>
    <groupId>org.mybatis.spring.boot</groupId>
    <artifactId>mybatis-spring-boot-starter</artifactId>
    <version>1.3.1</version>
 </dependency>

能夠看到這個類庫中除了mybatis和mybatis-spring以外,還有spring-boot的東西web

完整的pom.xml以下:spring

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>1.5.10.RELEASE</version>
    <relativePath/> <!-- lookup parent from repository -->
</parent>

<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
    <java.version>1.8</java.version>
</properties>

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-jdbc</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-aop</artifactId>
    </dependency>
    <dependency>
        <groupId>org.mybatis.spring.boot</groupId>
        <artifactId>mybatis-spring-boot-starter</artifactId>
        <version>1.3.1</version>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-tomcat</artifactId>
        <scope>provided</scope>
    </dependency>

    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <scope>runtime</scope>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
    <!--使用jsp頁面-->
    <dependency>
        <groupId>org.apache.tomcat.embed</groupId>
        <artifactId>tomcat-embed-jasper</artifactId>
    </dependency>
    <dependency>
        <groupId>jstl</groupId>
        <artifactId>jstl</artifactId>
        <version>1.2</version>
    </dependency>
</dependencies>

<build>
    <finalName>boot</finalName>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>
    </plugins>
    <resources>
        <resource>
            <directory>src/main/java</directory>
            <includes>
                <include>**/*.xml</include>
            </includes>
        </resource>
        <resource>
            <directory>src/main/resources</directory>
            <includes>
                <include>**/*.xml</include>
                <include>**/*.properties</include>
            </includes>
        </resource>
    </resources>
</build>

完整的工程路徑以下:sql

2. 實體類和DAO

 public class Dept {
     private Integer id;
     private String name;
 
     //getter/setter方法略
 }

 

 public interface DeptDAO {
     //查詢列表,演示使用傳統的mapper映射文件
     List<Dept> getDeltList();
     //插入,演示使用註解編寫sql,省略xml配置
     @Insert("insert into DEPT(NAME) values(#{name})")
     @Options(useGeneratedKeys = true, keyProperty = "id", keyColumn = "ID")
     void addDept(String name);
 }

DeptMapper.xml數據庫

  <?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.test.springboot.ssm.dao.DeptDAO">
  
      <resultMap id="deptMap" type="Dept">
          <id property="id" column="ID"/>
          <result property="name" column="NAME"/>
      </resultMap>
  
     <select id="getDeltList" resultMap="deptMap">
         select ID,NAME from DEPT
     </select>
  </mapper>

3.Service

 public interface DeptService {
     List<Dept> getDeltList(); 
     void addDept(String name);
 }

 

  @Service
  public class DeptServiceImpl implements DeptService {
      @Autowired
      private DeptDAO deptDAO;
  
      @Override
      public List<Dept> getDeltList() {
          return deptDAO.getDeltList();
      }
 
     @Override
     public void addDept(String name) {
         deptDAO.addDept(name);
     }
 }

4. Controller和頁面

  @Controller
  public class DeptController {
      @Autowired
      private DeptService deptService;
  
      @RequestMapping("list.html")
      public ModelAndView list() {
          List<Dept> deptList = deptService.getDeltList();
          return new ModelAndView("list", "deptList", deptList);
     } 
     @RequestMapping("add.html")
     public String add(String name) {
         deptService.addDept(name);
         //添加成功後重定向到列表頁
         return "redirect:list.html";
     }
 }

add.jspexpress

 <form action="/add.html" method="post">
     部門名:<input type="text" name="name"/><br/>
     <input type="submit" value="add"/>
 </form>

list.jspapache

 <c:forEach items="${deptList}" var="dept">
     ${dept.id}-${dept.name}<br/>
 </c:forEach>

5.啓動類

到目前爲止,項目與傳統的spring沒有任何區別。

傳統spring項目中須要增長下面兩個配置文件,而SpringBoot中沒有配置文件:

傳統Spring項目中有如下文件:

spring-config.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:tx="http://www.springframework.org/schema/tx"
       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-4.2.xsd
       http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsd
       http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd">
    <!--掃描@Service註解-->
    <context:component-scan base-package="com.test.springboot.ssm.service">
        <context:include-filter type="annotation" expression="org.springframework.stereotype.Service"/>
    </context:component-scan>
    <!--讀取配置文件-->
    <context:property-placeholder location="classpath:db.properties" ignore-unresolvable="true"/>
    <!--從配置文件中獲取數據源-->
    <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <property name="driverClassName" value="${jdbc.driver}"/>
        <property name="url" value="${jdbc.url}"/>
        <property name="username" value="${jdbc.username}"/>
        <property name="password" value="${jdbc.password}"/>
    </bean>

    <!--spring管理session工廠-->
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="dataSource" ref="dataSource"/>
        <property name="mapperLocations" value="classpath:com/test/springboot/ssm/dao/mapper/*.xml"/>
        <!--配置實體類別名別名-->
        <property name="typeAliasesPackage" value="com.test.springboot.ssm.pojo"/>
    </bean>
    
    <!--掃描全部mybatis的dao接口,生成代理實現類-->
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <property name="basePackage" value="com.test.springboot.ssm.dao"/>
    </bean>
    
    <!-- 配置事務管理器 -->
    <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="add*" rollback-for="Exception"/>
            <tx:method name="delete*" rollback-for="Exception"/>
            <tx:method name="update*" rollback-for="Exception"/>
            <tx:method name="get*" propagation="SUPPORTS" read-only="true"/>
            <tx:method name="do*" rollback-for="Exception"/>
        </tx:attributes>
    </tx:advice>
    
    <!-- 經過AOP配置提供事務加強,讓service包下全部Bean的全部方法擁有事務 -->
    <aop:config>
        <aop:pointcut id="serviceMethod"
                      expression="execution(* com.test.springboot.ssm..*(..))"/>
        <aop:advisor pointcut-ref="serviceMethod" advice-ref="txAdvice"/>
    </aop:config>

</beans>

springMVC-servlet.xml

<?xml version="1.0" encoding="UTF-8"?>
<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-4.2.xsd
  http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.2.xsd
  http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.2.xsd">

    <mvc:annotation-driven/>
    <!--掃描Controller所在的包-->
    <context:component-scan base-package="com.ssm.blog.controller">
        <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
    </context:component-scan>

    <!-- 配置視圖解析器-->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/"></property><!--前綴-->
        <property name="suffix" value=".jsp"></property><!--後綴-->
    </bean>

</beans>

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
          http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
         version="3.0">
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:spring-config.xml</param-value>
    </context-param>
    <!--配置listener,在啓動Web容器的時候加載Spring的配置-->
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>
    <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>
    <!--配置DispatcherServlet -->
    <servlet>
        <servlet-name>springMVC</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>springMVC</servlet-name>
        <url-pattern>*.html</url-pattern>
    </servlet-mapping>
</web-app>

而SpringBoot中不須要這三個配置文件,寫一個啓動類,運行main方法便可:

  @SpringBootApplication
  @EnableTransactionManagement//開啓事務管理
  @ComponentScan("com.test.springboot.ssm")//掃描註解元素
  @MapperScan("com.test.springboot.ssm.dao")//Mybatis的DAO所在包
  public class SpringbootSsmApplication {
      public static void main(String[] args) {
          SpringApplication.run(SpringbootSsmApplication.class, args);
      }
     public static final String transactionExecution = "execution (* com.test.springboot.service..*(..))";
     @Autowired
     private DataSource dataSource;
     //聲明式事務
     @Bean
     public DefaultPointcutAdvisor defaultPointcutAdvisor() {
         AspectJExpressionPointcut pointcut = new AspectJExpressionPointcut();
         pointcut.setExpression(transactionExecution);
         DefaultPointcutAdvisor advisor = new DefaultPointcutAdvisor();
         advisor.setPointcut(pointcut);
         Properties attributes = new Properties();
         attributes.setProperty("get*", "PROPAGATION_REQUIRED,-Exception");
         attributes.setProperty("add*", "PROPAGATION_REQUIRED,-Exception");
         attributes.setProperty("update*", "PROPAGATION_REQUIRED,-Exception");
         attributes.setProperty("delete*", "PROPAGATION_REQUIRED,-Exception");
         TransactionInterceptor txAdvice = new TransactionInterceptor(new DataSourceTransactionManager(dataSource), attributes);
         advisor.setAdvice(txAdvice);
         return advisor;
     }
 }

數據庫等配置信息放到application.properties中

  #數據源的基本信息
  spring.datasource.url = jdbc:mysql://localhost:3306/test?characterEncoding=utf-8
  spring.datasource.username = root
  spring.datasource.password =
  spring.datasource.driverClassName = com.mysql.jdbc.Driver  
  #mybatis中mapper文件的路徑
  mybatis.mapper-locations=classpath*:com/test/springboot/ssm/dao/mappers/*.xml
  #起別名。可省略寫mybatis的xml中的resultType的全路徑
 mybatis.type-aliases-package=com.test.springboot.ssm.pojo
 #springMVC中的視圖信息,響應前綴
 spring.mvc.view.prefix=/
 # 響應頁面默認後綴
 spring.mvc.view.suffix=.jsp
 #DispatcherServlet中響應的url-pattern
 server.sevlet-path=*.html
 server.context-path=/boot 
 #logging.level.root=debug
 logging.level.com.test.springboot.ssm.dao=trace

上面的程序只要啓動main方法就能夠訪問了。

另外,若是須要打包發佈到tomcat,須要再配置一個ServletInitializer,不然tomcat啓動後會出現404。

 public class ServletInitializer extends SpringBootServletInitializer {
     @Override
     protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
         return application.sources(SpringbootSsmApplication.class);
     }
 }

5. 啓動原理解析

任何一個SpringBoot程序都有一個啓動類:

 @SpringBootApplication
 public class StartApplication {
     public static void main(String[] args) {
         SpringApplication.run(StartApplication.class, args);
     }
 }

啓動類中包含@SpringBootApplication註解和SpringApplication.run()方法

5.1@SpringBootApplication

@SpringBootApplication是一個組合註解,除了基本的原信息標註之外,重要的註解有三個:

@Configuration

@EnableAutoConfiguration

@ComponentScan

以下代碼等同於使用@SpringBootApplication註解

 @Configuration
 @EnableAutoConfiguration
 @ComponentScan
 public class StartApplication {
     public static void main(String[] args) {
         SpringApplication.run(StartApplication.class, args);
     }
 }

每次寫三個註解比較繁瑣,因此使用@SpringBootApplication更方便。

5.1.1  @Configuration

簡單的說,SpringBoot中使用一個@Configuration註解的類代替xml配置文件。

如spring-config.xml以下:

 <?xml version="1.0" encoding="UTF-8"?>
 <beans xmlns="http://www.springframework.org/schema/beans"
        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.xsd
        ">
     <!--定義bean-->
 </beans>

SpringBoot中寫成:

 import org.springframework.context.annotation.Configuration; 
 @Configuration
 public class SpringConfig {
 }

若是定義一個bean,xml中寫成:

 <bean id="dept" class="com.spring.test.springboot.pojo.Dept">
     <property name="id" value="1"/>
 </bean>
 
 <bean id="employee" class="com.spring.test.springboot.pojo.Employee">
     <property name="name" value="tom"/>
     <property name="dept" ref="dept"/>
 </bean>

SpringBoot中寫成:

  @Bean
  public Dept dept() {
      Dept dept = new Dept();
      dept.setId(1);
      return dept;
  }
  
  @Bean
  public Employee employee() {
     Employee employee = new Employee();
     employee.setName("tom");
     employee.setDept(dept());//注入依賴對象直接調用@Bean註解的方法
     return employee;
 }

SpringBoot中使用@Bean標註一個方法,該方法的方法名將默認成bean的id。注意@Configuration的類要被@ComponentScan掃描到。

5.1.2 @ComponentScan

@ComponentScan 自動掃描並加載符合規則的組件。能夠經過basePackages指定要掃描的包。若是不指定賽秒範圍,SpringBoot默認會從生命@ComponentScan所在類的包進行掃描。

 @ComponentScan(basePackages = "com.spring.test.springboot.controller",includeFilters = {@ComponentScan.Filter(type= FilterType.ANNOTATION,value=Controller.class)})

等同於

 <context:component-scan base-package="com.spring.test.springboot.controller">
     <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
 </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的包:

 <dependency>
     <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot-starter-thymeleaf</artifactId>
 </dependency>

在application.properties文件中配置thymeleaf的視圖解析:

 spring.thymeleaf.content-type=text/html  
 spring.thymeleaf.mode =LEGACYHTML5
 #開發時關閉緩存,否則無法看到實時頁面
 spring.thymeleaf.cache=false
 #配置靜態資源路徑
 spring.mvc.static-path-pattern=/static/**

controller中的代碼和之前的項目同樣:

 @RequestMapping("hello")
 public String helloWorld(Model model) {
     //向頁面傳值
     model.addAttribute("welcome", "hello thymeleaf");
     return "hello";
 }

頁面寫在/resources/templates下

頁面hello.html,頁面的文件名與controller中方法的返回值一致。注意頁面的<html>標籤中有一個<html xmlns:th="http://www.thymeleaf.org">

  <!DOCTYPE html>
  <html xmlns:th="http://www.thymeleaf.org">
  <head>
      <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
      <title>Title</title>
  </head>
  <body>
  <p th:text="${welcome}"></p>
  </body>
 </html>

頁面中全部動態的內容都使用「th:」前綴。

而且在thymeleaf的頁面中,html語法要求很嚴格,好比標籤必須閉合。若是要在解析時自動進行標籤補全,須要引入jar包:

 <dependency>
     <groupId>net.sourceforge.nekohtml</groupId>
     <artifactId>nekohtml</artifactId>
     <version>1.9.22</version>
 </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>標籤中的靜態內容。

常見頁面操做以下:

  @RequestMapping("hello")
  public String helloWorld(Model model) {
      //向頁面傳值,普通文本
      model.addAttribute("text", "hello thymeleaf");
      //html轉義文本
      model.addAttribute("htmlText", "<h1>html</h1>");
      model.addAttribute("ahref", "test");
      List<String> list = new ArrayList<>();
      list.add("a");
     list.add("b");
     model.addAttribute("list", list);
 
     List<Dept> deptList = new ArrayList<>();
     deptList.add(new Dept(1, "技術部"));
     deptList.add(new Dept(2, "測試部"));
     deptList.add(new Dept(3, "行政部"));
     model.addAttribute("deptList", deptList);
     return "hello";
 }
<p th:text="${text}">我是文本</p>
  <p th:utext="${htmlText}">我是轉義文本</p>
  <p><a th:href="@{{ahref}?pa={text}(ahref=${ahref},text=${text})}">我是a標籤</a></p>
  我是表格<br/>
  <table border="1">
      <tr th:each="dept:${deptList}">
          <td th:text="${dept.id}">id</td>
          <td th:text="${dept.name}">name</td>
      </tr>
 </table>
 我是下拉框
     <select  >
         <option th:each="dept:${deptList}" th:value="${dept.id}" th:text="${dept.name}" th:selected="${dept.id}==${param.id[0]}"></option>
 </select><br/>
     <input th:value="${text}">
 <script th:src="@{static/test.js}" type="text/javascript"></script>

6.2.2  條件判斷

 <div th:if="${ahref == 'test'}">xxxxxxx</div>
相關文章
相關標籤/搜索