??xml version="1.0" encoding="utf-8" standalone="yes"?>
1、下载antQ从jakarta.apache.org
安装在c:\dev\antQ安装过E就不详l说了,如果ant都不懂,那看来您有些落伍了,也先别往下看了,学习一下ant?
2、下载xdocletQ当然是xdoclet.sf.net了,下蝲后把lib的东西放|到
c:\dev\ant\lib\xdoclet
3、java 代码
只是个例子而已
===================================================================
XdocletMain.java :
===================================================================
代码:
/**
* Created by IntelliJ IDEA.
* User: wangzy
* Date: 2004-12-5
* @spring.bean
* id="XdocletMain"
* singleton="true"
* 上述说明,q是个spring的beanQid为XdocletMainQ如果看不懂Q再补习一下xdoclet
* @spring.property
* name="bean1"
* ref="Bean1"
* 上述说明Q有个bean1属性,兌的ؓBean1的springlg
* @spring.property
* name="bean2"
* ref="Bean2"
* 同上
*/
public class XdocletMain {
public Bean1 getBean1() {
return bean1;
}
public void setBean1(Bean1 bean1) {
this.bean1 = bean1;
}
public Bean2 getBean2() {
return bean2;
}
public void setBean2(Bean2 bean2) {
this.bean2 = bean2;
}
private Bean1 bean1 = null;
private Bean2 bean2 = null;
}
===================================================================
Bean1.java :
===================================================================
代码:
/**
* Created by IntelliJ IDEA.
* User: wangzy
* Date: 2004-12-5
* @spring.bean
* id="Bean1"
* singleton="true"
* 声明一个Bean1的springlg
*/
public class Bean1 {
}
===================================================================
Bean2.java :
===================================================================
代码:
/**
* Created by IntelliJ IDEA.
* User: wangzy
* Date: 2004-12-5
* @spring.bean
* id="Bean2"
* singleton="true"
* cMBean1
*/
public class Bean2 {
}
===================================================================
下来当然是最重要的ant的build.xml了,其中相关部分为:
代码:
<!--q里是xdoclet的lib,q些都不是ant的core包,所以要引进?-->
<path id="xdoclet.class.path">
<fileset dir="c:\dev\ant\lib\xdoclet">
<include name="*.jar"/>
</fileset>
</path>
<!--q里是生成spring-beans配置?-->
<target name="srpingdoclet">
<!--定义springdoclet task -->
<taskdef
name="springdoclet"
classname="xdoclet.modules.spring.SpringDocletTask"
classpathref="xdoclet.class.path"
/>
<!--q里Ҏsrc下的java文g中的信息Q生成spring-beans.xml到“spring/spring-beans.xml”文件中-->
<springdoclet destdir="spring">
<fileset dir="src" includes="**/*.java" />
<springxml destinationFile="spring-beans.xml" />
</springdoclet>
</target>
q行ant springdocletQ看看spring/spring-beans.xml文gQ大功告成!Q!
具体详细信息可以看xdoclet文档
代码:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC
"-//SPRING//DTD BEAN//EN"
"http://www.springframework.org/dtd/spring-beans.dtd">
<beans
default-autowire="no"
default-lazy-init="false"
default-dependency-check="none"
>
<bean
id="Bean1"
class="Bean1"
singleton="true"
>
</bean>
<bean
id="XdocletMain"
class="XdocletMain"
singleton="true"
>
<property name="bean1">
<ref bean="Bean1"/>
</property>
<property name="bean2">
<ref bean="Bean2"/>
</property>
</bean>
<bean
id="Bean2"
class="Bean2"
singleton="true"
>
</bean>
<!--
To include additional bean definitions for Spring in the generated
application context file, add a file to your XDoclet merge directory
called spring-beans.xml that contains the <bean></bean> markup.
-->
</beans>
]]>
相对于EJB来说QSpring是一个轻量的J2EE应用开发框架。这里提到的轻量U指的是Spring框架本nQ而不是说Spring只能适用于轻量的应用开发。Spring的轻盈体现在其框架本w的基础l构以及对其他应用工L支持和装配能力,与EJBq种庞然大物相比QSpring使我们把各个技术层ơ之间的风险降低。EJB的内聚性较强,比如数据持久层管理、事务管理、生命周期管理都全部交给了EJB容器中管理,内聚性的白盒特征使我们必L弃一部分可控性而去信Q容器能力。而Spring则是考虑如何“不造轮子”,如何更好的组装这些轮子,让他们更好的转动。比如数据持久层理可以使用hibernateQ日志管理可以用jakartacommonlogging。一个比较恰当的比喻是“我们要钉几个钉子,Z完成q个目的Q锤子生产商生了大大小一pd的锤子,每个锤子都有一套复杂的使用ҎQ用来钉某种特别的钉子,l果令我们头g堪。解决锤子过多的问题Q通过springQ我们可以用几U锤子,但用h象是只有一个锤子”?注:q段话是在网上看见的Q这里引用这个比喻,我个得很生动)关于q个框架也有一些简单的ȝQ“Spring有几个主要的部分QBean+ApplicationContextQ以一U统一的、IoC的方式查找、管理、组装、用系l的lgQ取代一切工厂;持久化框Ӟweb框架。“J2EE框架”是RodJohnson的愿景,他希望Spring为J2EE轻量U解x案提供自底至的全面基础设施支持。?
上面是关于一个新的Framework的简单介l,据说是未来J2EE发展的方向。以前在论坛上有关于J2EE最佳组合的讨论Q听说这个JSTL+Struts(或webwork)+Spring+Hibernate的组合很被看?如果你感兴趣的话Q可以到SpringFramework中文论坛上看看。下面{入本文的正题?
Spring 标记库介l及用法Q?
本文重点介lSpring 提供的标记库及其用法Q?
当你在项目中用Spring Framework的时候,表现层可以选择Spring Framework自带的标记库。当Ӟq不是你唯一的选择。你可以选择其它标记库或模板替换技术。Spring Framework q没有ؓ应用提供非常丰富的标记库。Spring Framework 提供的标记库仅仅是ؓ了够用就行,它ƈ不是无所不包的。呵呵,q点与Struts丰富的标记库不一栗其实这点符合RodJohnson的出发点Q既“不造轮子”。当ӞSpring Framework标记库有它自w的特点Q可以说是个有益的补充吧?
Spring 标记库分cd下:
1、spring:hasBindErrors
2、spring:bind
3、spring:transform
4、spring:message
5、spring:htmlEscape
6、spring:theme
下面我们来具体介l一下用法:
1、spring:hasBindErrors
对应org.springframework.web.servlet.tags.BindErrorsTag标记库处理类?
q个标记提供用于l定对象的errorsQ如果这个标记被用到的话Q那么关于这个对象的错误在面上显C出来。用这个标记的前提条g是要先用<spring:bindQ标?q且Qspring:hasBindErrorsQ这个标C能用来表C对象的状态,它仅仅可以绑定对象本w和对象的属性?具体用法如下Q?
Qspring:hasBindErrors name="priceIncrease"Q?QbQPlease fix all errors!Q?bQ?Q?spring:hasBindErrorsQ?
通过q个单的例子Q我来具体说一下这个标记的属性吧?
nameQ是要被查的Bean的名字。这个属性是必需要的?
q里是简单用法,所以就不介l它包含的errors变量了。具体看p文档。下同?
2、spring:bind
对应org.springframework.web.servlet.tags.BindTag标记库处理类
q个标记用来为某个bean或bean 的属性赋|通常和form一LQ相当于action的作用。它指明表单要提交到那个cLcȝ属性中厅R?
其中path属性是必须的,指明转到的类的\径。D例如下:
Qform method="post"Q?
Qtable width="95%" bgcolor="f8f8ff" border="0" cellspacing="0" cellpadding="5"Q?
QtrQ?
Qtd alignment="right" width="20%"QIncrease (%):Q?tdQ?
Qspring:bind path="priceIncrease.percentage"Q?
Qtd width="20%"Q?
Qinput type="text" name="percentage" value="Qc:out value="${status.value}"/Q?Q?
Q?tdQ?
Qtd width="60%"Q?
Qfont color="red"Q<c:out value="${status.errorMessage}"/Q</fontQ?
Q?tdQ?
Q?spring:bindQ?
Q?trQ?
Q?tableQ?
QbrQ?
……………………省?
Q?formQ?
3、spring:transform
对应org.springframework.web.servlet.tags.TransformTag标记库处理类,q个标记用来转换表单中不与bean中的属性一一对应的那些属性,通常和<spring:bindQ一起用。<spring:transformQ标CؓQspring:bindQ用提供了更好的支持?
属性如下:
valueQ必需要的。和当前Qspring:bindQ标记指向的beancȝ同。就是你要{换的实体cd?
varQ不是必需的。这个字W串被用来绑定输出结果到pageQrequest, session或application scope.默认情况输出到jsp中?
scopeQ不是必需的。前提条件var必须讄的情况下。它的值可以是pageQrequest, session或application?
4、spring:message 对应org.springframework.web.servlet.tags.MessageTag标记库处理类
q个标记用来帮助springframework支持国际化。和JSTL的fmt:message标记cM。当然这个标记可以很好的工作的本地的springframework框架下?
属性如下:
codeQ不是必需的。用来查找message,如果没有被用的话,text被使用?
textQ不是必需的。假如code不存在的话,默认是text输出。当code和text都没有设|的话,标记输Zؓnull.
varQ不是必需的。这个字W串被用来绑定输出结果到pageQrequest, session或application scope.默认情况输出到jsp中?
scopeQ不是必需的。前提条件var必须讄的情况下。它的值可以是pageQrequest, session或application?
5、spring:htmlEscape
对应org.springframework.web.servlet.tags.HtmlEscapeTag标记库处理类
不常用,q里省略
6、spring:theme
对应org.springframework.web.servlet.tags.ThemeTag标记库处理类
不常用,q里省略
学习完这些用法后Q让我们来看个具体的例子吧?
配置步骤如下Q?
目录l构图:
-spirngapp
-WEB-INF
-classes
-lib
-src
-war
1、将spring.tld拯到WEB-INF目录?
2、将spring.jar拯到WEB-INF\lib包下
举例如下Q?
在web.xml中配|好taglib属性,代码如下Q?
jsp面代码如下Q?
Qspring:bindQ标记经常用来绑定<inputQ表单元素以便提交给PriceIncrease.java,其实PriceIncrease.java中就是包含一些getter和setter的方法的cR当用户按下按钮提交的时候,其表单中的值实际上pframework攑ֈ了PriceIncrease.java中。<spring:bindQ经常和form一起?q个${status.errorMessage}?{status.value}是一个framework定义的特D变量,它们被用来显C错误信息和当前表单中的数据。呵呵,今天到此ؓ止吧Q关于Spring Framework标记库的详细用法Q请参考其文档?img src ="http://www.aygfsteel.com/konhon/aggbug/48674.html" width = "1" height = "1" />
]]>
作為org.springframework.web.servlet.mvc.AbstractController下的另一個子別Qorg.springframework.web.servlet.mvc.multiaction.MultiActionControllerQ它可以讓我們在一個Controller別中定多個方法,並根據我們的請求來呼叫當中的某個方法來埯?
如果您瞭解StrutsQ其DispatchAction類似於Spring的MultiActionController別Q所不同的是QMultiActionController擁有比Struts的DispatchAction更多樣化的方式來參數化與i織這些Action?
要用MultiActionControllerQ您要配合一個MethodNameResolver的實例,MultiActionController預設是InternalPathMethodNameResolverQ這是最單的方式,Ҏ您所i的E址最後的檔案名稱來判斯埯Action中的哪一個方法,但通常我們不會用InternalPathMethodNameResolverQ因為這就失去了用MultiActionController的一些優點,像是依請求參怾決定要呼叫的Ҏ?
我們通常會用ParameterMethodNameResolver或PropertiesMethodNameResolverQ在一個網址上結合請求參數,以參怾決定要執行哪一個ActionQ這邊以ParameterMethodNameResolverZQ首先,我們可以在bean定義檔中這麼撰寫Q?
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE beans PUBLIC "-//SPRING/DTD BEAN/EN""http://www.springframework.org/dtd/spring-beans.dtd"> <beans> <bean id="urlMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping"> <property name="mappings"> <props> <prop key="/book.do">bookAction</prop> </props> </property> </bean> <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="viewClass"> <value>org.springframework.web.servlet.view.InternalResourceView</value> </property> <property name="prefix"> <value>/WEB-INF/jsp/</value> </property> <property name="suffix"> <value>.jsp</value> </property> </bean> <bean id="paraMethodResolver" class="org.springframework.web.servlet.mvc.multiaction.ParameterMethodNameResolver"> <property name="paramName"><value>method</value></property> <property name="defaultMethodName"><value>list</value></property> </bean> <bean id="bookAction" class="onlyfun.caterpillar.GuestBookAction"> <property name="methodNameResolver"> <ref bean="paraMethodResolver"/> </property> <property name="testPage"> <value>test</value> </property> </bean> </beans>
在paraMethodResolver中,我們用paramName定義在http請求中用method參數來指定要呼叫的方法,若是請求中沒有指定method參數Q則會用defaultMethodName所指定的方法,這邊指定的是list()Ҏ?
GuestBookAction是個繼承MultiActionController的類別,當中我們可以定我們在method參數指定下所要呼叫的ҎQ例如:
package onlyfun.caterpillar; import javax.servlet.http.*; import org.springframework.web.servlet.ModelAndView; import org.springframework.web.servlet.mvc.multiaction.MultiActionController; public class GuestBookAction extends MultiActionController { privateString testPage; public ModelAndView list(HttpServletRequest req, HttpServletResponse res) { returnnew ModelAndView(this.getTestPage(),"executed", "list"); } public ModelAndView add(HttpServletRequest req, HttpServletResponse res) { returnnew ModelAndView(this.getTestPage(),"executed", "add"); } public ModelAndView delete(HttpServletRequest req, HttpServletResponse res) { returnnew ModelAndView(this.getTestPage(),"executed", "delete"); } publicString getTestPage() { return testPage; } public void setTestPage(String testPage) { this.testPage = testPage; } }
注意到我們的Ҏ必須包括HttpServletRequest與HttpServletResponse作為參數Q您也可以用帶有第三個參數HttpSession的版本?
上面的類別只是一個簡單的例Q用於測試MultiActionController的運作,我們測試用的JSPE頁如下Q?
<html>
<head><title>Test</title></head>
<body>
<H1> "${executed}" method is executed.</H2>
</body>
</html>
當您使用以下的網址請求資源時:
http://localhost:8080/springapp/book.do?method=add
我們的測試E頁傳回以下的內容Q?
<html>
<head><title>Test</title></head>
<body>
<H1> "add" method is executed.</H2>
</body>
</html>
您也可以所有相應的方法專門i織在一個委a(delegateQ物件中Q而不是撰寫在Controller別中,當請求來到時Q將委託i這個物件來埯指定的方法,您只要定MultiActionController的delegate屬性即可,例如我們的委託物g如下Q?
package onlyfun.caterpillar; import javax.servlet.http.*; import org.springframework.web.servlet.ModelAndView; public class BookActionDelegate { privateString testPage; public ModelAndView list(HttpServletRequest req, HttpServletResponse res) { returnnew ModelAndView(this.getTestPage(),"executed", "list"); } public ModelAndView add(HttpServletRequest req, HttpServletResponse res) { returnnew ModelAndView(this.getTestPage(),"executed", "add"); } public ModelAndView delete(HttpServletRequest req, HttpServletResponse res) { returnnew ModelAndView(this.getTestPage(),"executed", "delete"); } publicString getTestPage() { return testPage; } public void setTestPage(String testPage) { this.testPage = testPage; } }
珑֜我們不用定GuestBookAction了,直接使用MultiActionControllerQ只要定Bean定義檔就好了Q?
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE beans PUBLIC "-//SPRING/DTD BEAN/EN""http://www.springframework.org/dtd/spring-beans.dtd"> <beans> <bean id="urlMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping"> <property name="mappings"> <props> <prop key="/book.do">bookAction</prop> </props> </property> </bean> <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="viewClass"> <value>org.springframework.web.servlet.view.InternalResourceView</value> </property> <property name="prefix"> <value>/WEB-INF/jsp/</value> </property> <property name="suffix"> <value>.jsp</value> </property> </bean> <bean id="paraMethodResolver" class="org.springframework.web.servlet.mvc.multiaction.ParameterMethodNameResolver"> <property name="paramName"><value>method</value></property> <property name="defaultMethodName"><value>list</value></property> </bean> <bean id="bookActionDelegate" class="onlyfun.caterpillar.BookActionDelegate"> <property name="testPage"> <value>test</value> </property> </bean> <bean id="bookAction" class="org.springframework.web.servlet.mvc.multiaction.MultiActionController"> <property name="methodNameResolver"> <ref bean="paraMethodResolver"/> </property> <property name="delegate"> <ref bean="bookActionDelegate"/> </property> </bean> </beans>
測試的結果與上面是相同的?
以上說明的是ParameterMethodNameResolverQ而PropertiesMethodNameResolver的設定方法是似的,有興的話,可以看一下Spring參考手冊中有關MultiActionController的說明,當中也有個簡明的a定例?