??xml version="1.0" encoding="utf-8" standalone="yes"?>久久一区二区三区av,亚洲视频在线一区,最新天堂资源在线http://www.aygfsteel.com/Todd/category/41618.htmlpoint and net zh-cnSat, 26 Sep 2009 21:16:00 GMTSat, 26 Sep 2009 21:16:00 GMT60FreeMarke开发指?/title><link>http://www.aygfsteel.com/Todd/archive/2009/09/23/296111.html</link><dc:creator>Todd</dc:creator><author>Todd</author><pubDate>Wed, 23 Sep 2009 01:32:00 GMT</pubDate><guid>http://www.aygfsteel.com/Todd/archive/2009/09/23/296111.html</guid><wfw:comment>http://www.aygfsteel.com/Todd/comments/296111.html</wfw:comment><comments>http://www.aygfsteel.com/Todd/archive/2009/09/23/296111.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/Todd/comments/commentRss/296111.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/Todd/services/trackbacks/296111.html</trackback:ping><description><![CDATA[<p align="center">FreeMarke开发指?/p> <p><br /> 1概念<br /> 2指o<br /> if, else, elseif <br /> switch, case, default, break<br /> list, break <br /> include <br /> Import <br /> compress <br /> escape, noescape <br /> assign <br /> global <br /> setting <br /> macro, nested, return<br /> t, lt, rt <br /> 3一些常用方法或注意事项 <br /> 表达式{换类 <br /> 数字循环 <br /> ҎQ点取整数 <br /> l变量默认?nbsp;<br /> 判断对象是不是null <br /> 常用格式化日?nbsp;<br /> d全局׃n变量数据模型 <br /> 直接调用java对象的方?nbsp;<br /> 字符串处?内置Ҏ) <br /> 在模杉K对sequences和hashes初始?nbsp;<br /> 注释标志 <br /> sequences内置Ҏ <br /> hashes内置Ҏ <br /> 4 freemarker在web开发中注意事项 <br /> web中常用的几个对象 <br /> view中值的搜烦序 <br /> 在模杉Kftl里用标{?nbsp;<br /> 如何初始化共享变?nbsp;<br /> 与webwork整合配置 <br /> 5高Ҏ <br /> 自定义方?nbsp;<br /> 自定?Transforms </p> <p>                                  <br /> 1概念<br /> 最常用?个概?br /> sequence  序列Q对应java里的list、数l等非键值对的集?br /> hash      键值对的集?br /> namespace 对一个ftl文g的引?利用q个名字可以讉K到该ftl文g的资?/p> <p>2指o<br /> if, else, elseif<br /> 语法<br /> <#if condition><br />   ...<br /> <#elseif condition2><br />   ...<br /> <#elseif condition3><br />   ...<br /> ...<br /> <#else><br />   ...<br /> </#if><br /> 用例<br /> <#if x = 1><br />   x is 1<br /> </#if></p> <p><#if x = 1><br />   x is 1<br /> <#else><br />   x is not 1<br /> </#if></p> <p>switch, case, default, break<br /> 语法<br /> <#switch value><br />   <#case refValue1><br />     ...<br />     <#break><br />   <#case refValue2><br />     ...<br />     <#break><br />   ...<br />   <#case refValueN><br />     ...<br />     <#break><br />   <#default><br />     ...<br /> </#switch></p> <p>用例<br /> 字符?br /> <#switch being.size><br />   <#case "small"><br />      This will be processed if it is small<br />      <#break><br />   <#case "medium"><br />      This will be processed if it is medium<br />      <#break><br />   <#case "large"><br />      This will be processed if it is large<br />      <#break><br />   <#default><br />      This will be processed if it is neither<br /> </#switch><br /> 数字<br /> <#switch x><br />   <#case x = 1><br />     1<br />   <#case x = 2><br />     2<br />   <#default><br />     d<br /> </#switch></p> <p>如果x=1 输出 1 2, x=2输出 2, x=3 输出d</p> <p>list, break<br /> 语法<br /> <#list sequence as item><br /> ...<br /> <#if item = "spring"><#break></#if><br /> ...<br /> </#list><br /> 关键?br /> item_index:是list当前值的下标<br /> item_has_next:判断list是否q有?/p> <p>用例<br /> <#assign seq = ["winter", "spring", "summer", "autumn"]><br /> <#list seq as x><br />   ${x_index + 1}. ${x}<#if x_has_next>,</#if><br /> </#list></p> <p>输出<br />   1. winter,<br />   2. spring,<br />   3. summer,<br />   4. autumn   </p> <p><br /> include<br /> 语法<br /> <#include filename><br /> or<br /> <#include filename options><br /> options包含两个属?br /> encoding=”GBK” ~码格式<br /> parse=true 是否作ؓftl语法解析,默认是trueQfalse是以文本方式引?注意在ftl文g里布值都是直接赋值的如parse=true,而不是parse=”true”<br /> 用例<br /> /common/copyright.ftl包含内容<br /> Copyright 2001-2002 ${me}<br><br /> All rights reserved.  <br /> 模板文g<br /> <#assign me = "Juila Smith"><br /> <h1>Some test</h1><br /> <p>Yeah.<br /> <hr><br /> <#include "/common/copyright.ftl" encoding=”GBK”> <br /> 输出l果<br /> <h1>Some test</h1><br /> <p>Yeah.<br /> <hr><br /> Copyright 2001-2002 Juila Smith<br /> All rights reserved.  </p> <p>Import<br /> 语法<br /> <#import path as hash><br /> cM于java里的import,它导入文Ӟ然后可以在当前文g里用被导入文g里的宏组?/p> <p>用例</p> <p>假设mylib.ftl里定义了宏copyright那么我们在其他模杉K面里可以q样使用<br /> <#import "/libs/mylib.ftl" as my></p> <p><@my.copyright date="1999-2002"/></p> <p>"my"在freemarker里被UCnamespace</p> <p>compress<br /> 语法<br /> <#compress><br />   ...<br /> </#compress><br /> 用来压羃I白I间和空白的?br /> 用例<br /> <#assign x = "    moo  \n\n   "><br /> (<#compress><br />   1 2  3   4    5<br />   ${moo}<br />   test only</p> <p>  I said, test only</p> <p></#compress>)  <br /> 输出<br /> (1 2 3 4 5<br /> moo<br /> test only<br /> I said, test only) <br /> escape, noescape<br /> 语法<br /> <#escape identifier as expression><br />   ...<br />   <#noescape>...</#noescape><br />   ...<br /> </#escape><br /> 用例<br /> 主要使用在相似的字符串变量输出,比如某一个模块的所有字W串输出都必Lhtml安全的,q个时候就可以使用该表辑ּ<br /> <#escape x as x?html><br />   First name: ${firstName}<br />   <#noescape>Last name: ${lastName}</#noescape><br />   Maiden name: ${maidenName}<br /> </#escape><br /> 相同表达?nbsp; <br />   First name: ${firstName?html}<br />   Last name: ${lastName }<br />   Maiden name: ${maidenName?html}<br /> assign<br /> 语法<br /> <#assign name=value><br /> or<br /> <#assign name1=value1 name2=value2 ... nameN=valueN><br /> or<br /> <#assign same as above... in namespacehash><br /> or<br /> <#assign name><br />   capture this<br /> </#assign><br /> or<br /> <#assign name in namespacehash><br />   capture this<br /> </#assign><br /> 用例<br /> 生成变量,q且l变量赋?br /> lseasons赋予序列?br /> <#assign seasons = ["winter", "spring", "summer", "autumn"]></p> <p>l变量test?<br /> <#assign test = test + 1></p> <p>lmy namespage 赋予一个变量bgColor,下面可以通过my.bgColor来访问这个变?br /> <#import "/mylib.ftl" as my><br /> <#assign bgColor="red" in my></p> <p>一D输出的文本作ؓ变量保存在x?br /> 下面的阴影部分输出的文本被赋值给x<br /> <#assign x><br />   <#list 1..3 as n><br />     ${n} <@myMacro /><br />   </#list><br /> </#assign><br /> Number of words: ${x?word_list?size}<br /> ${x}</p> <p><#assign x>Hello ${user}!</#assign>     error<br /> <#assign x=” Hello ${user}!”>         true</p> <p>同时也支持中文赋|如:<br /> <#assign 语法><br />   java<br /> </#assign><br /> ${语法}<br /> 打印输出:<br /> java<br /> global<br /> 语法<br /> <#global name=value><br /> or<br /> <#global name1=value1 name2=value2 ... nameN=valueN><br /> or<br /> <#global name><br />   capture this<br /> </#global></p> <p>全局赋D法,利用q个语法l变量赋|那么q个变量在所有的namespace中是可见?如果q个变量被当前的assign语法覆盖 ?lt;#global x=2> <#assign x=1> 在当前页面里x=2被隐藏Q或者通过${.global.x}来访?/p> <p>setting<br /> 语法<br /> <#setting name=value><br /> 用来讄整个pȝ的一个环?br /> locale<br /> number_format<br /> boolean_format<br /> date_format, time_format, datetime_format<br /> time_zone<br /> classic_compatible<br /> 用例<br /> 假如当前是匈牙利的设|,然后修改成美?br /> ${1.2}<br /> <#setting locale="en_US"><br /> ${1.2}  <br /> 输出<br /> 1,2<br /> 1.2<br /> 因ؓ匈牙利是采用“,”作ؓ十进制的分隔W,国是用“.”</p> <p> </p> <p>macro, nested, return<br /> 语法</p> <p><#macro name param1 param2 ... paramN><br />   ...<br />   <#nested loopvar1, loopvar2, ..., loopvarN><br />   ...<br />   <#return><br />   ...<br /> </#macro><br /> 用例<br /> <#macro test foo bar="Bar" baaz=-1><br />   Test text, and the params: ${foo}, ${bar}, ${baaz}<br /> </#macro><br /> <@test foo="a" bar="b" baaz=5*5-2/><br /> <@test foo="a" bar="b"/><br /> <@test foo="a" baaz=5*5-2/><br /> <@test foo="a"/> <br /> 输出<br />   Test text, and the params: a, b, 23<br />   Test text, and the params: a, b, -1<br />   Test text, and the params: a, Bar, 23<br />   Test text, and the params: a, Bar, -1<br /> 定义循环输出的宏<br /> <#macro list title items><br />   <p>${title?cap_first}:<br />   <ul><br />     <#list items as x><br />       <li>${x?cap_first}<br />     </#list><br />   </ul><br /> </#macro><br /> <@list items=["mouse", "elephant", "python"] title="Animals"/><br /> 输出l果  <br /> <p>Animals:<br />   <ul><br />       <li>Mouse<br />       <li>Elephant<br />       <li>Python<br />   </ul><br /> 包含body的宏<br /> <#macro repeat count><br />   <#list 1..count as x><br />     <#nested x, x/2, x==count><br />   </#list><br /> </#macro><br /> <@repeat count=4 ; c halfc last><br />   ${c}. ${halfc}<#if last> Last!</#if><br /> <<a>/@repeat</a>> <br /> 输出<br /> 1. 0.5<br />   2. 1<br />   3. 1.5<br />   4. 2 Last!</p> <p> </p> <p><br /> t, lt, rt<br /> 语法<br /> <#t> L左右I白和回车换?/p> <p><#lt>L左边I白和回车换?/p> <p><#rt>L双I白和回车换?/p> <p><#nt>取消上面的效?/p> <p><br /> 3一些常用方法或注意事项</p> <p><br /> 表达式{换类<br /> ${expression}计算expressionq输?br /> #{ expression }数字计算#{ expression ;format}安格式输出数字format为M和m<br /> M表示数点后最多的位数,m表示数点后最的位数?{121.2322;m2M2}输出121.23</p> <p> </p> <p><br /> 数字循环<br /> 1..5 表示??Q原型number..number<br /> ҎQ点取整数<br /> ${123.23?int} 输出123<br /> l变量默认?br /> ${var?default(“hello world<br>”)?html}如果var is null那么会被hello world<br>替代</p> <p>判断对象是不是null<br />     <#if mouse?exists><br />       Mouse found<br /> <#else><br /> 也可以直?{mouse?if_exists})输出布尔?br /> 常用格式化日?br />  openingTime必须是Date?详细查看freemarker文档 Reference->build-in referece->build-in for date</p> <p>${openingTime?date}<br /> ${openingTime?date_time}<br /> ${openingTime?time}</p> <p>d全局׃n变量数据模型<br /> 在代码里的实?br />     cfg = Configuration.getDefaultConfiguration();<br /> cfg.setSharedVariable("global", "you good"); <br /> 面实现可以通过global指o,具体查看指o里的global部分<br /> 直接调用java对象的方?br /> ${object.methed(args)}  </p> <p>字符串处?内置Ҏ)<br /> html安全输出<br /> “abc<table>sdfsf”?html <br /> q回安全的html输出,替换掉html代码<br /> xml安全输出<br /> var?xml   <br /> substring的用?br /> <#assign user=”hello jeen”><br /> ${user[0]}${user[4]} <br /> ${user[1..4]}<br /> 输出 :<br /> ho<br /> ello  <br /> cMString.split的用?<br />  “abc;def;ghi”?split(“;”)q回sequence<br /> 字W串按空D{化成sequence,然后取sequence的长?br />      var?word_list  效果?var?split(“ ”) <br />  var?word_list?size</p> <p>取得字符串长?br /> var?length</p> <p>大写输出字符<br /> var?upper_case</p> <p>写输出字符<br /> var?lower_case</p> <p>首字W大?br /> var?cap_first</p> <p>首字W小?br /> var?uncap_first</p> <p>L字符串前后空?<br /> var?trim</p> <p>每个单词的首字符大写<br /> var?capitalize</p> <p>cMString.indexof: <br />  “babcdabcd”?index_of(“abc”) q回1<br />  “babcdabcd”?index_of(“abc”,2) q回5<br /> cMString.lastIndexOf <br />  last_index_of和String.lastIndexOfcM,同上</p> <p>下面两个可能在代码生成的时候用(在引号前?#8221;\”Q?br /> j_string: 在字W串引号前加”\”<br />  <#assign beanName = 'The "foo" bean.'><br />  String BEAN_NAME = "${beanName?j_string}";<br /> 打印输出:<br />  String BEAN_NAME = "The \"foo\" bean.";<br /> js_string:<br />  <#assign user = "Big Joe's \"right hand\"."><br /> <script><br />   alert("Welcome ${user}!");<br /> </script>  <br /> 打印输出<br />  alert("Welcome Big Joe\'s \"right hand\"!");</p> <p>替换字符?replace<br /> ${s?replace(‘ba’, ‘XY’ )}<br /> ${s?replace(‘ba’, ‘XY’ , ‘规则参数’)}s里的所有的ba替换成xy 规则参数包含: i r m s c f 具体含义如下:<br /> · i: 大小写不区分.<br /> · f: 只替换第一个出现被替换字符串的字符?br /> · r:  XY是正则表辑ּ<br /> · m: Multi-line mode for regular expressions. In multi-line mode the expressions ^ and $ match just after or just before, respectively, a line terminator or the end of the string. By default these expressions only match at the beginning and the end of the entire string.<br /> · s: Enables dotall mode for regular expressions (same as Perl singe-line mode). In dotall mode, the expression . matches any character, including a line terminator. By default this expression does not match line terminators.<br /> · c: Permits whitespace and comments in regular expressions.</p> <p><br /> 在模杉K对sequences和hashes初始?br /> sequences  </p> <p>1. [“you”,”me”,”he”] <br /> 2. 1..100<br /> 3. [ {“Akey”:”Avalue”},{“Akey1”:”Avalue1”},<br /> {“Bkey”:”Bvalue”},{“Bkey1”:”Bvalue1”},<br /> ]</p> <p>  <br /> hashes      {“you”:”a”,”me”:”b”,”he”:”c”}</p> <p><br /> 注释标志<br /> <#-- <br /> q里是注?<br /> --><br /> 旧版本的freemarker采用的是<#comment> 注释 </#comment>Ҏ</p> <p>sequences内置Ҏ<br /> sequence?first<br /> q回sequence的第一个?前提条gsequence不能是null<br /> sequence?last<br />  q回sequence最后一个?br /> sequence?reverse<br />  反{sequence的?br /> sequence?size<br />  q回sequence的大?br /> sequence?sort<br />  对sequence按里面的对象toString()的结果进行排?br /> sequence?sort_by(value)<br /> 对sequence 按里面的对象的属性valueq行排序<br /> ? sequence里面攑օ的是10 个user对象Quser对象里面包含name,age{属?br /> sequence?sort_by(name) 表示所有的user按user.nameq行排序<br /> hashes内置Ҏ<br /> hash?keys<br />  q回hash里的所有keys, q回l果cdsequence<br /> hash?values<br />  q回hash里的所有value, q回l果cdsequence<br /> 4 freemarker在web开发中注意事项<br /> freemarker与webwork整合<br /> web中常用的几个对象<br /> Freemarker的ftl文g中直接用内部对?<br /> ${Request ["a"]}<br /> ${RequestParameters["a"]}<br /> ${Session ["a"]}<br /> ${Application ["a"]}<br /> ${JspTaglibs ["a"]}</p> <p>与webwork整合之后 通过配置的servlet 已经把request,session{对象置入了数据模型?br /> 在view中存在下面的对象<br />   我们可以在ftl?{req}来打印req对象<br /> · req - the current HttpServletRequest <br /> · res - the current HttpServletResponse <br /> · stack - the current OgnlValueStack <br /> · ognl - the OgnlTool instance <br /> · webwork - an instance of FreemarkerWebWorkUtil <br /> · action - the current WebWork action <br /> · exception - optional the Exception instance, if the view is a JSP exception or Servlet exception view <br /> view中值的搜烦序<br /> ${name}会以下面的序查找name?br /> · freemarker variables <br /> · value stack <br /> · request attributes <br /> · session attributes <br /> · servlet context attributes <br /> 在模杉Kftl里用标{?br /> 注意Q如果标{属性值是数字Q那么必采用nubmer=123方式l属性赋?br /> JSP面<br /> <<a href="mailto:%@page">%@page</a> contentType="text/html;charset=ISO-8859-2" language="java"%><br /> <<a href="mailto:%@taglib">%@taglib</a> uri="/WEB-INF/struts-html.tld" prefix="html"%><br /> <<a href="mailto:%@taglib">%@taglib</a> uri="/WEB-INF/struts-bean.tld" prefix="bean"%></p> <p><html><br />   <body><br />     <h1><bean:message key="welcome.title"/></h1><br />     <html:errors/><br />     <html:form action="/query"><br />       Keyword: <html:text property="keyword"/><br><br />       Exclude: <html:text property="exclude"/><br><br />       <html:submit value="Send"/><br />     </html:form><br />   </body><br /> </html> <br /> 模板ftl面<br /> <#assign html=JspTaglibs["/WEB-INF/struts-html.tld"]><br /> <#assign bean=JspTaglibs["/WEB-INF/struts-bean.tld"]></p> <p><html><br />   <body><br />     <h1><@bean.message key="welcome.title"/></h1><br />     <@html.errors/><br />     <@html.form action="/query"><br />       Keyword: <@html.text property="keyword"/><br><br />       Exclude: <@html.text property="exclude"/><br><br />       <@html.submit value="Send"/><br />     <<a>/@html.form</a>><br />   </body><br /> </html>  </p> <p><br /> 如何初始化共享变?br /> 1Q?nbsp;初始化全局׃n数据模型<br /> freemark在web上用的时候对׃n数据的初始化支持的不?不能在配|初始化的时候实玎ͼ而必通过ftl文g来初始化全局变量。这是不能满主需求的Q我们需要在servlet init的时候留Z个接口来初始化系l的׃n数据<br /> ? 体到和webwork整合,因ؓ本nwebwork提供了整合servlet,如果要增加全局׃n变量Q可以通过修改 com.opensymphony.webwork.views.freemarker.FreemarkerServlet来实?我们可以在这? servlet初始化的时候来初始化全局׃n变量<br /> 与webwork整合配置<br /> 配置web.xml<br /> <servlet><br />     <servlet-name>freemarker</servlet-name><br />     <servlet-class>com.opensymphony.webwork.views.freemarker.FreemarkerServlet</servlet-class><br />     <init-param><br />       <param-name>TemplatePath</param-name><br /> <param-value>/</param-value><br /> <!—模板蝲入文件夹Q这里相对context rootQ递归获取该文件夹下的所有模?-><br />     </init-param><br />     <init-param><br />       <param-name>NoCache</param-name> <!—是否对模板~存--><br />       <param-value>true</param-value><br />     </init-param><br />     <init-param><br />       <param-name>ContentType</param-name><br />       <param-value>text/html</param-value><br />     </init-param><br />     <init-param><br /> <param-name>template_update_delay</param-name><br /> <!—模板更新时?0表示每次都更?q个适合开发时?-><br />       <param-value>0</param-value><br />     </init-param><br />     <init-param><br />       <param-name>default_encoding</param-name><br />       <param-value>GBK</param-value><br />     </init-param><br />     <init-param><br />       <param-name>number_format</param-name><br />       <param-value>0.##########</param-value><!—数字显C格?-><br />     </init-param><br />     <load-on-startup>1</load-on-startup><br />   </servlet><br />   <servlet-mapping><br />     <servlet-name>freemarker</servlet-name><br />     <url-pattern>*.ftl</url-pattern><br />   </servlet-mapping></p> <p>5高Ҏ<br /> 自定义方?br /> ${timer("yyyy-MM-dd H:mm:ss", x)}<br /> ${timer("yyyy-MM-dd ", x)} </p> <p>在模板中除了可以通过对象来调用方法外Q?{object.methed(args)}Q也可以直接调用java实现的方法,javacdd现接 口TemplateMethodModel的方法exec(List args). 下面以把毫秒的时间{换成按格式输出的旉Z?br /> public class LongToDate implements TemplateMethodModel {<br />     <br /> public TemplateModel exec(List args) throws TemplateModelException {<br /> SimpleDateFormat mydate = new SimpleDateFormat((String) args.get(0)));<br />         return mydate.format(new Date(Long.parseLong((String)args.get(1)));<br />     }<br /> }  <br /> LongToDate对象攑օ到数据模型中<br /> root.put("timer", new IndexOfMethod());<br /> ftl模板里?br /> <#assign x = "123112455445"><br /> ${timer("yyyy-MM-dd H:mm:ss", x)}<br /> ${timer("yyyy-MM-dd ", x)} </p> <p>输出<br /> 2001-10-12 5:21:12<br /> 2001-10-12</p> <p>自定?Transforms<br /> 实现自定义的<@transform>文本或表辑ּ<<a>/@transform</a>>的功?允许对中间的最l文本进行解析{?/p> <p>例子Q实?lt;@upcase>str<<a>/@upcase</a>> str转换成STR 的功?/p> <p>代码如下Q?br /> import java.io.*;<br /> import java.util.*;<br /> import freemarker.template.TemplateTransformModel;</p> <p>class UpperCaseTransform implements TemplateTransformModel {</p> <p>    public Writer getWriter(Writer out, Map args) {<br />         return new UpperCaseWriter(out);<br />     }</p> <p>    private class UpperCaseWriter extends Writer {<br />        <br />         private Writer out;<br />            <br />         UpperCaseWriter (Writer out) {<br />             this.out = out;<br />         }</p> <p>        public void write(char[] cbuf, int off, int len)<br />                 throws IOException {<br />             out.write(new String(cbuf, off, len).toUpperCase());<br />         }</p> <p>        public void flush() throws IOException {<br />             out.flush();<br />         }</p> <p>        public void close() {<br />         }<br />     }<br /> }  <br /> 然后此对象put到数据模型中<br /> root.put("upcase", new UpperCaseTransform());</p> <p>在view(ftl)面中可以如下方式?/p> <p><@upcase><br /> hello world<br /> <<a>/@upcase</a>></p> 打印输出:<br /> HELLO WORLD<br /> <br /> <a id="Editor_Edit_hlEntryLink" title="view: FreeMarke开发指? target="_blank"><font color="#002c99">http://www.cnblogs.com/ynlxc/archive/2006/10/16/529974.html</font></a> <img src ="http://www.aygfsteel.com/Todd/aggbug/296111.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/Todd/" target="_blank">Todd</a> 2009-09-23 09:32 <a href="http://www.aygfsteel.com/Todd/archive/2009/09/23/296111.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>spring freemarker 中文 qhttp://www.aygfsteel.com/Todd/archive/2009/09/22/296023.htmlToddToddTue, 22 Sep 2009 06:30:00 GMThttp://www.aygfsteel.com/Todd/archive/2009/09/22/296023.htmlhttp://www.aygfsteel.com/Todd/comments/296023.htmlhttp://www.aygfsteel.com/Todd/archive/2009/09/22/296023.html#Feedback0http://www.aygfsteel.com/Todd/comments/commentRss/296023.htmlhttp://www.aygfsteel.com/Todd/services/trackbacks/296023.html    已经在网上找到设|如?br />    <bean id="freemarkerConfigurer" class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer">
      <property name="templateLoaderPath">
        <value>/WEB-INF/templates/</value>
      </property>     
      <property name="freemarkerSettings"><!-- 如果模板不经常更斎ͼ此属性设|更新gq时?-->
        <props>
          <prop key="template_update_delay">0</prop>         
          <prop key="defaultEncoding">UTF-8</prop>
          <prop key="locale">zh_CN</prop>
        </props>
      </property>
    </bean>
   但是,
  
   在控制台中输出汉字正常,面昄q。用httpwatch,查到contenttype cd为text/html;charset=ISO-8859-1Q?br />    于是?br />   <bean id="viewResolver" class="org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver">    里添?br />   <property name="contentType" value="text/html;charset=UTF-8"></property>
  问题解决



Todd 2009-09-22 14:30 发表评论
]]>
spring获取webapplicationcontext,applicationcontext几种Ҏ详解http://www.aygfsteel.com/Todd/archive/2009/09/15/295112.htmlToddToddTue, 15 Sep 2009 03:11:00 GMThttp://www.aygfsteel.com/Todd/archive/2009/09/15/295112.htmlhttp://www.aygfsteel.com/Todd/comments/295112.htmlhttp://www.aygfsteel.com/Todd/archive/2009/09/15/295112.html#Feedback0http://www.aygfsteel.com/Todd/comments/commentRss/295112.htmlhttp://www.aygfsteel.com/Todd/services/trackbacks/295112.htmlҎ一Q在初始化时保存ApplicationContext对象
代码Q?br /> ApplicationContext ac = new FileSystemXmlApplicationContext("applicationContext.xml");
ac.getBean("beanId");
说明Q这U方式适用于采用Spring框架的独立应用程序,需要程序通过配置文g手工初始化Spring的情c?/p>

Ҏ二:通过Spring提供的工L获取ApplicationContext对象
代码Q?br /> import org.springframework.web.context.support.WebApplicationContextUtils;
ApplicationContext ac1 = WebApplicationContextUtils.getRequiredWebApplicationContext(ServletContext sc);
ApplicationContext ac2 = WebApplicationContextUtils.getWebApplicationContext(ServletContext sc);
ac1.getBean("beanId");
ac2.getBean("beanId");
说明Q?br /> q种方式适合于采用Spring框架的B/SpȝQ通过ServletContext对象获取ApplicationContext对象Q然后在通过它获取需要的cd例?/p>

上面两个工具方式的区别是Q前者在获取p|时抛出异常,后者返回null?/span>

其中 servletContext sc 可以具体 换成 servlet.getServletContext()或? this.getServletContext() 或?request.getSession().getServletContext(); 另外Q由于spring是注入的对象攑֜ServletContext中的Q所以可以直接在ServletContext取出 WebApplicationContext 对象Q? WebApplicationContext webApplicationContext = (WebApplicationContext) servletContext.getAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE);

Ҏ三:l承自抽象类ApplicationObjectSupport
说明Q抽象类ApplicationObjectSupport提供getApplicationContext()ҎQ可以方便的获取到ApplicationContext?br /> Spring初始化时Q会通过该抽象类的setApplicationContext(ApplicationContext context)ҎApplicationContext 对象注入?/p>

Ҏ四:l承自抽象类WebApplicationObjectSupport
说明Q类g面方法,调用getWebApplicationContext()获取WebApplicationContext

Ҏ五:实现接口ApplicationContextAware
说明Q实现该接口的setApplicationContext(ApplicationContext context)ҎQƈ保存ApplicationContext 对象?br /> Spring初始化时Q会通过该方法将ApplicationContext对象注入?br />

在web应用中一般用ContextLoaderListener加蝲webapplication,如果需要在action之外或者controlcM外获取webapplication思\之一是,单独写个cL在static变量中,
cM于:
public class AppContext {

  
private static AppContext instance;

  
private AbstractApplicationContext appContext;

  
public synchronized static AppContext getInstance() {
    
if (instance == null) {
      instance 
= new AppContext();
    }
    
return instance;
  }

  
private AppContext() {
    
this.appContext = new ClassPathXmlApplicationContext(
        
"/applicationContext.xml");
  }

  
public AbstractApplicationContext getAppContext() {
    
return appContext;
  }
}

不过q样Q还是加载了2ơapplicationcontext,servlet一ơ,路径加蝲一ơ;觉得不如直接用\径加载,舍掉servlet加蝲
在网上也找了些其他说?实现ApplicationContextAwareQ,Q?接口Q或者servletcontextAware接口,q要写配|文件。有的竟然要把配|文仉?/span>listenerQ?span style="color: red;">换成自己的类Q这L_多此一举。不q有的应用不是替换,是在补一个listenerQ?br /> 我在一版的jpetstoreQ具体那一版不知道Q里发现了这个:
[web.xml]?br />      
    <listener>
        
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    
</listener>
    
    
<listener>
        
<listener-class>com.ibatis.jpetstore.util.SpringInit</listener-class>
    
</listener>
其中SpringInit实现接口ServletContextListener Q?br />
package com.ibatis.jpetstore.util;

import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import org.springframework.context.ApplicationContext;
import org.springframework.web.context.WebApplicationContext;
import org.springframework.web.context.support.WebApplicationContextUtils;


public class SpringInit implements ServletContextListener {
    

    
private static WebApplicationContext springContext;
    
    
public SpringInit() {
        
super();
    }
    
    
public void contextInitialized(ServletContextEvent event) {
        springContext 
= WebApplicationContextUtils.getWebApplicationContext(event.getServletContext());
    }
    

    
public void contextDestroyed(ServletContextEvent event) {
    }
    
    
public static ApplicationContext getApplicationContext() {
        
return springContext;
    }

    
}

在其中的一个bean的构造里SpringInit获取applicationcontext,代码Q?br />
  public OrderBean() {
    
this(
            (AccountService) SpringInit.getApplicationContext().getBean(
"accountService"),
            (OrderService) SpringInit.getApplicationContext().getBean(
"orderService") );
  }

恩,q种在action,servlet之外的bean里获取applicationcontext的方法值得参考,应该有用


Todd 2009-09-15 11:11 发表评论
]]>
【{】Spring+iBatis整合http://www.aygfsteel.com/Todd/archive/2009/09/10/294653.htmlToddToddThu, 10 Sep 2009 13:07:00 GMThttp://www.aygfsteel.com/Todd/archive/2009/09/10/294653.htmlhttp://www.aygfsteel.com/Todd/comments/294653.htmlhttp://www.aygfsteel.com/Todd/archive/2009/09/10/294653.html#Feedback0http://www.aygfsteel.com/Todd/comments/commentRss/294653.htmlhttp://www.aygfsteel.com/Todd/services/trackbacks/294653.html
Spring+iBatis整合
2008-03-19 10:24 A.M.

   ibatis和Spring整合的详l例?数据库用的是mysql,开发环境是Eclipse3.2:
1.首先把用到的包导入进?此例用的是spring-framework-1.2.7,iBATIS_DBL-2.1.7.597,mysql的数
据库q接包用的是mysql-connector-java-5.0.3-bin.jar.

2.建POJOc?在此我们用的是一个Studentc?
package cn.itcast;

public class Student implements java.io.Serializable {
   private Integer id;

   private String firstname;

   private String lastname;

   public String getFirstname() {
    return firstname;
   }

   public void setFirstname(String firstname) {
    this.firstname = firstname;
   }

   public Integer getId() {
    return id;
   }

   public void setId(Integer id) {
    this.id = id;
   }

   public String getLastname() {
    return lastname;
   }

   public void setLastname(String lastname) {
    this.lastname = lastname;
   }
}

3.POJO的映文件Student.xml,在这里面只有两个功能,x据student的id索出一个Student对象,另一
个就是向数据库插入一条记?一个Student对象),注意:此应用程序中所有的配置文g(xml文g?br /> properties文g都放在configfile包下?.
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE sqlMap PUBLIC "-//iBATIS.com//DTD SQL Map 2.0//EN" " <!--q是POJO映射文g的根元素-->
<sqlMap namespace="Student">
   <!--select元素的id属性用来标识此元素,resultClass属性的值是Javacȝ全限定名Q即包括cȝ包名Q?br />    resultClass属性可以让您指定一个Javac,ҎResultSetMetaData其自动映射到JDBC的ResultSet?br />    只要是Java Bean的属性名U和ResultSet的列名匹配,属性自动赋值给列倹{?br />    parameterClass属性是参数的类?此属性的值是Javacȝ全限定名Q即包括cȝ包名Q?br />    它是可选的Q但强烈使用。它的目的是 限制输入参数的类型ؓ指定的Javac,q?br />    优化框架的性能?->
   <select id="getStudentById" resultClass="cn.itcast.Student" parameterClass="int">
    select id,firstname,lastname from student where id=#value#
   </select>
  
   <insert id="insertStudent" parameterClass="cn.itcast.Student">
    insert into student(firstname,lastname) values(#firstname#,#lastname#)
   </insert>
</sqlMap>

4.Z个SqlMap的配|文件sql-map-config.xml,sqlMap元素的resource属性告诉Springd找POJO映射文g.
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE sqlMapConfig
PUBLIC "-//iBATIS.com//DTD SQL Map Config 2.0//EN"
"
<sqlMapConfig>
   <sqlMap resource="configfile/Student.xml" />
</sqlMapConfig>

5.jdbc.properties文g,存储数据库连接的driver,url,username,password{信?
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost/itcast
jdbc.username=root
jdbc.password=


6.Spring配置文gapplicationContext.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "

<beans>

   <!--此bean告诉Springd找数据库的配|信?因ؓ有此Bean才出C面用${}标记来取变量的语?->
   <bean id="propertyConfig"
    class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
    <property name="location">
     <value>configfile/jdbc.properties</value>
    </property>
   </bean>

   <!--配置一个数据源,Ҏ上面propertyConfig指定的locationL数据库连接的配置信息-->
   <bean id="dataSource"
    class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    <property name="driverClassName">
     <value>${jdbc.driver}</value>
    </property>
    <property name="url">
     <value>${jdbc.url}</value>
    </property>
    <property name="username">
     <value>${jdbc.username}</value>
    </property>
    <property name="password">
     <value>${jdbc.password}</value>
    </property>
   </bean>

   <!--ҎdataSource和configLocation创徏一个SqlMapClient-->
   <bean id="sqlMapClient"
    class="org.springframework.orm.ibatis.SqlMapClientFactoryBean">
    <property name="configLocation">
     <value>configfile/sql-map-config.xml</value>
    </property>
    <property name="dataSource">
     <ref bean="dataSource" />
    </property>
   </bean>

   <!--ҎsqlMapClien创徏一个SqlMapClient模版c?->
   <bean id="sqlMapClientTemplate"
    class="org.springframework.orm.ibatis.SqlMapClientTemplate">
    <property name="sqlMapClient">
     <ref bean="sqlMapClient" />
    </property>
   </bean>
  
   <!--上面的模版cȝ入到我们的DAO对象?->
   <bean id="studentDao" class="cn.itcast.StudentDaoSqlMap">
    <property name="sqlMapClientTemplate">
     <ref bean="sqlMapClientTemplate" />
    </property>
   </bean>

</beans>

7.StudentDaoSqlMap 是一个DAO,它负责和数据库的交互,在这里实C查询单条记录和插入单条记录的功能.
package cn.itcast;

import org.springframework.orm.ibatis.SqlMapClientTemplate;

public class StudentDaoSqlMap {

//[1]
   private SqlMapClientTemplate sqlMapClientTemplate;

   public SqlMapClientTemplate getSqlMapClientTemplate() {
    return sqlMapClientTemplate;
   }

   public void setSqlMapClientTemplate(
     SqlMapClientTemplate sqlMapClientTemplate) {
    this.sqlMapClientTemplate = sqlMapClientTemplate;
   }

   //此方法的q回gStudent.xml的select元素的resultClass对应.
   public Student getStudent(Integer id) {
    return (Student) sqlMapClientTemplate.queryForObject("getStudentById",id);
    //注意:queryForObjectҎq回一个Object,W一个参CStudent.xml的select元素
    //的id属性值对?W二个参数的cd与Student.xml的select元素的parameterClass
    //属性值对?
   }

   public Object insertStudent(Student student) {
    return sqlMapClientTemplate.insert("insertStudent", student);
   }
}

8.下面写一个带main函数的类来测试上面的代码.代码非常单就不再解释?
package cn.itcast;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Client {

   public static void main(String[] args) {
    //[2]
    ApplicationContext factory = new ClassPathXmlApplicationContext(
      "applicationContext.xml");

    StudentDaoSqlMap studentDao = (StudentDaoSqlMap) factory
      .getBean("studentDao");
   
    //插入一个student
    Student student = new Student();
    student.setFirstname("tian");
    student.setLastname("xiangdong");
    studentDao.insertStudent(student);

    //查询出id?的Student对象.
    //Student student = studentDao.getStudent(1);
    //System.out.println(student.getId());
    //System.out.println(student.getFirstname());
    //System.out.println(student.getLastname());
   }

}


###########################
准备玩spring,搞个入门的看看,

[1]DAO可以l承SqlMapClientDaoSupportcȝ得写sqlmapclienttemplate的get,set,前面的注入依然有?br /> [2]spring在web里还是用WebApplicationContextUtils.getWebApplicationContext()获取上下文,配置文g攑ֈWEB-INF文g夹下比较舒服

Todd 2009-09-10 21:07 发表评论
]]>
վ֩ģ壺 | | ԭ| ׿| ƽ| ҽ| Ϫ| ٳ| ʡ| | dz| | | Ƶ| ʲ| | ƴ| | | | | ض| ͼƬ| | γ| ʼ| | ƽ| | | ɽ| | ½| | | | | | | ĺ| |