Srping Boot FreeMarker获取ContextPath-自定义ViewResolver以及超简单内置方法

最近想用spring boot+freemarker做个新项目,在学习的过程中有一个地方真是把我坑惨了。那就是contextPath的获取。这个之前在jsp里实在是太简单了,然后我以为在ftl中也一样(最终结果告诉我确实也一样),但是中间的过程实在有点,,浪费时间。

不过还好自己尝试加上搜索解决了这个问题。有两个方法:

一,自定义ViewResolver

百度freemarker + contextPath,大多数人都会告诉你在配置文件中配置

 <property name="requestContextAttribute" value="request"/>

然后页面:

${request.contextPath}

就可以了。说起来这个确实是正确的方法,但是spring boot没有配置文件。。这要往哪儿改。经过一番艰苦卓绝的百度,我知道了ViewResolver这个东西,这个和配置文件中的配置视图解析器功能是一样的。于是就依葫芦画瓢,写了一个自定义的FreeMarker视图解析器,照着上面给的教程写了一下:

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
import org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver;

/**
 * Created by zhangpeng on 16-6-15.
 */
@Configuration
@EnableWebMvc
public class MvcConfig extends WebMvcConfigurerAdapter {
    @Bean
    public FreeMarkerViewResolver freeMarkerViewResolver() {
        FreeMarkerViewResolver resolver = new FreeMarkerViewResolver();
        resolver.setPrefix("");
        resolver.setSuffix(".ftl");
        resolver.setContentType("text/html; charset=UTF-8");
        resolver.setRequestContextAttribute("rc");
        return resolver;
    }
}

然后在ftl中:

${rc.contextPath}

完美解决。

注意一定要是FreeMarkerViewResolver,不能是其他,不然没有用。

二,spring自己提供的方法

说起这个真是泪流满面啊,方法一折腾了半天,虽然最终也解决了,但是感觉也挺啰嗦的。

然后我在idea里面的ftl页面中随便打了打,看看有没有什么提示,结果提示了有springMacroRequestContext这个内置对象。其实我也不知道这是什么玩意儿,就输入了个.想看看会有什么属性和方法。悲剧来了,智能提示的第一个就是contextPath。。。

合着我辛辛苦苦搞了半天,你这自己内置的就有啊!!真是一万匹草泥马飘过。。。

${springMacroRequestContext.contextPath}

就是这一句,可以直接获取到contextPath,不用任何设置。为什么网上从来没人说过呢。。。

时间: 2024-10-19 13:55:25

Srping Boot FreeMarker获取ContextPath-自定义ViewResolver以及超简单内置方法的相关文章

Spring boot Freemarker 获取ContextPath的方法

Spring boot Freemarker 获取ContextPath的两种方法: 1.自定义viewResolver,Spring boot中有一个viewResolver,这个和配置文件中的师徒解析器是一样的,但是spring boot不允许xml配置文件,所以可以写一个自定义的FreeMarker视图解析器. public class MvcConfig extends WebMvcConfigurerAdapter { @Bean public FreeMarkerViewResolv

反射、自定义内置方法来定制类的功能、元类

一.反射 1. 定义:通过字符串来操作类或者对象属性 2. 方法:hasattr.getattr.setattr.delattr 3. 使用方法: 1 class People: 2 def __init__(self,name): 3 self.name=name 4 def put(self): 5 print('%s is putting'%self.name) 6 def get(self): 7 print('%s get sth'%self.name) 8 def run(self)

自定义nginx访问日志和内置变量使用

自定义nginx访问日志和内置变量使用 安装第三方echo模块后查看内置变量 内置变量 1.$args 用户在浏览器中查找的相关参数(uri中?之后的字段)2.$document_root 站点根目录所在的位置3.$document_uri 去除url中域名部分后所剩下的目录4.$host 所访问的主机5.$http_user_agent 客户端所使用的浏览器6.$http_cookie 客户端的cookie信息7.$limit_rate 客户端的下载速率0表示不限制速度 server { se

自定义maven变量以及maven内置常量

本文转自:http://zheng12tian.iteye.com/blog/1770909 在创建Maven工程后,插件配置中通常会用到一些Maven变量,因此需要找个地方对这些变量进行统一定义,下面介绍如何定义自定义变量. 在根节点project下增加properties节点,所有自定义变量均可以定义在此节点内,如下所示: Java代码 <!-- 全局属性配置 --> <properties> <project.build.name>tools</projec

自定义内置方法来定制类的功能

1.__str__方法在对象被打印时,自动触发,应该在该方法内采集与对象self有关的信息,然后拼成字符串返回 class People: def __init__(self,name,age): self.name=name self.age=age def __str__(self): print('======>') return '<name:%s age:%s>' %(self.name,self.age) obj=People('egon',18) obj1=People('

python 获取类中除内置方法外的所有方法名

#!/usr/bin/env python# !-*- coding:utf-8 -*- class Menu: def __init__(self): pass def updateProject(self): pass def restartProject(self): pass def restartTomcat(self): pass def stopTomcat(self): pass def startTomcat(self): pass def methods(self): ret

python 动态获取当前运行的类名和函数名的方法

一.使用内置方法和修饰器方法获取类名.函数名 python中获取函数名的情况分为内部.外部,从外部的情况好获取,使用指向函数的对象,然后用__name__属性 复制代码代码如下: def a():passa.__name__ 除此之外还可以: 复制代码代码如下: getattr(a,'__name__') 尽管有些脱裤子放屁,总之,从外部获取的方法是非常灵活的. 有些同学需要从函数内部获取函数本身的名字,就需要用些技巧了.1.使用sys模块的方法: 复制代码代码如下: def a():print

Spring Boot 实战:如何自定义 Servlet Filter

1.前言 有些时候我们需要在 Spring Boot Servlet Web 应用中声明一些自定义的 Servlet Filter来处理一些逻辑.比如简单的权限系统.请求头过滤.防止 XSS 攻击等.本篇将讲解如何在 Spring Boot 应用中声明自定义 Servlet Filter 以及定义它们各自的作用域和顺序. 2. 自定义 Filter 可能有人说声明 Servlet Filter 不就是实现 Filter 接口嘛,没有什么好讲的!是的这个没错,但是很多时候我们并不想我们声明的 Fi

获取 AlertDialog自定义的布局 的控件

AlertDialog自定义的布局 效果图: 创建dialog方法的代码如下: 1 LayoutInflater inflater = getLayoutInflater(); 2 View layout = inflater.inflate(R.layout.dialog, 3 (ViewGroup) findViewById(R.id.dialog)); 4 new AlertDialog.Builder(this).setTitle("自定义布局").setView(layout