SpringBoot简介,包含常见注解,RESTFul风格和Thymeleaf等内容

Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程。该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置。通过这种方式,Spring Boot致力于在蓬勃发展的快速应用开发领域(rapid application development)成为领导者。

一、SpringBoot简介

1、SpringBoot

SpringBoot就相当于不需要配置文件的Spring+SpringMVC。

  • 自动配置:SpringBoot会根据项目中添加的jar依赖关系,自动配置你的Spring应用。例如,如果你在classpath路径下添加了HSQLDB,并且你没有手动配置任何数据库连接beans,那么SpringBoot会自动配置一个内存型(in-memory)数据库。
  • 独立运行:SpringBoot 内嵌了如 TomcatJettyUndertow 这样的Servlet容器,所以你可以打包成一个jar或war文件,然后直接运行。
  • 生产就绪特性:SpringBoot提供了很多非业务性功能,例如运行状况检查(health checks)、外部化配置(externalized configuration)以及安全的特性。
  • 无代码生成和XML配置:SpringBoot并不是一个新的框架,它默认配置了很多框架的使用方式,就像Maven整合了所有的jar包一样,SpringBoot整合了所有的框架。

SpringBoot是一个强大的框架,它大大简化了Spring应用的搭建和开发过程,使开发者能够更专注于业务逻辑的实现,而不是花费大量时间在配置和整合各种框架上。

SpringBoot事务简介示例请看:Sping事务简介

2、JavaConfig

JavaConfig是Spring框架提供的一种 替代XML配置 的方式,旨在简化和增强应用程序的配置过程。传统的Spring框架使用XML文件来定义应用程序的配置信息,包括Bean的定义、依赖关系、AOP切面等。然而,使用XML配置可能会导致配置文件冗长、繁琐,并且容易出错。

JavaConfig通过引入Java类来替代XML配置文件,使得配置更加直观、类型安全,并且可以充分利用Java语言的特性。

使用JavaConfig,可以通过编写一个或多个Java类来定义应用程序的配置。这些配置类通常使用注解来标识Bean的定义、依赖关系和其他配置信息。 JavaConfig还提供了一些额外的功能,例如条件化配置、组件扫描和AOP的支持。

2.1、JavaConfig的优点

使用Java类作为XML配置文件的替代,是配置spring容器的纯Java的方式。在这个Java类这可以创建Java对象,把对象放入Spring容器中(注入到容器)。

  • 面向对象的配置:由于配置被定义为JavaConfig中的类,因此用户可以充分利用Java中的面向对象功能。 一个配置类可以继承另一个,重写它的@Bean方法等。
  • 减少或消除XML配置:JavaConfig提供了一种纯Java方法来配置与XML配置概念相似的Spring容器。
  • 类型安全和重构友好:JavaConfig提供了一种类型安全的方法来配置Spring容器,使得代码更加健壮和易于维护。

2.2、@Configuration 和 @Bean

  • @Configuration :放在一个类的上面,表示这个类是作为配置文件使用的。
  • @Bean :声明对象,把对象注入到容器中。
import com.qdwa.vo.Student;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * Configuration:表示当前类是作为配置文件使用的。 就是用来配置容器的
 * 位置:在类的上面
 * SpringConfig这个类就相当于beans.xml
 */
@Configuration
public class SpringConfig {
    /**
     * 创建方法,方法的返回值是对象。 在方法的上面加入@Bean
     * 方法的返回值对象就注入到容器中。
     * @Bean: 把对象注入到spring容器中。 作用相当于<bean>
     *     位置:方法的上面
     *     说明:@Bean,不指定对象的名称,默认是方法名是 id
     */
    @Bean
    public Student createStudent(){
        Student s1  = new Student();
        s1.setName("张三");
        s1.setAge(26);
        s1.setSex("男");
        return s1;
    }
    /***
     * 指定对象在容器中的名称(指定<bean>的id属性)
     * @Bean的name属性,指定对象的名称(id)
     */
    @Bean(name = "listStudent")
    public Student makeStudent(){
        Student s2  = new Student();
        s2.setName("李四");
        s2.setAge(22);
        s2.setSex("男");
        return s2;
    }
}

3、@ImporResource

@ImportResource 作用导入其他的XML配置文件,等于在XML。

<import resources="其他配置文件"/>

例如:

@Configuration
@ImportResource(value ={ "classpath:applicationContext.xml","classpath:beans.xml"})
public class SpringConfig {
}

4、@PropertyResource

@PropertyResource:读取properties属性配置文件。使用属性配置文件可以实现外部化配置,在程序代码之外提供数据。

  • 在resources目录下,创建properties文件,使用k-v的格式提供数据。
  • 在PropertyResource 指定properties文件的位置。
  • 使用 @Value(value="${key}")
@Configuration
@ImportResource(value ={ "classpath:applicationContext.xml","classpath:beans.xml"})
@PropertySource(value = "classpath:config.properties")
@ComponentScan(basePackages = "com.bjpowernode.vo")
public class SpringConfig {
}

5、起步依赖

Spring Boot的起步依赖(Starter Dependencies)是一组预配置的依赖项,用于快速启动特定类型的应用程序。这些起步依赖包含了应用程序所需的所有依赖库,以及必要的配置和默认设置。通过使用起步依赖,可以轻松地集成各种技术栈,如Web开发、数据库访问、安全性等。

在Spring Boot中,起步依赖本质上是一个Maven项目对象模型(POM),它定义了对其他库的传递依赖,这些依赖加在一起支持某项功能。 起步依赖的名字通常具有很好的可读性,从名字上就可以大致了解其功能。例如,spring-boot-starter-web 就是一个用于Web开发的起步依赖,它包含了 开发Web应用程序所需的所有核心库和配置

二、SpringBoot项目

1、SpringBoot的配置文件

配置文件名称:application.properties 对应 k=v 结构,application.yml 对应 k:v 结构。

  • application.properties 设置端口和上下文
#设置端口号
server.port=8082
#设置访问应用上下文路径, contextpath
server.servlet.context-path=/myboot
  • application.yml 设置端口和上下文
server:
  port: 8083
  servlet:
    context-path: /myboot2

实际项目搭建中,有存在开发环境,测试环境,上线的环境。每个环境有不同的配置信息,例如端口,上下文件,数据库url,用户名,密码等等。使用多环境配置文件,可以方便的切换不同的配置。

使用方式:创建多个配置文件,名称规则:application-环境名称.properties(yml)

  • 创建开发环境的配置文件:application-dev.properties(application-dev.yml)
  • 创建测试者使用的配置:application-test.properties

2、常见注解简介

  • @SpringBootApplication :放在启动类上面,包含了三个注解。@SpringBootConfiguration, @EnableAutoConfiguration, @ComponentScan 。
  • @SpringBootConfiguration :使用了该注解标注的类,可以作为配置文件使用的,可以使用Bean声明对象,注入到容器。
  • @EnableAutoConfiguration :启用自动配置,把java对象配置好,注入到spring容器中。例如可以把mybatis的对象创建好,放入到容器中。
  • @ComponentScan :扫描器,找到注解,根据注解的功能创建对象,给属性赋值等等。有一个默认位置,Application位于主目录下,其余位于子包目录中。默认扫描的包: @ComponentScan所在的类所在的包和子包。
  • @RestController :放在类的上面,创建控制器对象,注入到容器中。是一个复合注解 @Controller ,@ResponseBody, 使用这个注解类的,里面的控制器方法的返回值,都是数据。
  • @Controller :放在类的上面,创建控制器对象,注入到容器中。
  • @Service :放在业务层的实现类上面,创建service对象,注入到容器。
  • @Repository :放在dao层的实现类上面,创建dao对象,放入到容器。持久层对象。
  • @Component :放在类的上面,创建此类的对象,注入到容器中。 和三层架构无关系,如果一个类不是持久层,也不是业务层,也不是控制层的,就使用这个。
  • @Value :简单类型的赋值。
  • @Autowired :引用类型赋值自动注入的,支持byName,byType,默认是byType。
  • @Qualifer :给引用类型赋值,使用byName方式。@Autowird, @Qualifer都是Spring框架提供的。
  • @Resource :来自jdk中的定义, javax.annotation。实现引用类型的自动注入,支持byName, byType。默认是byName, 如果byName失败,再使用byType注入。在属性上面使用。
  • @Configuration :放在类的上面,表示这是个配置类,相当于xml配置文件
  • @Bean :放在方法的上面,把方法的返回值对象,注入到spring容器中。
  • @ImportResource :加载其他的xml配置文件,把文件中的对象注入到spring容器中
  • @PropertySource :读取其他的properties属性配置文件。
  • @ResponseBody :放在方法的上面,表示方法的返回值是数据,不是视图。
  • @RequestBody :把请求体中的数据,读取出来,转为java对象使用。
  • @ControllerAdvice :控制器增强,放在类的上面,表示此类提供了方法,可以对controller增强功能。
  • @ExceptionHandler :处理异常的,放在方法的上面。
  • @Transcational :处理事务的,放在service实现类的public方法上面,表示此方法有事务
  • @ConfigurationProperties :把配置文件的数据映射为java对象。

3、@ConfigurationProperties

属性:prefix 配置文件中的某些key的开头的内容。

@Component
@ConfigurationProperties(prefix = "school")
@Data
public class SchoolInfo {
    private String name;
    private String website;
    private String address;
}

application.properties文件配置

#配置端口号
server.port=8082
#context-path
server.servlet.context-path=/myboot

#自定义key=value
school.name=青灯文案
school.website=www.qdwa.com
school.address=上海市普通新区
site=www.qdwa.com

4、创建拦截器

拦截器是SpringMVC中一种对象,能拦截器对Controller的请求。拦截器框架中有系统的拦截器,还可以自定义拦截器。实现对请求预先处理。

实现自定义拦截器:

1、创建类实现SpringMVC框架的HandlerInterceptor接口

public interface HandlerInterceptor {
    default boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        return true;
    }
    default void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable ModelAndView modelAndView) throws Exception {
    }
    default void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable Exception ex) throws Exception {
    }
}

2、需在SpringMVC的配置文件中,声明拦截器

<mvc:interceptors>
	<mvc:interceptor>
    	<mvc:path="url" />
        <bean class="拦截器类全限定名称"/>
    </mvc:interceptor>
</mvc:interceptors>

3、SpringBoot中注册拦截器

@Configuration
public class MyAppConfig implements WebMvcConfigurer {
    //添加拦截器对象, 注入到容器中
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        //创建拦截器对象
        HandlerInterceptor interceptor = new LoginInterceptor();
        //指定拦截的请求uri地址
        String path []= {"/user/**"};
        //指定不拦截的地址
        String excludePath  [] = {"/user/login"};
        registry.addInterceptor(interceptor).addPathPatterns(path).excludePathPatterns(excludePath);
    }
}

5、创建Servlet

在SpringBoot框架中使用Servlet对象。

  • 创建Servlet类。创建类继承HttpServlet
//创建Servlet类
public class MyServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doPost(req,resp);
    }
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //使用HttpServletResponse输出数据,应答结果
        resp.setContentType("text/html;charset=utf-8");
        PrintWriter out  = resp.getWriter();
        out.println("===执行的是Servlet==");
		out.flush();
        out.close();
    }
}
  • 注册Servlet,让框架能找到Servlet
@Configuration
public class WebApplicationConfig {
    // 定义方法, 注册Servlet对象
    @Bean
    public ServletRegistrationBean servletRegistrationBean(){
        // public ServletRegistrationBean(T servlet, String... urlMappings)
	// 第一个参数是 Servlet对象, 第二个是url地址
        // ServletRegistrationBean bean = new ServletRegistrationBean(new MyServlet(),"/myservlet");
        ServletRegistrationBean bean = new ServletRegistrationBean();
        bean.setServlet( new MyServlet());
        bean.addUrlMappings("/login","/test"); // <url-pattern>
	return bean;
    }
}

6、创建过滤器

Filter是Servlet规范中的过滤器,可以处理请求,对请求的参数,属性进行调整。常常在过滤器中处理字符编码。

  • 创建自定义过滤器类
// 自定义过滤器
public class MyFilter implements Filter {
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, 
	FilterChain filterChain) throws IOException, ServletException {
        System.out.println("执行了MyFilter,doFilter ");
        filterChain.doFilter(servletRequest,servletResponse);
    }
}
  • 注册Filter过滤器对象
@Configuration
public class WebApplicationConfig {
    @Bean
    public FilterRegistrationBean filterRegistrationBean(){
        FilterRegistrationBean bean  = new FilterRegistrationBean();
        bean.setFilter( new MyFilter());
        bean.addUrlPatterns("/user/*");
        return bean;
    }
}

7、创建字符集过滤器

CharacterEncodingFilter:解决post请求中乱码的问题。

第一种方式:

1、配置字符集过滤器

@Configuration
public class WebSystemConfig {
	// 注册Servlet
	@Bean
	public ServletRegistrationBean servletRegistrationBean(){
		MyServlet myServlet = new MyServlet();
		ServletRegistrationBean reg = new ServletRegistrationBean(myServlet,"/myservlet");
		return reg;
	}
	// 注册Filter
	@Bean
	public FilterRegistrationBean filterRegistrationBean(){
		FilterRegistrationBean reg = new FilterRegistrationBean();
		//使用框架中的过滤器类
		CharacterEncodingFilter filter = new CharacterEncodingFilter();
		//指定使用的编码方式
		filter.setEncoding("utf-8");
		//指定request,response都使用encoding的值
		filter.setForceEncoding(true);
		reg.setFilter(filter);
		//指定 过滤的url地址
		reg.addUrlPatterns("/*");
		return reg;
	}
}

2、修改 application.properties 文件,让自定义的过滤器起作用。

#SpringBoot中默认已经配置了CharacterEncodingFilter。编码默认ISO-8859-1
#设置enabled=false 作用是关闭系统中配置好的过滤器,使用自定义的CharacterEncodingFilter
server.servlet.encoding.enabled=false

第二种方式: 修改 application.properties 文件

server.port=9001
server.servlet.context-path=/myboot
#让系统的CharacterEncdoingFilter生效
server.servlet.encoding.enabled=true
#指定使用的编码方式
server.servlet.encoding.charset=utf-8
#强制request,response都使用charset属性的值
server.servlet.encoding.force=true

三、MyBatis框架操作MySQL

使用MyBatis框架操作数据,在SpringBoot框架集成MyBatis

  • MyBatis起步依赖:完成MyBatis对象自动配置,对象放在容器中。
  • pom.xml 指定把 src/main/java 目录中的xml文件包含到classpath中。
  • 创建实体类Student。
  • 创建Dao接口StudentDao,创建一个查询学生的方法。
  • 创建Dao接口对应的Mapper文件,xml文件,写sql语句。
  • 创建Service层对象,创建StudentService接口和他的实现类。去dao对象的方法。完成数据库的操作。
  • 创建Controller对象,访问Service。
  • application.properties 文件,配置数据库的连接信息。

1、@Mapper

@Mapper:放在dao接口的上面, 每个接口都需要使用这个注解。

/**
 * @Mapper:告诉MyBatis这是dao接口,创建此接口的代理对象。
 *     位置:在类的上面
 */
@Mapper
public interface StudentDao {
    Student selectById(@Param("stuId") Integer id);
}

2、@MapperScan

/**
 * @MapperScan: 找到Dao接口和Mapper文件
 *     basePackages:Dao接口所在的包名
 */
@SpringBootApplication
@MapperScan(basePackages = {"com.bjpowernode.dao","com.bjpowernode.mapper"})
public class Application {
}

3、Mapper文件和Dao接口分开管理

  • 把Mapper文件放在 resources 目录下,在 resources 目录中创建子目录 mapper
  • 把mapper文件放到 mapper 目录中。
  • application.properties 文件中,指定 mapper 文件的目录。
#指定mapper文件的位置
mybatis.mapper-locations=classpath:mapper/*.xml
#指定mybatis的日志
mybatis.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
  • pom.xml 中把 resources 目录中的文件,编译到目标目录中。
<!--resources插件-->
<resources>
   <resource>
      <directory>src/main/resources</directory>
      <includes>
         <include>**/*.*</include>
      </includes>
   </resource>
</resources>

四、RESTful风格

RESTful风格是一种面向资源的软件架构风格,它 基于HTTP协议 ,通过定义一组统一的接口和交互方式,来提高系统的可扩展性、可靠性和可维护性。其核心设计思想是资源的表示、标识和状态转移。

在RESTful风格中,每个资源都有一个唯一的URI(统一资源标识符),客户端通过HTTP请求访问这些资源,并使用HTTP方法来执行特定的操作。例如,GET用于检索资源,POST用于创建资源,PUT用于更新资源,DELETE用于删除资源。

RESTful风格适用于各种网络应用程序,尤其是移动互联网厂商作为业务接口的场景,实现第三方调用移动网络资源的功能。通过使用RESTful风格,可以简化应用程序之间的通信和交互,提高系统的灵活性和可扩展性。

主要特点:

  • 资源:将应用程序的功能封装为资源,每个资源都有一个唯一的标识符(URI)。资源可以是数据实体、集合、服务等。
  • 无状态性:服务器不会保存客户端的状态信息。每个请求应该是独立的,服务器不依赖于先前的请求状态。
  • 使用URI来定位资源:通过使用URI来标识和定位资源,客户端可以通过合适的URI来访问和操作特定的资源。
  • 使用HTTP状态码:使用HTTP状态码来表示操作结果的状态和信息。例如,200表示成功,404表示资源未找到,500表示服务器错误等。
  • 使用合适的数据格式:通常使用JSON或XML等常见的数据格式来表示资源的表示形式。

后续添加Restful示例

五、SpringBoot项目打包简介

1、打包war文件

创建了一个jsp应用,修改 pom.xml

1、指定打包后的文件名称

<build>
   <!--打包后的文件名称-->
   <finalName>myboot</finalName>
</build>

2、指定jsp编译目录

<!--resources插件, 把jsp编译到指定的目录-->
<resources>
   <resource>
      <directory>src/main/webapp</directory>
      <targetPath>META-INF/resources</targetPath>
      <includes>
         <include>**/*.*</include>
      </includes>
   </resource>

   <!--使用了mybatis ,而且mapper文件放在src/main/java目录-->
   <resource>
      <directory>src/main/java</directory>
      <includes>
         <include>**/*.xml</include>
      </includes>
   </resource>

   <!--把src/main/resources下面的所有文件,都包含到classes目录-->
   <resource>
      <directory>src/main/resources</directory>
      <includes>
         <include>**/*.*</include>
      </includes>
   </resource>
</resources>

3、执行打包是war

<!--打包类型-->
<packaging>war</packaging>

4、主启动类继承SpringBootServletInitializer

/**
 * SpringBootServletInitializer: 继承这个类, 才能使用独立tomcat服务器
 */
@SpringBootApplication
public class JspApplication  extends SpringBootServletInitializer  {

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

   @Override
   protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
      return builder.sources(JspApplication.class);
   }
}

5、部署war

把war放到tomcat等服务器的发布目录中。 tomcat为例, myboot.war放到tomcat/webapps目录。

2、打包为jar文件

创建了一个包含了jsp的项目,修改 pom.xml

1、指定打包后的文件名称

<build>
   <!--打包后的文件名称-->
   <finalName>myboot</finalName>
</build>

2、指定 springboot-maven-plugin 版本

<plugins>
   <plugin>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-maven-plugin</artifactId>
      <!--打包jar, 有jsp文件时,必须指定maven-plugin插件的版本是 1.4.2.RELEASE-->
      <version>1.4.2.RELEASE</version>
   </plugin>
</plugins>

3、最后执行 maven clean package

在target目录中,生成jar文件,例子是myboot.jar
执行独立的springboot项目,在cmd中java -jar myboot.jar

六、Thymeleaf模板引擎

Thymeleaf是一款现代化的服务器端Java模板引擎,适用于Web和独立应用场景。它具备处理HTML、XML、JavaScript、CSS以及纯文本的能力,为开发者提供了一种优雅且自然的模板设计方式,使得开发者能够更加便捷地构建、创建和维护结构化且语义正确的Web页面。

Thymeleaf可以轻易地与Spring MVC等Web框架进行集成,作为Web应用的模板引擎。它的应用场景非常广泛,无论是传统的服务器端Web应用程序、单页应用程序,还是移动Web应用程序,Thymeleaf都能够轻松应对。而且,它不仅可以用于动态内容的生成,还可以用于生成静态内容,如电子邮件模板等,为开发者提供了极大的便利和灵活性。

在语法上,Thymeleaf提供了变量表达式、链接表达式、消息表达式等多种表达式,用于访问模板上下文中的变量、生成URL、支持国际化等功能。

Thymeleaf是一款功能强大、灵活易用的模板引擎,适用于各种Web和非Web应用场景。如需更多关于Thymeleaf模板引擎的信息,建议查阅其官方文档或相关教程。

1、主要特点

  • 动静结合:Thymeleaf模板既可以直接使用浏览器打开,查看页面的静态效果,也可以通过Web应用程序进行访问,查看动态页面效果。
  • 开箱即用:Thymeleaf提供了Spring标准方言以及一个与SpringMVC完美集成的可选模块,可以快速地实现表单绑定、属性编辑器、国际化等功能。
  • 多方言支持:它提供了Thymeleaf标准和Spring标准两种方言,可以直接套用模板实现JSTL、OGNL表达式。必要时,开发人员也可以扩展和创建自定义的方言。

此外,

2、变量表表达式

2.1、标准变量表达式

语法:${key}

作用:获取key对于的文本数据,key 是request作用域中的key,使用 request.setAttribute()model.addAttribute(),在页面中的 html标签中,使用 th:text="${key}"

<div style="margin-left: 400px">
    <h3>标准变量表达式:  ${key}</h3>
    <p th:text="${site}">key不存在</p>
    <br/>
    <p>获取SysUser对象 属性值</p>
    <p th:text="${myuser.id}">id</p>
    <p th:text="${myuser.name}">姓名</p>
    <p th:text="${myuser.sex}">姓名:m男</p>
    <p th:text="${myuser.age}">年龄</p>
    <p th:text="${myuser.getName()}">获取姓名使用getXXX</p>
</div>

2.2、选择变量表达式( 星号变量表达式)

语法:*{key}

作用:获取这个key对应的数据,{key} 需要和 th:object 这个属性一起使用。目的是简单获取对象的属性值。

<p>使用 *{} 获取SysUser的属性值</p>
	<div th:object="${myuser}">
		<p th:text="*{id}"></p>
		<p th:text="*{name}"></p>
		<p th:text="*{sex}"></p>
		<p th:text="*{age}"></p> 
	</div>
<p>使用*{}完成的表示 对象的属性值</p>
<p th:text="*{myuser.name}" ></p>

2.3、链接表达式

语法:@{url}

作用:表示链接

    <script src="..."> , <link href="..."> <a href=".."> ,<form action="..."> <img src="...">

3、Thymeleaf属性

属性是放在html元素中的,就是html元素的属性,加入了 th前缀 。属性的作用不变。加入上th,属性的值由模板引擎处理了。在属性可以使用变量表达式。

<form action="/loginServlet" method="post"></form>
<form th:action="/loginServlet" th:method="${methodAttr}"></form>

4、Thymeleaf语法

4.1、each

each循环, 可以循环List,Array

语法:在一个html标签中,使用 th:each

<div th:each="集合循环成员,循环的状态变量:${key}">
    <p th:text="${集合循环成员}" ></p>
</div>
集合循环成员,循环的状态变量:两个名称都是自定义的。 “循环的状态变量”这个名称可以不定义,默认是"集合循环成员Stat"

each循环Map

在一个html标签中,使用 th:each

<div th:each="集合循环成员,循环的状态变量:${key}">
    <p th:text="${集合循环成员.key}" ></p>
    <p th:text="${集合循环成员.value}" ></p>
</div>
集合循环成员,循环的状态变量:两个名称都是自定义的。 “循环的状态变量”这个名称可以不定义,默认是"集合循环成员Stat"
key:map集合中的key
value:map集合key对应的value值

4.2、th:if

"th:if" :判断语句,当条件为true,显示html标签体内,反之不显示没有else语句

语法:
<div th:if=" 10 > 0 "> 显示文本内容 </div>

还有一个 th:unlessth:if 相反的行为

语法:
<div th:unless=" 10 < 0 "> 当条件为false显示标签体内容 </div>

例子:th:if

<div style="margin-left: 400px">
        <h3> if 使用</h3>
        <p th:if="${sex=='m'}">性别是男</p>
        <p th:if="${isLogin}">已经登录系统</p>
        <p th:if="${age > 20}">年龄大于20</p>
        <!--""空字符是true-->
        <p th:if="${name}">name是“”</p>
        <!--null是false-->
        <p th:if="${isOld}"> isOld是null</p>
 </div>

例子: th:unless

 <div style="margin-left: 400px">
        <h3>unless: 判断条件为false,显示标签体内容</h3>
        <p th:unless="${sex=='f'}">性别是男的</p>
        <p th:unless="${isLogin}">登录系统</p>
        <p th:unless="${isOld}"> isOld是null </p>
 </div>

4.3、th:switch

th:switch 和Java中的 swith 一样的

语法:
<div th:switch="要比对的值">
    <p th:case="值1">
        结果1
    </p>
    <p th:case="值2">
        结果2
    </p>
    <p th:case="*">
        默认结果
    </p>
    以上的case只有一个语句执行    
</div>

4.4、th:inline

1、内联text:在html标签外,获取表达式的值

   <p>显示姓名是:[[${key}]]</p> 
   <div style="margin-left: 400px">
          <h3>内联 text, 使用内联表达式显示变量的值</h3>
          <div th:inline="text">
              <p>我是[[${name}]],年龄是[[${age}]]</p>
              我是<span th:text="${name}"></span>,年龄是<span th:text="${age}"></span>
          </div>
          <div>
              <p>使用内联text</p>
              <p>我是[[${name}]],性别是[[${sex}]]</p>
          </div>
   </div>

2、内联Javascript

例子:
 <script type="text/javascript" th:inline="javascript">
         var myname = [[${name}]];
         var myage = [[${age}]];

         //alert("获取的模板中数据 "+ myname + ","+myage)

        function fun(){
            alert("单击事件,获取数据 "+ myname + ","+ [[${sex}]])
        }
    </script>

4.5、字面量

 <div style="margin-left: 400px">
       <h3>文本字面量: 使用单引号括起来的字符串</h3>
       <p th:text="'我是'+${name}+',我所在的城市'+${city}">数据显示</p>

       <h3>数字字面量</h3>
       <p th:if="${20>5}"> 20大于 5</p>

       <h3>boolean字面量</h3>
       <p th:if="${isLogin == true}">用户已经登录系统</p>

       <h3>null字面量</h3>
       <p th:if="${myuser != null}">有myuser数据</p>
 </div>

4.6、字符串连接

1、语法使用单引号括起来字符串,使用 + 连接其他的字符串或者表达式

  <p th:text="'我是'+${name}+',我所在的城市'+${city}">数据显示</p>

2、语法使用双竖线, |字符串和表达式|

<p th:text="|我是${name},我所在城市${city|">
    显示数据
</p>

示例:

    <div style="margin-left: 400px">
       <h3>字符串连接方式1:使用单引号括起来的字符串</h3>
       <p th:text="'我是'+${name}+',我所在的城市'+${city}">数据显示</p>
        <br/>
        <br/>
        <h3>字符串连接方式2:|字符串和表达式|</h3>
        <p th:text="|我是${name},所在城市${city},其他人${myuser.name}|"></p>
    </div>

4.7、运算符

算术运 算: + , - - , * , / , %
关系比较 : > , < , >= , <= ( gt , lt , ge , le )
相等判断: == , != ( eq , ne )
<div style="margin-left: 400px">
	<h3>使用运算符</h3>
	<p th:text="${age > 10}">年龄大于 10 </p>
	<p th:text="${ 20 + 30 }">显示运算结果</p>
    <p th:if="${myuser == null}">myuser是null</p>
    <p th:if="${myuser eq null}">myuser是null</p>
    <p th:if="${myuser ne null}">myuser不是null</p>

    <p th:text="${isLogin == true ? '用户已经登录' : '用户需要登录'}"></p>
    <p th:text="${isLogin == true ? ( age > 10 ? '用户是大于10的' : '用户年龄比较小') : '用户需要登录'}"></p>
</div>
三元运算符:
 表达式  ? true的结果 : false的结果
三元运算符可以嵌套

4.8、内置对象

文档地址:内置对象描述

  • #request 表示 HttpServletRequest
  • #session 表示 HttpSession对象
  • session 表示Map对象的,是#session的简单表示方式,用来获取session中指定的key的值
  • #session.getAttribute("loginname") 等同于 session.loginname

这些是内置对象,可以在模板文件中直接使用。

<div style="margin-left: 350px">
	<h3>内置对象#request,#session,session的使用</h3>
	<p>获取作用域中的数据</p>
	<p th:text="${#request.getAttribute('requestData')}"></p>
	<p th:text="${#session.getAttribute('sessionData')}"></p>
	<p th:text="${session.loginname}"></p>
	<br/>
	<br/>
	<h3>使用内置对象的方法</h3>
	getRequestURL=<span th:text="${#request.getRequestURL()}"></span><br/>
	getRequestURI=<span th:text="${#request.getRequestURI()}"></span><br/>
	getQueryString=<span th:text="${#request.getQueryString()}"></span><br/>
	getContextPath=<span th:text="${#request.getContextPath()}"></span><br/>
	getServerName=<span th:text="${#request.getServerName()}"></span><br/>
	getServerPort=<span th:text="${#request.getServerPort()}"></span><br/>
</div>

4.9、内置工具类

内置工具类型: Thymeleaf自己的一些类,提供对string, date ,集合的一些处理方法

  • #dates:处理日器的工具类
  • #numbers:处理数字的
  • #lists:处理list集合的
<div style="margin-left: 350px">
	<h3>日期类对象 #dates</h3>
	<p th:text="${#dates.format(mydate )}"></p>
	<p th:text="${#dates.format(mydate,'yyyy-MM-dd')}"></p>
	<p th:text="${#dates.format(mydate,'yyyy-MM-dd HH:mm:ss')}"></p>
	<p th:text="${#dates.year(mydate)}"></p>
	<p th:text="${#dates.month(mydate)}"></p>
	<p th:text="${#dates.monthName(mydate)}"></p>
	<p th:text="${#dates.createNow()}"></p>
	<br/>
	<h3>内置工具类#numbers,操作数字的</h3>
	<p th:text="${#numbers.formatCurrency(mynum)}"></p>
	<p th:text="${#numbers.formatDecimal(mynum,5,2)}"></p>
	<br/>
	<h3>内置工具类#strings,操作字符串</h3>
	<p th:text="${#strings.toUpperCase(mystr)}"></p>
	<p th:text="${#strings.indexOf(mystr,'power')}"></p>
	<p th:text="${#strings.substring(mystr,2,5)}"></p>
	<p th:text="${#strings.substring(mystr,2)}"></p>
	<p th:text="${#strings.concat(mystr,'---java开发的黄埔军校---')}"></p>
	<p th:text="${#strings.length(mystr)}"></p>
	<p th:text="${#strings.length('hello')}"></p>
	<p th:unless="${#strings.isEmpty(mystr)}"> mystring 不是 空字符串  </p>
	<br/>
	<h3>内置工具类#lists,操作list集合</h3>
	<p th:text="${#lists.size(mylist)}"></p>
	<p th:if="${#lists.contains(mylist,'a')}">有成员a</p>
	<p th:if="!${#lists.isEmpty(mylist)}"> list 集合有多个成员</p>
	<br/>
	<h3>处理null</h3>
	<p th:text="${zoo?.dog?.name}"></p>
</div>
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值