一 、 SpringBoot环境下的视图解析技术

1. JSP

但我们还是简单的看一下它的使用方法:

  • 主启动器
@SpringBootApplication
@EnableAutoConfiguration(exclude={DataSourceAutoConfiguration.class})
public class SpringBootViewJspApplication {

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

}

注意

注解如下:

@EnableAutoConfiguration(exclude={DataSourceAutoConfiguration.class})
  • handler
@Controller
public class ShowViewHandler {

	@RequestMapping("/show/view")
	public String toTarget(Model model) {

		model.addAttribute("attrName", "double kill");

		return "target";
	}
}
  • springBoot的视图解析器配置: application.yml
spring:
  mvc: 			# springmvc
    view:			#视图
      prefix: /WEB-INF/  # 前缀
      suffix: .jsp		#后缀
  • jsp
<body>
    <h1>target</h1>
    ${requestScope.attrName }

  </body>

加入依赖:

	<dependency>
			<groupId>org.apache.tomcat.embed</groupId>
			<artifactId>tomcat-embed-jasper</artifactId>
			<scope>provided</scope>
            <!--加载jsp页面所用的-->
		</dependency>
		<dependency>
			<groupId>javax.servlet</groupId>
			<artifactId>jstl</artifactId>
		</dependency>

2.Freemarker模板引擎技术

①概念

②工作原理

所有的模板视图技术的工作原理基本类似,也就意味着FreeMarker和JSP基本差不多。模板文件和数据模型是模板视图技术用来生成HTML页面所必须的组成部分。

数据模型(Java) + 模板文件(.ftl .jsp文件)= 输出(HTML,XML,源码文件)
  <dependency>
        <groupId>org.freemarker</groupId>
        <artifactId>freemarker</artifactId>
        <version>2.3.19</version>
    </dependency>

用在SpringMVC中是需要加入对应的视图解析器

<bean id="freemarkerConfig"
	class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer">
	<!-- <property name="templateLoaderPath" value="/WEB-INF/ftl/" /> --> 
	<property name="templateLoaderPaths">
		<list>
			<value>/WEB-INF/ftl/</value>      
			<value>classpath:/ftl/</value>
		</list>
	</property>
	<property name="freemarkerSettings">
		<props>
			<prop key="defaultEncoding">UTF-8</prop>
			<!-- FreeMarker默认每隔5秒检查模板是否被更新,如果已经更新了,就会重新加载并分析模板。 但经常检查模板是否更新可能比较耗时。如果你的应用运行在生产模式下,而且你预期模板不会经常更新,
				则可以将更新的延迟时间延长至一个小时或者更久。 可以通过为freemarkerSettings属性设置template_update_delay达到这一目的,0
				表示每次都重新加载 -->
			<prop key="template_update_delay">0</prop>
			<prop key="default_encoding">UTF-8</prop>
			<prop key="number_format">0.##########</prop>
			<prop key="datetime_format">yyyy-MM-dd HH:mm:ss</prop>
			<prop key="classic_compatible">true</prop>
			<prop key="template_exception_handler">ignore</prop>
		</props>
	</property>
</bean>

<bean
	class="org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver"
	p:prefix="/" p:suffix=".ftl">
	<property name="cache" value="false" />
	<property name="viewClass"
		value="org.springframework.web.servlet.view.freemarker.FreeMarkerView" />
	<property name="contentType" value="text/html;charset=UTF-8"></property>
	<property name="exposeRequestAttributes" value="true" />
	<property name="exposeSessionAttributes" value="true" />
	<property name="exposeSpringMacroHelpers" value="true" />
	<property name="requestContextAttribute" value="base"></property>
	<property name="order" value="0"></property>
</bean>

③基本语法

FreeMarker将会输出真实的值来替换大括号内的表达式,这样的表达式被称为interpolation(插值)。

注释和HTML的注释也很相似,但是它们使用<#-- and -->来标识。不像HTML注释那样,FTL注释不会出现在输出中(不出现在访问者的页面中),因为FreeMarker会跳过它们。

  • FTL标签和HTML标签有一些相似之处,但是它们是FreeMarker的指令,是不会在输出中打印的。这些标签的名字以#开头。(用户自定义的FTL标签则需要使用@来代替#)

④ 例子

Freemarker模板引擎技术实例

①bean.ftl文件(在工程下,与pom.xml同级)

package ${packageName}.bean

public class ${className} {

	private Integer ${fieldName}Id;
	private String ${fieldName}Name;
	private Double ${fieldName}Price;

	public ${className}(){

	}

	public ${className}(Integer ${fieldName}Id,String ${fieldName}Name,Double ${fieldName}Price){

		this.Integer ${fieldName}Id=Integer ${fieldName}Id;
		this.String ${fieldName}Name=String ${fieldName}Name;
		this.Double ${fieldName}Price=Double ${fieldName}Price;

	}

	public Integer get${propName}Id(){
		return this.${fieldName}Id;
	}

	public void set${propName}Id(Integer ${fieldName}Id){
		this.${fieldName}Id = ${fieldName}Id;
	}

	public String get${propName}Name(){
	 	return this.${fieldName}Name;
	}

	public void set${propName}Name(String ${fieldName}Name){
		this.${fieldName}Name = ${fieldName}Name;
	}

	public Double get${propName}Price(){
		return this.${fieldName}Price;
	}
	public void set${propName}Price(Double ${fieldName}Price){
		this.${fieldName}Price = ${fieldName}Price;
	}

}

② Java代码

public class FreeMarkerTest {

	public static void main(String[] args) throws Exception {

        // 创建Freemarker对象的配置对象
        Configuration cfg = new Configuration();
        // 设定默认的位置(路径)
        cfg.setDirectoryForTemplateLoading(new File(""));
        cfg.setDefaultEncoding("UTF-8");
        cfg.setTemplateExceptionHandler(TemplateExceptionHandler.RETHROW_HANDLER);

        // 数据
        Map paramMap = new HashMap();

        String className = "User";

        paramMap.put("packageName", "com.atguigu.crowdfunding");
        paramMap.put("className", className);

        Template t = cfg.getTemplate("bean.ftl");
        // 组合生成
        Writer out = new OutputStreamWriter(new FileOutputStream(new File("User.java")), "UTF-8");
        // 执行
        t.process(paramMap, out);


        	}
}
  • 执行java编译

③模板生成的javabean

public class Employee {


	private Integer empId;
	private String empName;
	private Double empPrice;

	public Employee(){

	}

	public Employee(Integer empId,String empName,Double empPrice){

		this.Integer empId=Integer empId;
		this.String empName=String empName;
		this.Double empPrice=Double empPrice;

	}
    ........
    ...........以下省略

⑤常用语法

【1】条件

【2】循环

【3】包含

【4】 表达式

${Request.member.name}从Request域读取数据
${Session.member.name}从Session域读取数据
${Application.member.name}从Application域读取数据
${RequestParameters['id']}读取请求参数
${book.name?if_exists }用于判断如果存在,就输出这个值
${book.name?default(‘xxx’)}默认值xxx
${book.name!"xxx"}默认值xxx
${book.date?string('yyyy-MM-dd')}日期格式
s?html对字符串进行HTML编码
s?cap_first使字符串第一个字母大写
s?lower_case将字符串转换成小写
s?trim去掉字符串前后的空白字符
s?size获得序列中元素的数目
  • 示例 :

           存 储:

           model.addAttribute("message", "getMessage");
           session.setAttribute("Love", "wenmin");
	   session.getServletContext().setAttribute("zuiai", "wenxing");

取数据:

       ${Request.message}
       ${Session.Love}
       ${Application.zuiai}

3.SpringBoot中使用FreeMarker

①依赖

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

②增加相关配置

其中最重要的是spring.freemarker.suffix和spring.freemarker.template-loader-path,其他配置项可以使用默认值。

【1】主启动器:

  • 此处省略.....这是springBoot中默认要有的

【2】handler方法

@RequestMapping("/testftl")
	public String testFtl(Model model) {
		model.addAttribute("message", "getMessage");
		session.setAttribute("Dream", "wenmin");
		session.getServletContext().setAttribute("sinian", "wenxing");

		return "hello";
	}

【3】配置文件 -- application.yml

spring:
  freemarker:
    suffix: .ftl
    template-loader-path: classpath:/templates/
server:
  port: 1234

logging:
  level:
    root: INFO
  path: /springboot/log

【4】前端页面:hello.ftl == 》 工程名下的templates 目录下


<!DOCTYPE html>
<html lang="zh-CN">
  <head>
  </head>

  <body>
	<h1>hello</h1>

		${Request.message}
       ${Session.Love}
       ${Application.zuiai}
  </body>
</html>

4.热部署

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

热部署的作用是对当前工程的配置文件、handler在修改后,会在保存刷新后进行自动重新加载内置的Tomcat,在控制台打印初始化情况,其主要监听范围是application.yml和application.properties配置文件、handler。

5.日志配置

logging:
  level:
    root: INFO
  path: /springboot/log

作用:

保存位置 :

02-12 06:38
查看更多