${属性名}可用于取值
在Spring中可在请求方法中将值放入 HttpServletRequest
, Model
, ModelMap
, ModeAndView
中,
其中
HttpServletRequest
, Model
, ModelMap
可以注入,
ModeAndView
要自己new
注入的 Model
和 ModelMap
实例相等==, 是同一个实例
例如
@RequestMapping("showVolt")
Object showVolt(Model m, ModelMap mm, HttpServletRequest req, HttpServletResponse resp) throws Exception{
//可以放值到HttpServletRequest HttpServletRequest可以注入
req.setAttribute("req", "放入HttpServletRequest中的值");
//可以放值到ModelAndView ModelAndView要自己new
ModelAndView mv = new ModelAndView("ac301/ac301.ftl");
mv.getModel().put("mv", "放入ModelAndView中的值");
// 可以放值到Model , Model可以注入
m.addAttribute("m", "放入Model中的值");
// model还有一个addAttribute单参数方法,可以不用取名设置key,
// 用类名开头小写调用
LinkedHashMap<Object,Object> moo = new LinkedHashMap<>();
m.addAttribute(moo);
// 可以放值到Model , Model可以注入
mm.put("ModelMap的put", "可以用ModelMap的put方法放入");
mm.addAttribute("ModelMap的Attribute", "可以用ModelMap的addAttribute方法放入");
//注入的Model和ModelMap是同一个实例
System.out.println("注入的Model是否==注入的ModelMap ? " + (m==mm) ); //结果是true
return mv;
// new了ModelAndView 就返回 ModelAndView,
// 没new 就直接返回地址字符串
//return "ac301/ac301.ftl"
}
在模板文件中调用
${req} 返回:放入HttpServletRequest中的值
${mv} 返回:放入ModelAndView中的值
${m} 返回:放入Model中的值
${linkedHashMap.x} 返回 moo.get(x)
${ModelMap的put} 返回 可以用ModelMap的put方法放入
${ModelMap的Attribute} 返回 可以用ModelMap的addAttribute方法放入
Model实例的setAttribute(Object 单参数)方法放入的实例, 可以通过类名第一个字母小写调用, 不用设置key 例如
Use 可以用 ${user} ,
AaBbCc 可以用 ${aaBbCc},
LinkedHashMap 可以用 ${linkedHashMap}
多个同类会取最后一个
${map.key} 可以返回Map的key对应的值
${public类实例名.方法名()} 可以得到方法的返回值, 比如getter方法
${public类实例名.xxx} 可得到 实例.getXxx(); 只能调用getter方法,不能直接调用属性
可以使用内部类, 静不静态都可以, 但必须是public
${属性名} //null值会报错 , 可以使用感叹号!
${属性名!} 可以用于空值替换
${PropertyName!}
如果PropertyName为空, 就输出空字符串(不输出)${PropertyName!"自定义默认值(null的替换值)必须加单引号或双引号"}
如果PropertyName为空, 就输出自定义的默认值${name} //null值会报错, 新版好像不会报错,和加了感叹号一样不输出
${name!} //null值为空
${name!'自定义默认值(null的替换值)必须加单引号或双引号'}
${name!"可以用双引号"}
${name!'可以用单引号'}
插值结果为数字值
<#settion number_format="currency"/>
<#assign answer=42/>
${answer}
${answer?string}
${answer?string.number}
${answer?string.currency}
${answer?string.percent}
${answer}
执行输出结果:
$42.00
$42.00
42
$42.00
4,200%
${book.name?if_exists } //用于判断如果存在,就输出这个值
${book.name?default(‘xxx’)}//默认值xxx
${book.name!"xxx"}//默认值xxx
${book.date?string('yyyy-MM-dd')} //日期格式
${book?string.number} 20 //三种不同的数字格式
插值结果为日期值
根据默认格式(由#setting指令设置)将表达式结果转换成文本输出.可以使用内建的字符串函数格式化单个插值。
${lastUpdated?string("yyyy-MM-dd HH:mm:ss zzzz")}
${lastUpdated?string("EEE, MMM d, ''yy")}
${lastUpdated?string("EEEE, MMMM dd, yyyy, hh:mm:ss a '('zzz')'")}
执行输出结果:
2008-04-08 08:08:08 Pacific Daylight Time
Tue, Apr 8, '03
Tuesday, April 08, 2003, 08:08:08 PM (PDT)
插值结果为布尔值
根据默认格式(由#setting指令设置)将表达式结果转换成文本输出.可以使用内建的字符串函数格式化单个插值。
<#assign foo=true/>
${foo?string("yes", "no")}
执行输出结果:
yes
在${}使用 小写字母r
接两个单引号或两个双引号包裹的内容可以原样输出, 字母r
只能用小写
${r'想要原样输出的内容'}
--用了单引号${r"想要原样输出的内容"}
--用了双引号例子:
${r"${r''}"} 得到 ${r''}
${r'${r""}'} 得到 ${r""}
${r"Hello"} 得到 Hello
${r'World'} 得到 World
${emp.name?if_exists} // 变量存在,输出该变量,否则不输出
${emp.name!} // 变量存在,输出该变量,否则不输出
${emp.name?default("xxx")} // 变量不存在,取默认值xxx
${emp.name!"xxx"} // 变量不存在,取默认值xxx
${"123
456"?html} // 对字符串进行HTML编码,对html中特殊字符进行转义
${"str"?cap_first} // 使字符串第一个字母大写
${"Str"?lower_case} // 将字符串转换成小写
${"Str"?upper_case} // 将字符串转换成大写
${"str"?trim} // 去掉字符串前后的空白字符
$ { “你好$ {emp.name!}”} //输出你好+变量名
$ {“hello”+ emp.name!} //使用+号来连接,输出你好+变量名
<#assign str =“abcdefghijklmn”/>
//方法1
$ {str?substring(0,4)} //输出abcd
//方法2
$ { str [ 0 ] } $ {str [4]} //结果是ae
$ {str [1..4]} //结果是bcde
//返回指定字符的索引
$ {str?index_of("n")}
日期输出
$ {emp.date?string('yyyy -MM-dd')} //日期格式
<#setting number_format =“percent”/> //设置数字默认输出方式('percent',百分比)
<#assign answer = 42 /> //声明变量回答42
#{answer} //输出4,200%
$ {answer?string} //输出4,200%
$ {answer?string.number} //输出42
$ {answer?string.currency} //输出¥42.00
$ {answer?string.percent} //输出4,200%
#{answer} //输出42
数字格式化插值可采用#{expr; format}形式来格式化数字,其中格式可以是:
mX:小数部分最小X位
MX:小数部分最大X位
如下面的例子:
<#assign x = 2.582 /> <#assign y = 4 />
# {x; M2} //输出2.58
# {y; M2} //输出4
# {x; m2} //输出2.58
#{Y; m2} //输出4.0
# {x; m1M2} //输出2.58
# {x; m1M2} //输出4.0