﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-TODD-随笔分类-spring</title><link>http://www.blogjava.net/Todd/category/41618.html</link><description>point and net </description><language>zh-cn</language><lastBuildDate>Sat, 26 Sep 2009 21:16:00 GMT</lastBuildDate><pubDate>Sat, 26 Sep 2009 21:16:00 GMT</pubDate><ttl>60</ttl><item><title>FreeMarke开发指南</title><link>http://www.blogjava.net/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.blogjava.net/Todd/archive/2009/09/23/296111.html</guid><wfw:comment>http://www.blogjava.net/Todd/comments/296111.html</wfw:comment><comments>http://www.blogjava.net/Todd/archive/2009/09/23/296111.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Todd/comments/commentRss/296111.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Todd/services/trackbacks/296111.html</trackback:ping><description><![CDATA[<p align="center">FreeMarke开发指南</p>
<p><br />
1概念<br />
2指令<br />
if, else, elseif&nbsp;<br />
switch, case, default, break<br />
list, break&nbsp;<br />
include&nbsp;<br />
Import&nbsp;<br />
compress&nbsp;<br />
escape, noescape&nbsp;<br />
assign&nbsp;<br />
global&nbsp;<br />
setting&nbsp;<br />
macro, nested, return<br />
t, lt, rt&nbsp;<br />
3一些常用方法或注意事项&nbsp;<br />
表达式转换类&nbsp;<br />
数字循环&nbsp;<br />
对浮点取整数&nbsp;<br />
给变量默认值&nbsp;<br />
判断对象是不是null&nbsp;<br />
常用格式化日期&nbsp;<br />
添加全局共享变量数据模型&nbsp;<br />
直接调用java对象的方法&nbsp;<br />
字符串处理(内置方法)&nbsp;<br />
在模板里对sequences和hashes初始化&nbsp;<br />
注释标志&nbsp;<br />
sequences内置方法&nbsp;<br />
hashes内置方法&nbsp;<br />
4 freemarker在web开发中注意事项&nbsp;<br />
web中常用的几个对象&nbsp;<br />
view中值的搜索顺序&nbsp;<br />
在模板里ftl里使用标签&nbsp;<br />
如何初始化共享变量&nbsp;<br />
与webwork整合配置&nbsp;<br />
5高级方法&nbsp;<br />
自定义方法&nbsp;<br />
自定义 Transforms&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
1概念<br />
最常用的3个概念<br />
sequence&nbsp; 序列，对应java里的list、数组等非键值对的集合<br />
hash&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 键值对的集合<br />
namespace 对一个ftl文件的引用,利用这个名字可以访问到该ftl文件的资源</p>
<p>2指令<br />
if, else, elseif<br />
语法<br />
&lt;#if condition&gt;<br />
&nbsp; ...<br />
&lt;#elseif condition2&gt;<br />
&nbsp; ...<br />
&lt;#elseif condition3&gt;<br />
&nbsp; ...<br />
...<br />
&lt;#else&gt;<br />
&nbsp; ...<br />
&lt;/#if&gt;<br />
用例<br />
&lt;#if x = 1&gt;<br />
&nbsp; x is 1<br />
&lt;/#if&gt;</p>
<p>&lt;#if x = 1&gt;<br />
&nbsp; x is 1<br />
&lt;#else&gt;<br />
&nbsp; x is not 1<br />
&lt;/#if&gt;</p>
<p>switch, case, default, break<br />
语法<br />
&lt;#switch value&gt;<br />
&nbsp; &lt;#case refValue1&gt;<br />
&nbsp;&nbsp;&nbsp; ...<br />
&nbsp;&nbsp;&nbsp; &lt;#break&gt;<br />
&nbsp; &lt;#case refValue2&gt;<br />
&nbsp;&nbsp;&nbsp; ...<br />
&nbsp;&nbsp;&nbsp; &lt;#break&gt;<br />
&nbsp; ...<br />
&nbsp; &lt;#case refValueN&gt;<br />
&nbsp;&nbsp;&nbsp; ...<br />
&nbsp;&nbsp;&nbsp; &lt;#break&gt;<br />
&nbsp; &lt;#default&gt;<br />
&nbsp;&nbsp;&nbsp; ...<br />
&lt;/#switch&gt;</p>
<p>用例<br />
字符串<br />
&lt;#switch being.size&gt;<br />
&nbsp; &lt;#case "small"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; This will be processed if it is small<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;#break&gt;<br />
&nbsp; &lt;#case "medium"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; This will be processed if it is medium<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;#break&gt;<br />
&nbsp; &lt;#case "large"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; This will be processed if it is large<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;#break&gt;<br />
&nbsp; &lt;#default&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; This will be processed if it is neither<br />
&lt;/#switch&gt;<br />
数字<br />
&lt;#switch x&gt;<br />
&nbsp; &lt;#case x = 1&gt;<br />
&nbsp;&nbsp;&nbsp; 1<br />
&nbsp; &lt;#case x = 2&gt;<br />
&nbsp;&nbsp;&nbsp; 2<br />
&nbsp; &lt;#default&gt;<br />
&nbsp;&nbsp;&nbsp; d<br />
&lt;/#switch&gt;</p>
<p>如果x=1 输出 1 2, x=2输出 2, x=3 输出d</p>
<p>list, break<br />
语法<br />
&lt;#list sequence as item&gt;<br />
...<br />
&lt;#if item = "spring"&gt;&lt;#break&gt;&lt;/#if&gt;<br />
...<br />
&lt;/#list&gt;<br />
关键字<br />
item_index:是list当前值的下标<br />
item_has_next:判断list是否还有值</p>
<p>用例<br />
&lt;#assign seq = ["winter", "spring", "summer", "autumn"]&gt;<br />
&lt;#list seq as x&gt;<br />
&nbsp; ${x_index + 1}. ${x}&lt;#if x_has_next&gt;,&lt;/#if&gt;<br />
&lt;/#list&gt;</p>
<p>输出<br />
&nbsp; 1. winter,<br />
&nbsp; 2. spring,<br />
&nbsp; 3. summer,<br />
&nbsp; 4. autumn&nbsp;&nbsp; </p>
<p><br />
include<br />
语法<br />
&lt;#include filename&gt;<br />
or<br />
&lt;#include filename options&gt;<br />
options包含两个属性<br />
encoding=&#8221;GBK&#8221; 编码格式<br />
parse=true 是否作为ftl语法解析,默认是true，false就是以文本方式引入.注意在ftl文件里布尔值都是直接赋值的如parse=true,而不是parse=&#8221;true&#8221;<br />
用例<br />
/common/copyright.ftl包含内容<br />
Copyright 2001-2002 ${me}&lt;br&gt;<br />
All rights reserved.&nbsp; <br />
模板文件<br />
&lt;#assign me = "Juila Smith"&gt;<br />
&lt;h1&gt;Some test&lt;/h1&gt;<br />
&lt;p&gt;Yeah.<br />
&lt;hr&gt;<br />
&lt;#include "/common/copyright.ftl" encoding=&#8221;GBK&#8221;&gt; <br />
输出结果<br />
&lt;h1&gt;Some test&lt;/h1&gt;<br />
&lt;p&gt;Yeah.<br />
&lt;hr&gt;<br />
Copyright 2001-2002 Juila Smith<br />
All rights reserved.&nbsp; </p>
<p>Import<br />
语法<br />
&lt;#import path as hash&gt;<br />
类似于java里的import,它导入文件，然后就可以在当前文件里使用被导入文件里的宏组件</p>
<p>用例</p>
<p>假设mylib.ftl里定义了宏copyright那么我们在其他模板页面里可以这样使用<br />
&lt;#import "/libs/mylib.ftl" as my&gt;</p>
<p>&lt;@my.copyright date="1999-2002"/&gt;</p>
<p>"my"在freemarker里被称作namespace</p>
<p>compress<br />
语法<br />
&lt;#compress&gt;<br />
&nbsp; ...<br />
&lt;/#compress&gt;<br />
用来压缩空白空间和空白的行<br />
用例<br />
&lt;#assign x = "&nbsp;&nbsp;&nbsp; moo&nbsp; \n\n&nbsp;&nbsp; "&gt;<br />
(&lt;#compress&gt;<br />
&nbsp; 1 2&nbsp; 3&nbsp;&nbsp; 4&nbsp;&nbsp;&nbsp; 5<br />
&nbsp; ${moo}<br />
&nbsp; test only</p>
<p>&nbsp; I said, test only</p>
<p>&lt;/#compress&gt;)&nbsp; <br />
输出<br />
(1 2 3 4 5<br />
moo<br />
test only<br />
I said, test only) <br />
escape, noescape<br />
语法<br />
&lt;#escape identifier as expression&gt;<br />
&nbsp; ...<br />
&nbsp; &lt;#noescape&gt;...&lt;/#noescape&gt;<br />
&nbsp; ...<br />
&lt;/#escape&gt;<br />
用例<br />
主要使用在相似的字符串变量输出，比如某一个模块的所有字符串输出都必须是html安全的，这个时候就可以使用该表达式<br />
&lt;#escape x as x?html&gt;<br />
&nbsp; First name: ${firstName}<br />
&nbsp; &lt;#noescape&gt;Last name: ${lastName}&lt;/#noescape&gt;<br />
&nbsp; Maiden name: ${maidenName}<br />
&lt;/#escape&gt;<br />
相同表达式&nbsp; <br />
&nbsp; First name: ${firstName?html}<br />
&nbsp; Last name: ${lastName }<br />
&nbsp; Maiden name: ${maidenName?html}<br />
assign<br />
语法<br />
&lt;#assign name=value&gt;<br />
or<br />
&lt;#assign name1=value1 name2=value2 ... nameN=valueN&gt;<br />
or<br />
&lt;#assign same as above... in namespacehash&gt;<br />
or<br />
&lt;#assign name&gt;<br />
&nbsp; capture this<br />
&lt;/#assign&gt;<br />
or<br />
&lt;#assign name in namespacehash&gt;<br />
&nbsp; capture this<br />
&lt;/#assign&gt;<br />
用例<br />
生成变量,并且给变量赋值<br />
给seasons赋予序列值<br />
&lt;#assign seasons = ["winter", "spring", "summer", "autumn"]&gt;</p>
<p>给变量test加1<br />
&lt;#assign test = test + 1&gt;</p>
<p>给my namespage 赋予一个变量bgColor,下面可以通过my.bgColor来访问这个变量<br />
&lt;#import "/mylib.ftl" as my&gt;<br />
&lt;#assign bgColor="red" in my&gt;</p>
<p>将一段输出的文本作为变量保存在x里<br />
下面的阴影部分输出的文本将被赋值给x<br />
&lt;#assign x&gt;<br />
&nbsp; &lt;#list 1..3 as n&gt;<br />
&nbsp;&nbsp;&nbsp; ${n} &lt;@myMacro /&gt;<br />
&nbsp; &lt;/#list&gt;<br />
&lt;/#assign&gt;<br />
Number of words: ${x?word_list?size}<br />
${x}</p>
<p>&lt;#assign x&gt;Hello ${user}!&lt;/#assign&gt;&nbsp;&nbsp;&nbsp;&nbsp; error<br />
&lt;#assign x=&#8221; Hello ${user}!&#8221;&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; true</p>
<p>同时也支持中文赋值，如：<br />
&lt;#assign 语法&gt;<br />
&nbsp; java<br />
&lt;/#assign&gt;<br />
${语法}<br />
打印输出:<br />
java<br />
global<br />
语法<br />
&lt;#global name=value&gt;<br />
or<br />
&lt;#global name1=value1 name2=value2 ... nameN=valueN&gt;<br />
or<br />
&lt;#global name&gt;<br />
&nbsp; capture this<br />
&lt;/#global&gt;</p>
<p>全局赋值语法，利用这个语法给变量赋值，那么这个变量在所有的namespace中是可见的,如果这个变量被当前的assign语法覆盖
如&lt;#global x=2&gt; &lt;#assign x=1&gt;
在当前页面里x=2将被隐藏，或者通过${.global.x}来访问</p>
<p>setting<br />
语法<br />
&lt;#setting name=value&gt;<br />
用来设置整个系统的一个环境<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 />
&lt;#setting locale="en_US"&gt;<br />
${1.2}&nbsp; <br />
输出<br />
1,2<br />
1.2<br />
因为匈牙利是采用&#8220;,&#8221;作为十进制的分隔符，美国是用&#8220;.&#8221;</p>
<p>&nbsp;</p>
<p>macro, nested, return<br />
语法</p>
<p>&lt;#macro name param1 param2 ... paramN&gt;<br />
&nbsp; ...<br />
&nbsp; &lt;#nested loopvar1, loopvar2, ..., loopvarN&gt;<br />
&nbsp; ...<br />
&nbsp; &lt;#return&gt;<br />
&nbsp; ...<br />
&lt;/#macro&gt;<br />
用例<br />
&lt;#macro test foo bar="Bar" baaz=-1&gt;<br />
&nbsp; Test text, and the params: ${foo}, ${bar}, ${baaz}<br />
&lt;/#macro&gt;<br />
&lt;@test foo="a" bar="b" baaz=5*5-2/&gt;<br />
&lt;@test foo="a" bar="b"/&gt;<br />
&lt;@test foo="a" baaz=5*5-2/&gt;<br />
&lt;@test foo="a"/&gt; <br />
输出<br />
&nbsp; Test text, and the params: a, b, 23<br />
&nbsp; Test text, and the params: a, b, -1<br />
&nbsp; Test text, and the params: a, Bar, 23<br />
&nbsp; Test text, and the params: a, Bar, -1<br />
定义循环输出的宏<br />
&lt;#macro list title items&gt;<br />
&nbsp; &lt;p&gt;${title?cap_first}:<br />
&nbsp; &lt;ul&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;#list items as x&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;li&gt;${x?cap_first}<br />
&nbsp;&nbsp;&nbsp; &lt;/#list&gt;<br />
&nbsp; &lt;/ul&gt;<br />
&lt;/#macro&gt;<br />
&lt;@list items=["mouse", "elephant", "python"] title="Animals"/&gt;<br />
输出结果&nbsp; <br />
&lt;p&gt;Animals:<br />
&nbsp; &lt;ul&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;li&gt;Mouse<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;li&gt;Elephant<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;li&gt;Python<br />
&nbsp; &lt;/ul&gt;<br />
包含body的宏<br />
&lt;#macro repeat count&gt;<br />
&nbsp; &lt;#list 1..count as x&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;#nested x, x/2, x==count&gt;<br />
&nbsp; &lt;/#list&gt;<br />
&lt;/#macro&gt;<br />
&lt;@repeat count=4 ; c halfc last&gt;<br />
&nbsp; ${c}. ${halfc}&lt;#if last&gt; Last!&lt;/#if&gt;<br />
&lt;<a>/@repeat</a>&gt; <br />
输出<br />
1. 0.5<br />
&nbsp; 2. 1<br />
&nbsp; 3. 1.5<br />
&nbsp; 4. 2 Last!</p>
<p>&nbsp;</p>
<p><br />
t, lt, rt<br />
语法<br />
&lt;#t&gt; 去掉左右空白和回车换行</p>
<p>&lt;#lt&gt;去掉左边空白和回车换行</p>
<p>&lt;#rt&gt;去掉右边空白和回车换行</p>
<p>&lt;#nt&gt;取消上面的效果</p>
<p><br />
3一些常用方法或注意事项</p>
<p><br />
表达式转换类<br />
${expression}计算expression并输出<br />
#{ expression }数字计算#{ expression ;format}安格式输出数字format为M和m<br />
M表示小数点后最多的位数,m表示小数点后最少的位数如#{121.2322;m2M2}输出121.23</p>
<p>&nbsp;</p>
<p><br />
数字循环<br />
1..5 表示从1到5，原型number..number<br />
对浮点取整数<br />
${123.23?int} 输出123<br />
给变量默认值<br />
${var?default(&#8220;hello world&lt;br&gt;&#8221;)?html}如果var is null那么将会被hello world&lt;br&gt;替代</p>
<p>判断对象是不是null<br />
&nbsp;&nbsp;&nbsp; &lt;#if mouse?exists&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Mouse found<br />
&lt;#else&gt;<br />
也可以直接${mouse?if_exists})输出布尔形<br />
常用格式化日期<br />
&nbsp;openingTime必须是Date型,详细查看freemarker文档 Reference-&gt;build-in referece-&gt;build-in for date</p>
<p>${openingTime?date}<br />
${openingTime?date_time}<br />
${openingTime?time}</p>
<p>添加全局共享变量数据模型<br />
在代码里的实现<br />
&nbsp;&nbsp;&nbsp; cfg = Configuration.getDefaultConfiguration();<br />
cfg.setSharedVariable("global", "you good"); <br />
页面实现可以通过global指令,具体查看指令里的global部分<br />
直接调用java对象的方法<br />
${object.methed(args)}&nbsp; </p>
<p>字符串处理(内置方法)<br />
html安全输出<br />
&#8220;abc&lt;table&gt;sdfsf&#8221;?html <br />
返回安全的html输出,替换掉html代码<br />
xml安全输出<br />
var?xml&nbsp;&nbsp; <br />
substring的用法<br />
&lt;#assign user=&#8221;hello jeen&#8221;&gt;<br />
${user[0]}${user[4]} <br />
${user[1..4]}<br />
输出 :<br />
ho<br />
ello&nbsp; <br />
类似String.split的用法 <br />
&nbsp;&#8220;abc;def;ghi&#8221;?split(&#8220;;&#8221;)返回sequence<br />
将字符串按空格转化成sequence,然后取sequence的长度<br />
&nbsp;&nbsp;&nbsp;&nbsp; var?word_list&nbsp; 效果同 var?split(&#8220; &#8221;) <br />
&nbsp;var?word_list?size</p>
<p>取得字符串长度<br />
var?length</p>
<p>大写输出字符<br />
var?upper_case</p>
<p>小写输出字符<br />
var?lower_case</p>
<p>首字符大写<br />
var?cap_first</p>
<p>首字符小写<br />
var?uncap_first</p>
<p>去掉字符串前后空格 <br />
var?trim</p>
<p>每个单词的首字符大写<br />
var?capitalize</p>
<p>类似String.indexof: <br />
&nbsp;&#8220;babcdabcd&#8221;?index_of(&#8220;abc&#8221;) 返回1<br />
&nbsp;&#8220;babcdabcd&#8221;?index_of(&#8220;abc&#8221;,2) 返回5<br />
类似String.lastIndexOf <br />
&nbsp;last_index_of和String.lastIndexOf类似,同上</p>
<p>下面两个可能在代码生成的时候使用（在引号前加&#8221;\&#8221;）<br />
j_string: 在字符串引号前加&#8221;\&#8221;<br />
&nbsp;&lt;#assign beanName = 'The "foo" bean.'&gt;<br />
&nbsp;String BEAN_NAME = "${beanName?j_string}";<br />
打印输出:<br />
&nbsp;String BEAN_NAME = "The \"foo\" bean.";<br />
js_string:<br />
&nbsp;&lt;#assign user = "Big Joe's \"right hand\"."&gt;<br />
&lt;script&gt;<br />
&nbsp; alert("Welcome ${user}!");<br />
&lt;/script&gt;&nbsp; <br />
打印输出<br />
&nbsp;alert("Welcome Big Joe\'s \"right hand\"!");</p>
<p>替换字符串 replace<br />
${s?replace(&#8216;ba&#8217;, &#8216;XY&#8217; )}<br />
${s?replace(&#8216;ba&#8217;, &#8216;XY&#8217; , &#8216;规则参数&#8217;)}将s里的所有的ba替换成xy 规则参数包含: i r m s c f 具体含义如下:<br />
&#183;&nbsp;i: 大小写不区分.<br />
&#183;&nbsp;f: 只替换第一个出现被替换字符串的字符串<br />
&#183;&nbsp;r:&nbsp; XY是正则表达式<br />
&#183;&nbsp;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 />
&#183;&nbsp;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 />
&#183;&nbsp;c: Permits whitespace and comments in regular expressions.</p>
<p><br />
在模板里对sequences和hashes初始化<br />
sequences&nbsp; </p>
<p>1.&nbsp;[&#8220;you&#8221;,&#8221;me&#8221;,&#8221;he&#8221;] <br />
2.&nbsp;1..100<br />
3.&nbsp;[ {&#8220;Akey&#8221;:&#8221;Avalue&#8221;},{&#8220;Akey1&#8221;:&#8221;Avalue1&#8221;},<br />
{&#8220;Bkey&#8221;:&#8221;Bvalue&#8221;},{&#8220;Bkey1&#8221;:&#8221;Bvalue1&#8221;},<br />
]</p>
<p>&nbsp; <br />
hashes&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {&#8220;you&#8221;:&#8221;a&#8221;,&#8221;me&#8221;:&#8221;b&#8221;,&#8221;he&#8221;:&#8221;c&#8221;}</p>
<p><br />
注释标志<br />
&lt;#-- <br />
这里是注释 <br />
--&gt;<br />
旧版本的freemarker采用的是&lt;#comment&gt; 注释 &lt;/#comment&gt;方法</p>
<p>sequences内置方法<br />
sequence?first<br />
返回sequence的第一个值;前提条件sequence不能是null<br />
sequence?last<br />
&nbsp;返回sequence最后一个值<br />
sequence?reverse<br />
&nbsp;反转sequence的值<br />
sequence?size<br />
&nbsp;返回sequence的大小<br />
sequence?sort<br />
&nbsp;对sequence按里面的对象toString()的结果进行排序<br />
sequence?sort_by(value)<br />
对sequence 按里面的对象的属性value进行排序<br />
如: sequence里面放入的是10 个user对象，user对象里面包含name,age等属性<br />
sequence?sort_by(name) 表示所有的user按user.name进行排序<br />
hashes内置方法<br />
hash?keys<br />
&nbsp;返回hash里的所有keys, 返回结果类型sequence<br />
hash?values<br />
&nbsp;返回hash里的所有value, 返回结果类型sequence<br />
4 freemarker在web开发中注意事项<br />
freemarker与webwork整合<br />
web中常用的几个对象<br />
Freemarker的ftl文件中直接使用内部对象:<br />
${Request ["a"]}<br />
${RequestParameters["a"]}<br />
${Session ["a"]}<br />
${Application ["a"]}<br />
${JspTaglibs ["a"]}</p>
<p>与webwork整合之后 通过配置的servlet 已经把request,session等对象置入了数据模型中<br />
在view中存在下面的对象<br />
&nbsp; 我们可以在ftl中${req}来打印req对象<br />
&#183;&nbsp;req - the current HttpServletRequest <br />
&#183;&nbsp;res - the current HttpServletResponse <br />
&#183;&nbsp;stack - the current OgnlValueStack <br />
&#183;&nbsp;ognl - the OgnlTool instance <br />
&#183;&nbsp;webwork - an instance of FreemarkerWebWorkUtil <br />
&#183;&nbsp;action - the current WebWork action <br />
&#183;&nbsp;exception - optional the Exception instance, if the view is a JSP exception or Servlet exception view <br />
view中值的搜索顺序<br />
${name}将会以下面的顺序查找name值<br />
&#183;&nbsp;freemarker variables <br />
&#183;&nbsp;value stack <br />
&#183;&nbsp;request attributes <br />
&#183;&nbsp;session attributes <br />
&#183;&nbsp;servlet context attributes <br />
在模板里ftl里使用标签<br />
注意，如果标签的属性值是数字，那么必须采用nubmer=123方式给属性赋值<br />
JSP页面<br />
&lt;<a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#37;&#64;&#112;&#97;&#103;&#101;">%@page</a> contentType="text/html;charset=ISO-8859-2" language="java"%&gt;<br />
&lt;<a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#37;&#64;&#116;&#97;&#103;&#108;&#105;&#98;">%@taglib</a> uri="/WEB-INF/struts-html.tld" prefix="html"%&gt;<br />
&lt;<a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#37;&#64;&#116;&#97;&#103;&#108;&#105;&#98;">%@taglib</a> uri="/WEB-INF/struts-bean.tld" prefix="bean"%&gt;</p>
<p>&lt;html&gt;<br />
&nbsp; &lt;body&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;h1&gt;&lt;bean:message key="welcome.title"/&gt;&lt;/h1&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;html:errors/&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;html:form action="/query"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Keyword: &lt;html:text property="keyword"/&gt;&lt;br&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Exclude: &lt;html:text property="exclude"/&gt;&lt;br&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;html:submit value="Send"/&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/html:form&gt;<br />
&nbsp; &lt;/body&gt;<br />
&lt;/html&gt; <br />
模板ftl页面<br />
&lt;#assign html=JspTaglibs["/WEB-INF/struts-html.tld"]&gt;<br />
&lt;#assign bean=JspTaglibs["/WEB-INF/struts-bean.tld"]&gt;</p>
<p>&lt;html&gt;<br />
&nbsp; &lt;body&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;h1&gt;&lt;@bean.message key="welcome.title"/&gt;&lt;/h1&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;@html.errors/&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;@html.form action="/query"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Keyword: &lt;@html.text property="keyword"/&gt;&lt;br&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Exclude: &lt;@html.text property="exclude"/&gt;&lt;br&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;@html.submit value="Send"/&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;<a>/@html.form</a>&gt;<br />
&nbsp; &lt;/body&gt;<br />
&lt;/html&gt;&nbsp; </p>
<p><br />
如何初始化共享变量<br />
1．&nbsp;初始化全局共享数据模型<br />
freemark在web上使用的时候对共享数据的初始化支持的不够,不能在配置初始化的时候实现，而必须通过ftl文件来初始化全局变量。这是不能满主需求的，我们需要在servlet init的时候留出一个接口来初始化系统的共享数据<br />
具
体到和webwork整合,因为本身webwork提供了整合servlet,如果要增加全局共享变量，可以通过修改
com.opensymphony.webwork.views.freemarker.FreemarkerServlet来实现,我们可以在这个
servlet初始化的时候来初始化全局共享变量<br />
与webwork整合配置<br />
配置web.xml<br />
&lt;servlet&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;servlet-name&gt;freemarker&lt;/servlet-name&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;servlet-class&gt;com.opensymphony.webwork.views.freemarker.FreemarkerServlet&lt;/servlet-class&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;init-param&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;param-name&gt;TemplatePath&lt;/param-name&gt;<br />
&lt;param-value&gt;/&lt;/param-value&gt;<br />
&lt;!—模板载入文件夹，这里相对context root，递归获取该文件夹下的所有模板--&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/init-param&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;init-param&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;param-name&gt;NoCache&lt;/param-name&gt; &lt;!—是否对模板缓存--&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;param-value&gt;true&lt;/param-value&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/init-param&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;init-param&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;param-name&gt;ContentType&lt;/param-name&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;param-value&gt;text/html&lt;/param-value&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/init-param&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;init-param&gt;<br />
&lt;param-name&gt;template_update_delay&lt;/param-name&gt;<br />
&lt;!—模板更新时间,0表示每次都更新,这个适合开发时候--&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;param-value&gt;0&lt;/param-value&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/init-param&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;init-param&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;param-name&gt;default_encoding&lt;/param-name&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;param-value&gt;GBK&lt;/param-value&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/init-param&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;init-param&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;param-name&gt;number_format&lt;/param-name&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;param-value&gt;0.##########&lt;/param-value&gt;&lt;!—数字显示格式--&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/init-param&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;load-on-startup&gt;1&lt;/load-on-startup&gt;<br />
&nbsp; &lt;/servlet&gt;<br />
&nbsp; &lt;servlet-mapping&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;servlet-name&gt;freemarker&lt;/servlet-name&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;url-pattern&gt;*.ftl&lt;/url-pattern&gt;<br />
&nbsp; &lt;/servlet-mapping&gt;</p>
<p>5高级方法<br />
自定义方法<br />
${timer("yyyy-MM-dd H:mm:ss", x)}<br />
${timer("yyyy-MM-dd ", x)} </p>
<p>在模板中除了可以通过对象来调用方法外（${object.methed(args)}）也可以直接调用java实现的方法，java类必须实现接
口TemplateMethodModel的方法exec(List args). 下面以把毫秒的时间转换成按格式输出的时间为例子<br />
public class LongToDate implements TemplateMethodModel {<br />
&nbsp;&nbsp;&nbsp; <br />
public TemplateModel exec(List args) throws TemplateModelException {<br />
SimpleDateFormat mydate = new SimpleDateFormat((String) args.get(0)));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return mydate.format(new Date(Long.parseLong((String)args.get(1)));<br />
&nbsp;&nbsp;&nbsp; }<br />
}&nbsp; <br />
将LongToDate对象放入到数据模型中<br />
root.put("timer", new IndexOfMethod());<br />
ftl模板里使用<br />
&lt;#assign x = "123112455445"&gt;<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 />
实现自定义的&lt;@transform&gt;文本或表达式&lt;<a>/@transform</a>&gt;的功能,允许对中间的最终文本进行解析转换</p>
<p>例子：实现&lt;@upcase&gt;str&lt;<a>/@upcase</a>&gt; 将str转换成STR 的功能</p>
<p>代码如下：<br />
import java.io.*;<br />
import java.util.*;<br />
import freemarker.template.TemplateTransformModel;</p>
<p>class UpperCaseTransform implements TemplateTransformModel {</p>
<p>&nbsp;&nbsp;&nbsp; public Writer getWriter(Writer out, Map args) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return new UpperCaseWriter(out);<br />
&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp; private class UpperCaseWriter extends Writer {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; private Writer out;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; UpperCaseWriter (Writer out) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.out = out;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public void write(char[] cbuf, int off, int len)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; throws IOException {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; out.write(new String(cbuf, off, len).toUpperCase());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public void flush() throws IOException {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; out.flush();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public void close() {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; }<br />
}&nbsp; <br />
然后将此对象put到数据模型中<br />
root.put("upcase", new UpperCaseTransform());</p>
<p>在view(ftl)页面中可以如下方式使用</p>
<p>&lt;@upcase&gt;<br />
hello world<br />
&lt;<a>/@upcase</a>&gt;</p>
打印输出:<br />
HELLO WORLD<br />
<br />
<a id="Editor_Edit_hlEntryLink" title="view: FreeMarke开发指南" href="http://www.cnblogs.com/ynlxc/archive/2006/10/16/529974.html" target="_blank"><font color="#002c99">http://www.cnblogs.com/ynlxc/archive/2006/10/16/529974.html</font></a>
<img src ="http://www.blogjava.net/Todd/aggbug/296111.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Todd/" target="_blank">Todd</a> 2009-09-23 09:32 <a href="http://www.blogjava.net/Todd/archive/2009/09/23/296111.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>spring freemarker 中文 乱码</title><link>http://www.blogjava.net/Todd/archive/2009/09/22/296023.html</link><dc:creator>Todd</dc:creator><author>Todd</author><pubDate>Tue, 22 Sep 2009 06:30:00 GMT</pubDate><guid>http://www.blogjava.net/Todd/archive/2009/09/22/296023.html</guid><wfw:comment>http://www.blogjava.net/Todd/comments/296023.html</wfw:comment><comments>http://www.blogjava.net/Todd/archive/2009/09/22/296023.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Todd/comments/commentRss/296023.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Todd/services/trackbacks/296023.html</trackback:ping><description><![CDATA[遇到问题：<br />
&nbsp;&nbsp; 已经在网上找到设置如下<br />
&nbsp;&nbsp; &lt;bean id="freemarkerConfigurer" class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer"&gt;<br />
&nbsp;&nbsp;&nbsp; &nbsp; &lt;property name="templateLoaderPath"&gt;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &lt;value&gt;/WEB-INF/templates/&lt;/value&gt;<br />
&nbsp;&nbsp;&nbsp; &nbsp; &lt;/property&gt;&nbsp;&nbsp;&nbsp; &nbsp;<br />
&nbsp;&nbsp;&nbsp; &nbsp; &lt;property name="freemarkerSettings"&gt;&lt;!-- 如果模板不经常更新，此属性设置更新延迟时间 --&gt;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &lt;props&gt;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;prop key="template_update_delay"&gt;0&lt;/prop&gt;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;prop key="defaultEncoding"&gt;UTF-8&lt;/prop&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;prop key="locale"&gt;zh_CN&lt;/prop&gt;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &lt;/props&gt;<br />
&nbsp;&nbsp;&nbsp; &nbsp; &lt;/property&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/bean&gt; <br />
&nbsp;&nbsp; 但是,<br />
&nbsp;&nbsp; <br />
&nbsp;&nbsp; 在控制台中输出汉字正常，页面显示乱码。使用httpwatch,查到contenttype 类型为text/html;charset=ISO-8859-1；<br />
&nbsp;&nbsp; 于是在<br />
&nbsp; &lt;bean id="viewResolver" class="org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver"&gt;&nbsp;&nbsp;&nbsp; 里添加<br />
&nbsp; &lt;property name="contentType" value="text/html;charset=UTF-8"&gt;&lt;/property&gt;<br />
&nbsp; 问题解决<br />
<br />
<img src ="http://www.blogjava.net/Todd/aggbug/296023.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Todd/" target="_blank">Todd</a> 2009-09-22 14:30 <a href="http://www.blogjava.net/Todd/archive/2009/09/22/296023.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>spring获取webapplicationcontext,applicationcontext几种方法详解</title><link>http://www.blogjava.net/Todd/archive/2009/09/15/295112.html</link><dc:creator>Todd</dc:creator><author>Todd</author><pubDate>Tue, 15 Sep 2009 03:11:00 GMT</pubDate><guid>http://www.blogjava.net/Todd/archive/2009/09/15/295112.html</guid><wfw:comment>http://www.blogjava.net/Todd/comments/295112.html</wfw:comment><comments>http://www.blogjava.net/Todd/archive/2009/09/15/295112.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Todd/comments/commentRss/295112.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Todd/services/trackbacks/295112.html</trackback:ping><description><![CDATA[<p>方法一：在初始化时保存ApplicationContext对象<br />
代码：<br />
ApplicationContext ac = new FileSystemXmlApplicationContext("applicationContext.xml");<br />
ac.getBean("beanId");<br />
说明：这种方式适用于采用Spring框架的独立应用程序，需要程序通过配置文件手工初始化Spring的情况。</p>
<p>方法二：通过Spring提供的工具类获取ApplicationContext对象<br />
代码：<br />
import org.springframework.web.context.support.WebApplicationContextUtils;<br />
ApplicationContext ac1 = WebApplicationContextUtils.getRequiredWebApplicationContext(ServletContext sc);<br />
ApplicationContext ac2 = WebApplicationContextUtils.getWebApplicationContext(ServletContext sc);<br />
ac1.getBean("beanId");<br />
ac2.getBean("beanId");<br />
说明：<br />
这种方式适合于采用Spring框架的B/S系统，通过ServletContext对象获取ApplicationContext对象，然后在通过它获取需要的类实例。</p>
<p><span style="color: red;">上面两个工具方式的区别是，前者在获取失败时抛出异常，后者返回null。</span></p>
<p><span style="color: red;">其中 servletContext sc 可以具体 换成 servlet.getServletContext()或者
this.getServletContext() 或者 request.getSession().getServletContext();
另外，由于spring是注入的对象放在ServletContext中的，所以可以直接在ServletContext取出
WebApplicationContext 对象：
WebApplicationContext webApplicationContext = (WebApplicationContext)
servletContext.getAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE);</span></p>
<p>方法三：继承自抽象类ApplicationObjectSupport<br />
说明：抽象类ApplicationObjectSupport提供getApplicationContext()方法，可以方便的获取到ApplicationContext。<br />
Spring初始化时，会通过该抽象类的setApplicationContext(ApplicationContext context)方法将ApplicationContext 对象注入。</p>
<p>方法四：继承自抽象类WebApplicationObjectSupport<br />
说明：类似上面方法，调用getWebApplicationContext()获取WebApplicationContext</p>
方法五：实现接口ApplicationContextAware<br />
说明：实现该接口的setApplicationContext(ApplicationContext context)方法，并保存ApplicationContext 对象。<br />
Spring初始化时，会通过该方法将ApplicationContext对象注入。<br />
<br />
<br />
在web应用中一般用ContextLoaderListener加载webapplication,如果需要在action之外或者control类之外获取webapplication思路之一是，单独写个类放在static变量中，<br />
类似于：<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;AppContext&nbsp;{<br />
<br />
&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">static</span><span style="color: #000000;">&nbsp;AppContext&nbsp;instance;<br />
<br />
&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;AbstractApplicationContext&nbsp;appContext;<br />
<br />
&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">synchronized</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">static</span><span style="color: #000000;">&nbsp;AppContext&nbsp;getInstance()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(instance&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">null</span><span style="color: #000000;">)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;instance&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;AppContext();<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;instance;<br />
&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;AppContext()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.appContext&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;ClassPathXmlApplicationContext(<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">/applicationContext.xml</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;AbstractApplicationContext&nbsp;getAppContext()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;appContext;<br />
&nbsp;&nbsp;}<br />
} <br />
</span></div>
<br />
不过这样，还是加载了2次applicationcontext,servlet一次，路径加载一次；觉得不如直接用路径加载，舍掉servlet加载<br />
在网上也找了些其他说法:实现<span><span>ApplicationContextAware，，， 接口，或者servletcontext</span></span><span><span>Aware接口,</span></span><span><span>还要写配置文件。有的竟然要把配置文件里的</span></span>listener，<span style="color: red;">换成</span>自己的类，这样纯粹多此一举。不过有的应用不是替换，是在补一个listener，<br />
我在一版的jpetstore（具体那一版不知道）里发现了这个：<br />
[web.xml]里<br />
&nbsp; &nbsp;&nbsp;&nbsp; <br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">listener</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">listener-class</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;">org.springframework.web.context.ContextLoaderListener</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">listener-class</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">listener</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">listener</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">listener-class</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;">com.ibatis.jpetstore.util.SpringInit</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">listener-class</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">listener</span><span style="color: #0000ff;">&gt;</span></div>
其中SpringInit实现接口<span style="color: #000000;">ServletContextListener </span>：<br />
<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff;">package</span><span style="color: #000000;">&nbsp;com.ibatis.jpetstore.util;<br />
<br />
</span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;javax.servlet.ServletContextEvent;<br />
</span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;javax.servlet.ServletContextListener;<br />
</span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;org.springframework.context.ApplicationContext;<br />
</span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;org.springframework.web.context.WebApplicationContext;<br />
</span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;org.springframework.web.context.support.WebApplicationContextUtils;<br />
<br />
<br />
</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;SpringInit&nbsp;</span><span style="color: #0000ff;">implements</span><span style="color: #000000;">&nbsp;ServletContextListener&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">static</span><span style="color: #000000;">&nbsp;WebApplicationContext&nbsp;springContext;<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;SpringInit()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">super</span><span style="color: #000000;">();<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;contextInitialized(ServletContextEvent&nbsp;event)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;springContext&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;WebApplicationContextUtils.getWebApplicationContext(event.getServletContext());<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;contextDestroyed(ServletContextEvent&nbsp;event)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">static</span><span style="color: #000000;">&nbsp;ApplicationContext&nbsp;getApplicationContext()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;springContext;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
}<br />
</span></div>
<br />
在其中的一个bean的构造里SpringInit获取applicationcontext,代码：<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;">&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;OrderBean()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">this</span><span style="color: #000000;">(<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(AccountService)&nbsp;SpringInit.getApplicationContext().getBean(</span><span style="color: #000000;">"</span><span style="color: #000000;">accountService</span><span style="color: #000000;">"</span><span style="color: #000000;">),<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(OrderService)&nbsp;SpringInit.getApplicationContext().getBean(</span><span style="color: #000000;">"</span><span style="color: #000000;">orderService</span><span style="color: #000000;">"</span><span style="color: #000000;">)&nbsp;);<br />
&nbsp;&nbsp;}</span></div>
<br />
恩，这种在action,servlet之外的bean里获取applicationcontext的方法值得参考，应该有用<br />
<img src ="http://www.blogjava.net/Todd/aggbug/295112.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Todd/" target="_blank">Todd</a> 2009-09-15 11:11 <a href="http://www.blogjava.net/Todd/archive/2009/09/15/295112.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>【转】Spring+iBatis整合</title><link>http://www.blogjava.net/Todd/archive/2009/09/10/294653.html</link><dc:creator>Todd</dc:creator><author>Todd</author><pubDate>Thu, 10 Sep 2009 13:07:00 GMT</pubDate><guid>http://www.blogjava.net/Todd/archive/2009/09/10/294653.html</guid><wfw:comment>http://www.blogjava.net/Todd/comments/294653.html</wfw:comment><comments>http://www.blogjava.net/Todd/archive/2009/09/10/294653.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Todd/comments/commentRss/294653.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Todd/services/trackbacks/294653.html</trackback:ping><description><![CDATA[<div class="blog_content">
<div class="tit">Spring+iBatis整合<br />
2008-03-19 10:24 A.M.</div>
<div class="cnt" id="blog_text">
<p>&nbsp;&nbsp; ibatis和Spring整合的详细例子,数据库用的是mysql,开发环境是Eclipse3.2:<br />
1.首先把用到的包导入进来,此例用的是spring-framework-1.2.7,iBATIS_DBL-2.1.7.597,mysql的数<br />
据库连接包用的是mysql-connector-java-5.0.3-bin.jar.</p>
<p>2.建POJO类,在此我们用的是一个Student类.<br />
package cn.itcast;<br />
<br />
public class Student implements java.io.Serializable {<br />
&nbsp;&nbsp; private Integer id;<br />
<br />
&nbsp;&nbsp; private String firstname;<br />
<br />
&nbsp;&nbsp; private String lastname;<br />
<br />
&nbsp;&nbsp; public String getFirstname() {<br />
&nbsp;&nbsp;&nbsp; return firstname;<br />
&nbsp;&nbsp; }<br />
<br />
&nbsp;&nbsp; public void setFirstname(String firstname) {<br />
&nbsp;&nbsp;&nbsp; this.firstname = firstname;<br />
&nbsp;&nbsp; }<br />
<br />
&nbsp;&nbsp; public Integer getId() {<br />
&nbsp;&nbsp;&nbsp; return id;<br />
&nbsp;&nbsp; }<br />
<br />
&nbsp;&nbsp; public void setId(Integer id) {<br />
&nbsp;&nbsp;&nbsp; this.id = id;<br />
&nbsp;&nbsp; }<br />
<br />
&nbsp;&nbsp; public String getLastname() {<br />
&nbsp;&nbsp;&nbsp; return lastname;<br />
&nbsp;&nbsp; }<br />
<br />
&nbsp;&nbsp; public void setLastname(String lastname) {<br />
&nbsp;&nbsp;&nbsp; this.lastname = lastname;<br />
&nbsp;&nbsp; }<br />
}</p>
<p>3.POJO的映射文件Student.xml,在这里面只有两个功能,即根据student的id检索出一个Student对象,另一<br />
个就是向数据库插入一条记录(一个Student对象),注意:此应用程序中所有的配置文件(xml文件和<br />
properties文件都放在configfile包下面).<br />
&lt;?xml version="1.0" encoding="UTF-8"?&gt;<br />
&lt;!DOCTYPE sqlMap PUBLIC "-//iBATIS.com//DTD SQL Map 2.0//EN" "<a href="http://www.ibatis.com/dtd/sql-map-2.dtd">http://www.ibatis.com/dtd/sql-map-2.dtd</a> "&gt;<br />
&lt;!--这是POJO映射文件的根元素--&gt;<br />
&lt;sqlMap namespace="Student"&gt;<br />
&nbsp;&nbsp; &lt;!--select元素的id属性用来标识此元素,resultClass属性的值是Java类的全限定名（即包括类的包名）。<br />
&nbsp;&nbsp; resultClass属性可以让您指定一个Java类，根据ResultSetMetaData将其自动映射到JDBC的ResultSet。<br />
&nbsp;&nbsp; 只要是Java Bean的属性名称和ResultSet的列名匹配，属性自动赋值给列值。<br />
&nbsp;&nbsp; parameterClass属性是参数的类型,此属性的值是Java类的全限定名（即包括类的包名）。<br />
&nbsp;&nbsp; 它是可选的，但强烈建议使用。它的目的是 限制输入参数的类型为指定的Java类，并<br />
&nbsp;&nbsp; 优化框架的性能。--&gt;<br />
&nbsp;&nbsp; &lt;select id="getStudentById" resultClass="cn.itcast.Student" parameterClass="int"&gt;<br />
&nbsp;&nbsp;&nbsp; select id,firstname,lastname from student where id=#value#<br />
&nbsp;&nbsp; &lt;/select&gt;<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp; &lt;insert id="insertStudent" parameterClass="cn.itcast.Student"&gt;<br />
&nbsp;&nbsp;&nbsp; insert into student(firstname,lastname) values(#firstname#,#lastname#)<br />
&nbsp;&nbsp; &lt;/insert&gt;<br />
&lt;/sqlMap&gt;</p>
<p>4.建一个SqlMap的配置文件sql-map-config.xml,sqlMap元素的resource属性告诉Spring去哪找POJO映射文件.<br />
&lt;?xml version="1.0" encoding="UTF-8"?&gt;<br />
&lt;!DOCTYPE sqlMapConfig<br />
PUBLIC "-//iBATIS.com//DTD SQL Map Config 2.0//EN"<br />
"<a href="http://www.ibatis.com/dtd/sql-map-config-2.dtd">http://www.ibatis.com/dtd/sql-map-config-2.dtd</a> "&gt;<br />
&lt;sqlMapConfig&gt;<br />
&nbsp;&nbsp; &lt;sqlMap resource="configfile/Student.xml" /&gt;<br />
&lt;/sqlMapConfig&gt;</p>
<p>5.jdbc.properties文件,存储数据库连接的driver,url,username,password等信息,<br />
jdbc.driver=com.mysql.jdbc.Driver<br />
jdbc.url=jdbc:mysql://localhost/itcast<br />
jdbc.username=root<br />
jdbc.password=</p>
<p><br />
6.Spring配置文件applicationContext.xml<br />
&lt;?xml version="1.0" encoding="UTF-8"?&gt;<br />
&lt;!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "<a href="http://www.springframework.org/dtd/spring-beans.dtd">http://www.springframework.org/dtd/spring-beans.dtd</a> "&gt;<br />
<br />
&lt;beans&gt;<br />
<br />
&nbsp;&nbsp; &lt;!--此bean告诉Spring去哪找数据库的配置信息,因为有此Bean才出现下面用${}标记来取变量的语句--&gt;<br />
&nbsp;&nbsp; &lt;bean id="propertyConfig"<br />
&nbsp;&nbsp;&nbsp; class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;property name="location"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;value&gt;configfile/jdbc.properties&lt;/value&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/property&gt;<br />
&nbsp;&nbsp; &lt;/bean&gt;<br />
<br />
&nbsp;&nbsp; &lt;!--配置一个数据源,根据上面propertyConfig指定的location去找数据库连接的配置信息--&gt;<br />
&nbsp;&nbsp; &lt;bean id="dataSource"<br />
&nbsp;&nbsp;&nbsp; class="org.springframework.jdbc.datasource.DriverManagerDataSource"&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;property name="driverClassName"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;value&gt;${jdbc.driver}&lt;/value&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/property&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;property name="url"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;value&gt;${jdbc.url}&lt;/value&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/property&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;property name="username"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;value&gt;${jdbc.username}&lt;/value&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/property&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;property name="password"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;value&gt;${jdbc.password}&lt;/value&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/property&gt;<br />
&nbsp;&nbsp; &lt;/bean&gt;<br />
<br />
&nbsp;&nbsp; &lt;!--根据dataSource和configLocation创建一个SqlMapClient--&gt;<br />
&nbsp;&nbsp; &lt;bean id="sqlMapClient"<br />
&nbsp;&nbsp;&nbsp; class="org.springframework.orm.ibatis.SqlMapClientFactoryBean"&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;property name="configLocation"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;value&gt;configfile/sql-map-config.xml&lt;/value&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/property&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;property name="dataSource"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;ref bean="dataSource" /&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/property&gt;<br />
&nbsp;&nbsp; &lt;/bean&gt;<br />
<br />
&nbsp;&nbsp; &lt;!--根据sqlMapClien创建一个SqlMapClient模版类--&gt; <br />
&nbsp;&nbsp; &lt;bean id="sqlMapClientTemplate"<br />
&nbsp;&nbsp;&nbsp; class="org.springframework.orm.ibatis.SqlMapClientTemplate"&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;property name="sqlMapClient"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;ref bean="sqlMapClient" /&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/property&gt;<br />
&nbsp;&nbsp; &lt;/bean&gt;<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp; &lt;!--将上面的模版类织入到我们的DAO对象中--&gt;<br />
&nbsp;&nbsp; &lt;bean id="studentDao" class="cn.itcast.StudentDaoSqlMap"&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;property name="sqlMapClientTemplate"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;ref bean="sqlMapClientTemplate" /&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/property&gt;<br />
&nbsp;&nbsp; &lt;/bean&gt;<br />
<br />
&lt;/beans&gt;</p>
<p>7.StudentDaoSqlMap 是一个DAO,它负责和数据库的交互,在这里实现了查询单条记录和插入单条记录的功能.<br />
package cn.itcast;<br />
<br />
import org.springframework.orm.ibatis.SqlMapClientTemplate;<br />
<br />
public class StudentDaoSqlMap {<br />
<br />
//<span style="color: red">[1]</span><br />
&nbsp;<span style="color: red">&nbsp; private SqlMapClientTemplate sqlMapClientTemplate;<br />
<br />
&nbsp;&nbsp; public SqlMapClientTemplate getSqlMapClientTemplate() {<br />
&nbsp;&nbsp;&nbsp; return sqlMapClientTemplate;<br />
&nbsp;&nbsp; }<br />
<br />
&nbsp;&nbsp; public void setSqlMapClientTemplate(<br />
&nbsp;&nbsp;&nbsp;&nbsp; SqlMapClientTemplate sqlMapClientTemplate) {<br />
&nbsp;&nbsp;&nbsp; this.sqlMapClientTemplate = sqlMapClientTemplate;<br />
&nbsp;&nbsp; }<br />
</span><br />
&nbsp;&nbsp; //此方法的返回值与Student.xml的select元素的resultClass对应.<br />
&nbsp;&nbsp; public Student getStudent(Integer id) {<br />
&nbsp;&nbsp;&nbsp; return (Student) sqlMapClientTemplate.queryForObject("getStudentById",id);<br />
&nbsp;&nbsp;&nbsp; //注意:queryForObject方法返回一个Object,第一个参数与Student.xml的select元素<br />
&nbsp;&nbsp;&nbsp; //的id属性值对应,第二个参数的类型与Student.xml的select元素的parameterClass<br />
&nbsp;&nbsp;&nbsp; //属性值对应.<br />
&nbsp;&nbsp; }<br />
<br />
&nbsp;&nbsp; public Object insertStudent(Student student) {<br />
&nbsp;&nbsp;&nbsp; return sqlMapClientTemplate.insert("insertStudent", student);<br />
&nbsp;&nbsp; }<br />
}</p>
<p>8.下面写一个带main函数的类来测试上面的代码.代码非常简单就不再解释了.<br />
package cn.itcast;<br />
<br />
import org.springframework.context.ApplicationContext;<br />
import org.springframework.context.support.ClassPathXmlApplicationContext;<br />
<br />
public class Client {<br />
<br />
&nbsp;&nbsp; public static void main(String[] args) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: red">//[2]<br />
&nbsp;&nbsp;&nbsp; ApplicationContext factory = new ClassPathXmlApplicationContext(<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "applicationContext.xml");<br />
</span><br />
&nbsp;&nbsp;&nbsp; StudentDaoSqlMap studentDao = (StudentDaoSqlMap) factory<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .getBean("studentDao");<br />
&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp; //插入一个student<br />
&nbsp;&nbsp;&nbsp; Student student = new Student();<br />
&nbsp;&nbsp;&nbsp; student.setFirstname("tian");<br />
&nbsp;&nbsp;&nbsp; student.setLastname("xiangdong");<br />
&nbsp;&nbsp;&nbsp; studentDao.insertStudent(student);<br />
<br />
&nbsp;&nbsp;&nbsp; //查询出id是1的Student对象.<br />
&nbsp;&nbsp;&nbsp; //Student student = studentDao.getStudent(1);<br />
&nbsp;&nbsp;&nbsp; //System.out.println(student.getId());<br />
&nbsp;&nbsp;&nbsp; //System.out.println(student.getFirstname());<br />
&nbsp;&nbsp;&nbsp; //System.out.println(student.getLastname());<br />
&nbsp;&nbsp; }<br />
<br />
}</p>
</div>
<br />
###########################<br />
准备玩spring,搞个入门的看看，<br />
<br />
[1]DAO可以继承SqlMapClientDaoSupport类省得写sqlmapclienttemplate的get,set,前面的注入依然有效<br />
[2]spring在web里还是用WebApplicationContextUtils.getWebApplicationContext()获取上下文，配置文件放到WEB-INF文件夹下比较舒服</div>
<img src ="http://www.blogjava.net/Todd/aggbug/294653.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Todd/" target="_blank">Todd</a> 2009-09-10 21:07 <a href="http://www.blogjava.net/Todd/archive/2009/09/10/294653.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>