??xml version="1.0" encoding="utf-8" standalone="yes"?>
构架一个Web应用需要弄明白好多问题?q运的是Q已l有不少开发者已l遇到过q类问题Qƈ且徏立了处理q类问题的框架?一个好框架具备以下几点Q?减轻开发者处理复杂的问题的负担(“不重复发明轮?#8221;Q; 内部有良好的扩展Q?q且有一个支持它的强大的用户团体?好的构架一般有针对性的处理某一c问题,q且能将它做好(Do One Thing wellQ?然而,你的E序中有几个层可能需要用特定的框架Q已l完成的UI(用户接口) q不代表你也可以把你的业务逻辑和持久逻辑偶合C的UI部分?举个例子Q?你不该在一个Controller(控制?里面写JDBC代码作ؓ你的业务逻辑Q?q不是控制器应该提供的?一个UI 控制器应该委z其它l在UI范围之外的轻量lg?好的框架应该能指g码如何分布?更重要的是,框架能把开发者从~码中解攑և来,使他们能专心于应用程序的逻辑Q这对客h说很重要Q?
q篇文章讨论怎样l合几种著名的框架来使得你的应用E序做到村ּ耦合?
如何建立你的架构Qƈ且怎样让你的各个应用层保持一致。?如何整合框架以便让每个层在以一U松散偶合的方式彼此作用而不用管低层的技术细节?q对我们来说真是一U挑战?q里讨论一个整合框架的{略( 使用3 U受Ƣ迎的开源框? Q表C层我们用StrutsQ?业务层我们用SpringQ而持久层则用Hibernate?你也可以用其他FrameWork替换只要能得到同L效果?见图1 Q框架组合示意图Q?
应用E序的分?/span>
大部分的Web应用在职责上臛_能被分成4层?q四层是QpresentationQ描qͼQpersistenceQ持久)QbusinessQ业务)和domain modelQ域模块Q。每个层在处理程序上都应该有一Ҏ的责Q, 而不应该在功能上与其它层混合Qƈ且每个层要与其它层分开的,但要l他们之间放一个通信接口?我们׃介绍各个层开始,讨论一下这些层应该提供什么,不应该提供什么?
表示?The Presentation Layer)
一般来Ԍ一个典型的Web应用的的末端应该是表C层?很多Java发者也理解Struts所提供的?象业务逻辑之类的被打包到org.apache.struts.Action.Q?因此Q我们很赞成使用Strutsq样的框架?
下面是Struts所负责的:
* 理用户的请?做出相应的响应?
* 提供一个Controller ,委派调用业务逻辑和其它上层处理?
* 处理异常Q抛lStruts Action
* 为显C提供一个模?
* UI验证?
以下条款Q不该在Struts昄层的~码中经常出现?它们与显C层无关的?
* 直接的与数据库通信Q例如JDBC调用?
* 与你应用E序相关联的业务逻辑以及校验?
* 事物理?
在表C层引入q些代码Q则会带来高偶合和麻烦的l护?
持久?The Persistence Layer)
典型的Web应用的另一个末端是持久层。这里通常是程序最Ҏ失控的地斏V开发者L低估构徏他们自己的持久框架的挑战性。系l内部的持箋层不但需要大量调试时_而且q经常缺功能之变得难以控Ӟq是持久层的通病?q好有几个ORM开源框架很好的解决了这c问题。尤其是Hibernate?Hibernate为java提供了OR持久化机制和查询服务, 它还l已l熟悉SQL和JDBC API 的Java开发者一个学习桥梁,他们学习h很方ѝ?Hibernate的持久对象是ZPOJO和Java collections。此外,使用Hibernateq不妨碍你正在用的IDE?
L下面的条目,你在持久层编码中需要了解的?
* 查询对象的相关信息的语句?Hibernate通过一个OO查询语言QHQLQ或者正则表辄API来完成查询?HQL非常cM于SQL-- 只是把SQL里的table和columns用Object和它的fields代替?你需要学习一些新的HQL语言Q?不管怎样Q他们容易理解而文档也做的很好?HQL是一U对象查询的自然语言Q花很小的代价就能学习它?
* 如何存储Q更斎ͼ删除数据库记录?
* 象Hibernateq类的高UORM框架支持大部分主数据库Qƈ且他们支?Parent/child关系Q事物处理,l承和多态?
业务层(The Business LayerQ?/span>
一个典型Web应用的中间部分是业务层或者服务层?从编码的视角来看Q这层是最Ҏ被忽视的一层?而我们却往往在UI层或持久层周围看到这些业务处理的代码Q这其实是不正确的,因ؓ它导致了E序代码的紧密偶合,q样一来,随着旉推移q些代码很难l护。幸好,针对q一问题有好几种Frameworks存在?最受欢q的两个框架是Spring和PicoContainer?q些Z被称为microcontainersQ他们能让你很好的把对象搭配h?q两个框枉着手于‘依赖注射’(dependency injection)(q有我们知道?#8216;控制反{’Inversion of Control=IoC)q样的简单概c?q篇文章关注于Spring的注(译注Q通过一个给定参数的SetterҎ来构造Bean,有所不同于FactoryQ? Springq提供了Setter Injection(type2)QConstructor Injection(type3){方式供我们选择?Spring把程序中所涉及到包含业务逻辑和Dao的Objects——例如transaction management handlerQ事物管理控Ӟ、Object Factoris(对象工厂)、service objectsQ服务组Ӟ——都通过XML来配|联pv来?
后面我们会D个例子来揭示一下Spring 是怎样q用q些概念?
业务层所负责的如下:
* 处理应用E序?业务逻辑和业务校?
* 理事物
* 允许与其它层怺作用的接?
* 理业务层别的对象的依赖?
* 在显C层和持久层之间增加了一个灵zȝ机制Q得他们不直接的联pd一赗?
* 通过揭示 从显C层C务层之间的Context来得到business services?
* 理E序的执行(从业务层到持久层Q?
域模块层QThe Domain Model Layer Q?/span>
既然我们致力于的是一个不是很复杂的Web的应用, 我们需要一个对象集合,让它在不同层之间Ud的?域模块层由实际需求中的业务对象组?比如, OrderLineItem , Product{等?开发者在q层 不用那些DTOsQ仅xdomain object卛_?例如QHibernate允许你将数据库中的信息存攑օ对象Qdomain objectsQ,q样你可以在q接断开的情况下把这些数据显C到UI层?而那些对象也可以q回l持l层Q从而在数据库里更新?而且Q你不必把对象{化成DTOsQ这可能似的它在不同层之间的在传输过E中丢失Q,q个模型使得Java开发者能很自然运用OOQ而不需要附加的~码?
一个简单例?
既然我们已经从全局上理解这些组件?现在p我们开始实践吧?我们q是?StrutsQSpring 和Hibernate。这三个框架已经被描q够多了Q这里就不重复介l了?q篇文章举例指导你如何用这三个框架整合开? q向你揭C?一个请求是如何贯穿于各个层的。(从用L加入一个Order到数据库Q显C;q而更新、删除)?
从这里可以下载到E序E序原代码(downloadQ?
既然每个层是互相作用的,我们先来创建domain objects。首先,我们要在q些Object中要定那些是需要持久化的,哪些是提供给business logicQ那些是昄接口的设计?下一步,我们配|我们的持久层ƈ且定义好Hibernate的OR mappings。然后定义好Business Objects。有了这些组成部分之后,我们?使用Spring把这些连接v来?最后,我们提供lSpring一个持久层Q从q个持久层里我们可以知道它是如何与业务逻辑层(business service layerQ通信的,以及它是怎样处理其他层抛出的异常的。?
域对象层QDomain Object LayerQ?/span>
q层是编码的着手点Q我们的~码׃q层开始?例子中Order 与OrderItem 是一个One—To—Many的关pR?下面是Domain Object Layer的两个对象:
· com.meagle.bo.Order.java: 包含了一个Order的概要信?
· com.meagle.bo.OrderLineItem.java: 包含了Order的详l信?
好好考虑怎你的package命名,q反应出了你是怎样分层的?例如 domain objects在程序中可能打包在com.meagle.bo内?更详l一点将打包在com. meagle.bo的子目录下面。business logic应该从com.meagle.serice开始打包,而DAO 对象应该位于com.meagle.service.dao.hibernate。反应Forms和Actions?持久对象Qpresentation classesQ?应该分别攑֜ com.meagle.action和com.meagle.forms包?准确的给包命名得你的classes很好分割q且易于l护Qƈ且在你添加新的classesӞ能得程序结构上保持上下一致?
持久层的配置QPersistence Layer ConfigurationQ?/span>
建立Hibernate的持久层 需要好几个步骤?W一步让我们把BO持久化?既然Hibernate是通过POJO工作的, 因此Order?OrderLineItem对象需要给所有的fileds 加上getter,setterҎ?Hibernate通过XML文g来映?OR)对象Q以下两个xml文g分别映射了Order 和OrderItem对象。(q里有个叫XDoclet工具可以自动生成你的XML影射文gQ?
- Order.hbm.xml
- OrderLineItem.hbm.xml
你可以在WebContent/WEB-INF/classes/com/meagle/bo目录下找到这些xml文g。Hibernate?[urlhttp://www.hibernate.org/hib_docs/api/net/sf/hibernate/SessionFactory.html]SessionFactory [/url]是用来告诉程?应该与哪个数据库通信Q该使用哪个q接池或使用了DataSourceQ?应该加蝲哪些持久对象。?a class="postlink" target="_blank">Session接口是用来完成SelectingQSavingQDelete和Updatingq些操作?后面的我们将讲述SessionFactory和Session是怎样讄的?
业务层的配置QBusiness Layer ConfigurationQ?/span>
既然我们已经有了domain objectsQ接下来我们pbusiness service objects了,用他们来执行E序的logic,调用持久层,得到UI层的requests,处理transactionsQƈ且控制exceptions?Z这些连接v来ƈ且易于管理,我们用面向方面的 SpringFramework?Spring 提供?控制倒置Qinversion of control 0==IoC)和注依赖设|(setter dependency injectionQ这些方式(可供选择Q,用XML文g对象连接v来?IoC是一个简单概念(它允怸个对象在上层接受其他对象的创建)Q用IoCq种方式让你的对象从创徏中释放了出来Q降低了偶合度?
q里是一个没有用IoC的对象创建的例子Q它有很高偶合度?
?2.没有使用 IoC. A 创徏?B ?C
而这里是一个用IoC的例子,q种方式允许对象在高层可以创建ƈq入另外一个对象,所以这样可以直接被执行?
?3. 对象使用?IoC?A 包含了接受B,C?setterҎ , q同栯C 由A创徏B,C的目的?/span>
建立我们的业务服务对象(Building Our Business Service ObjectsQ?
Business Object中的SetterҎ接受的是接口Q这h们可以很松散的定义对象实玎ͼ然后注入?在我们的案例中,我们用一个business service object接收一个DAO,用它来控制domain objects的持久化?׃在这个例子中使用了HibernateQ我们可以很方便的用其他持久框架实现 同时通知Spring 有新的DAO可以使用了?
在面向接口的~程中,你会明白 “注射依赖”模式是怎样松散耦合你的业务逻辑和持久机制的Q)?
下面是一个接口business service objectQDAO代码片段Q?
代码:
public interface IOrderService {
public abstract Order saveNewOrder(Order order)
throws OrderException,
OrderMinimumAmountException;
public abstract List findOrderByUser(
String user)
throws OrderException;
public abstract Order findOrderById(int id)
throws OrderException;
public abstract void setOrderDAO(
IOrderDAO orderDAO);
}
注意到这D代码里有一?setOrderDaoQ)Q它是一个DAO Object讄ҎQ注器Q?但这里ƈ没有一个getOrderDao的方法,q不必要Q因Zq不会在外部讉Kq个orderDao。这个DAO Objecte被调用Q和我们的persistence layer 通信。我们将用Spring把DAO Object ?business service object搭配h的。因为我们是面向接口~程的,所以ƈ不需要将实现cȝ密的耦合在一赗?
接下L们开始我们的DAO的实现类q行~码?既然Spring已经有对Hibernate的支持,那这个例子就直接l承HibernateDaoSupportcMQ这个类很有用,我们可以参?a class="postlink" target="_blank">HibernateTemplateQ它主要是针对HibernateDaoSupport的一个用法,译注Q具体可以查?a class="postlink" target="_blank">Srping 的APIQ?下面是这个DAO接口代码Q?
代码:
public interface IOrderDAO {
public abstract Order findOrderById(
final int id);
public abstract List findOrdersPlaceByUser(
final String placedBy);
public abstract Order saveOrder(
final Order order);
}
我们仍然要给我们持久层组装很多关联的对象Q这里包含了HibernateSessionFactory 和TransactionManager?Spring 提供了一?HibernateTransactionManagerQ他用线E捆l了一个Hibernate SessionQ用它来支持transactions(h?a class="postlink" target="_blank">ThreadLocal) ?
下面是HibernateSessionFactory ?HibernateTransactionManager:的配|:
代码:
<bean id="mySessionFactory"
class="org.springframework.orm.hibernate.
LocalSessionFactoryBean">
<property name="mappingResources">
<list>
<value>
com/meagle/bo/Order.hbm.xml
</value>
<value>
com/meagle/bo/OrderLineItem.hbm.xml
</value>
</list>
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">
net.sf.hibernate.dialect.MySQLDialect
</prop>
<prop key="hibernate.show_sql">
false
</prop>
<prop key="hibernate.proxool.xml">
C:/MyWebApps/.../WEB-INF/proxool.xml
</prop>
<prop key="hibernate.proxool.pool_alias">
spring
</prop>
</props>
</property>
</bean>
<!-- Transaction manager for a single Hibernate
SessionFactory (alternative to JTA) -->
<bean id="myTransactionManager"
class="org.
springframework.
orm.
hibernate.
HibernateTransactionManager">
<property name="sessionFactory">
<ref local="mySessionFactory"/>
</property>
</bean>
可以看出Q每个对象都可以在Spring 配置信息中用<bean>标签引用。在q里QmySessionFactory引用了HibernateSessionFactoryQ而myTransactionManager引用了HibernateTransactionManage?注意代码中myTransactionManger Bean有个sessionFactory属性?HibernateTransactionManager有个sessionFactory setter ?getterҎQ这是用来在Spring启动的时候实?#8220;依赖注入” Qdependency injectionQ的?在sessionFactory 属性里 引用mySessionFactory。这两个对象在Spring容器初始化后pl装了v来了?q样的搭配让你从 单例Qsingleton objectsQ和工厂QfactoriesQ中解放了出来,降低了代码的l护代h?mySessionFactory.的两个属性,分别是用来注入mappingResources ?hibernatePropertes的。通常Q如果你在Spring之外使用Hibernate,q样的设|应该放在hibernate.cfg.xml中的?不管怎样,Spring提供了一个便L方式-----在Spring内部配置中ƈ入了Hibernate的配|?如果要得到更多的信息Q可以查阅Spring API?
既然我们已经l装配置好了Service BeansQ就需要把Business Service Object?DAO也组装v来,q把q些对象配到一个事务管理器Qtransaction managerQ里?
在Spring中的配置信息Q?
代码:
<!-- ORDER SERVICE -->
<bean id="orderService"
class="org.
springframework.
transaction.
interceptor.
TransactionProxyFactoryBean">
<property name="transactionManager">
<ref local="myTransactionManager"/>
</property>
<property name="target">
<ref local="orderTarget"/>
</property>
<property name="transactionAttributes">
<props>
<prop key="find*">
PROPAGATION_REQUIRED,readOnly,-OrderException
</prop>
<prop key="save*">
PROPAGATION_REQUIRED,-OrderException
</prop>
</props>
</property>
</bean>
<!-- ORDER TARGET PRIMARY BUSINESS OBJECT:
Hibernate implementation -->
<bean id="orderTarget"
class="com.
meagle.
service.
spring.
OrderServiceSpringImpl">
<property name="orderDAO">
<ref local="orderDAO"/>
</property>
</bean>
<!-- ORDER DAO OBJECT -->
<bean id="orderDAO"
class="com.
meagle.
service.
dao.
hibernate.
OrderHibernateDAO">
<property name="sessionFactory">
<ref local="mySessionFactory"/>
</property>
</bean>
? 是我们对象搭建的一个提UӀ?从中可以看出Q每个对象都联系着SpringQƈ且能通过Spring注入到其他对象。把它与Spring的配|文件比较,观察他们之间的关p?
?4. Spring是q样Z配置文gQ将各个Bean搭徏在一赗?/span>
q个例子使用一个TransactionProxyFactoryBeanQ它定义了一个setTransactionManager()?q对象很有用Q他能很方便的处理你x的事物还有Service Object?你可以通过transactionAttributes属性来定义怎样处理?想知道更多还是参考TransactionAttributeEditor吧?
TransactionProxyFactoryBean q有个setter. q会被我?Business service objectQorderTargetQ引用, orderTarget定义?业务服务层,q且它还有个属性,由setOrderDAO()引用。这个属?
Spring 和Bean 的还有一点要注意的: bean可以以用两种方式创造?q些都在单例模式QSingtonQ和原型模式QpropotypeQ中定义了?默认的方式是singleton,q意味着׃n的实例将被束~?而原形模式是在Spring用到bean的时候允许新建实例的。当每个用户需要得C们自己Bean的CopyӞ你应该仅使用prototype模式。(更多的请参考设计模式中的单例模式和原Ş模式Q?
提供一个服务定位器QProviding a Service LocatorQ?/span>
既然我们已经我们的Serices和DAO搭配h了。我们需要把我们的Service昄到其他层?q个通常是在Struts或者Swingq层里编码。一个简单方法就是用 服务定位器返回给Spring context 。当Ӟ可以通过直接调用Spring中的Bean来做?
下面是一个Struts Actin 中的服务定位器的一个例子?
代码:
public abstract class BaseAction extends Action {
private IOrderService orderService;
public void setServlet(ActionServlet
actionServlet) {
super.setServlet(actionServlet);
ServletContext servletContext =
actionServlet.getServletContext();
WebApplicationContext wac =
WebApplicationContextUtils.
getRequiredWebApplicationContext(
servletContext);
this.orderService = (IOrderService)
wac.getBean("orderService");
}
protected IOrderService getOrderService() {
return orderService;
}
}
UI 层配|?QUI Layer ConfigurationQ?/span>
q个例子里UI?使用了Struts framework. q里我们要讲qC下在l程序分层的时候, 哪些是和Struts部分的。我们就从一个Struts-config.xml文g中的Action的配|信息开始吧?
代码:
struts-config.xml file.
<action path="/SaveNewOrder"
type="com.meagle.action.SaveOrderAction"
name="OrderForm"
scope="request"
validate="true"
input="/NewOrder.jsp">
<display-name>Save New Order</display-name>
<exception key="error.order.save"
path="/NewOrder.jsp"
scope="request"
type="com.meagle.exception.OrderException"/>
<exception key="error.order.not.enough.money"
path="/NewOrder.jsp"
scope="request"
type="com.
meagle.
exception.
OrderMinimumAmountException"/>
<forward name="success" path="/ViewOrder.jsp"/>
<forward name="failure" path="/NewOrder.jsp"/>
</action>
SaveNewOrder q个Action是用来持久化UI层里的表单提交过来Order的。这是Struts中一个很典型的Action; 注意观察q个Action中exception配置Q这些Exceptions也在Spring 配置文g(applicationContext-hibernate.xml)中配|了Q就?business service object 的transactionAttributes属性里Q?当异常在业务层被被抛出时Q我们可以控制他们,q当的显C给UI层?
W一个异常,OrderException,在持久层保存order对象p|的时候被触发。这导致事物回滚ƈ且通过BO把异常回传到Strutsq一层?
W二个异常,OrderMinimumAmountException也同W一个一栗?
搭配整和的最后一?通过是让你显C层和业务层相结合。这个已l被服务定位器(service locatorQ实CQ前面讨了)Q?q里服务层作Z个接口提供给我们的业务逻辑和持久层?
SaveNewOrder Action 在Struts中用一个服务定位器Qservice locatorQ来调用执行业务Ҏ的?Ҏ代码如下Q?
代码:
public ActionForward execute(
ActionMapping mapping,
ActionForm form,
javax.servlet.http.HttpServletRequest request,
javax.servlet.http.HttpServletResponse response)
throws java.lang.Exception {
OrderForm oForm = (OrderForm) form;
// Use the form to build an Order object that
// can be saved in the persistence layer.
// See the full source code in the sample app.
// Obtain the wired business service object
// from the service locator configuration
// in BaseAction.
// Delegate the save to the service layer and
// further upstream to save the Order object.
getOrderService().saveNewOrder(order);
oForm.setOrder(order);
ActionMessages messages = new ActionMessages();
messages.add(
ActionMessages.GLOBAL_MESSAGE,
new ActionMessage(
"message.order.saved.successfully"));
saveMessages(request, messages);
return mapping.findForward("success");
}
ȝ
q篇文章在技术和构架斚w掩盖了很多低层的基础信息Q?文章的主要的意图在于让你意识到如何给你应用程序分层?分层可以“解?#8221;你的代码——允许新的组件被dq来Q而且让你的代码易于维护?q里用到的技术只是专注于?#8220;解偶”做好?不管怎样Q用这L构架可以让你用其他技术代替现在的层?例如Q你可能不用Hibernate实现持久化。既然你在DAO中面向接口的~程的,所以你完全可以用iBATIS来代ѝ或者,你也可能想用Struts外的其他的技术或者框架替换现在的UI层(转换久层Q实现层q不应该直接影响C的业务逻辑和业务服务层Q?用适当的框架搭Z的Web应用Q其实也不是一件烦琐的工作Q更主要的是?#8220;解?#8221;了你E序中的各个层?
后记Q?
看完q篇文章后,只是觉得很喜Ƣ,于是q译了Q当然同时也准备着挨大家扔来的鸡蛋Q)?
q篇文章里ƈ没有太多的技术细节,和详l的步骤。如果你从未使用q这些框架而在q行实例E序遇上困难的话Q可以到CSDN论坛Java Open Source版发_我一定会详细解答的(啊哦Q这不算做广告吧Q)Q?
文章是从一个构架的角度讲述了如何搭配现有的开源框架进行分层, 有太多的术语我都不知道怎么表达Q而且可能有很多语句存在错误。如果媄响了你的阅读Q请你直接点原文地址Q我同时也象你说声抱歉?
作者简介:Mark Eagle 高软g工程师,亚特兰大?
?译:Totodo,软g工程?
]]>
]]>
开发前准备工作Q?/span>
1、下?/span>eclipse3.1版本
下蝲地址Q?/span>
2、下?/span>Myeclipse插g
下蝲地址Q?/span>
3、根据需要下载所需要的数据库驱动?/span>
部分下蝲地址Q?/span>
4、下载的eclipse3.1q行解压~。安?/span>MyeclipseQ分为手工安装和自动安装两种安装Ҏ?/span>
具体安装Ҏ如下Q?/span>
手工安装Q?/span>
自动安装Q?/span>
5、安装完成后。启?/span>Myeclipse?/span>
准备开发工作:
步骤Q?/span>
1、新建项目:
New>projects后进入下?/span>
本文主要介绍开?/span>Web Project目Q因此需要选择Web ProjectQ下一步,q入下图Q?/span>
Project NameQؓ需要徏立的目名称。填写好目名称后,Finish。新建项目完成。本文在目命名?/span>test.?/span>
目建立完成之后Q在Myeclipse视图中,Package Explorer中显C如下:
testQؓ目名称?/span>
SrcQؓ源文件所放\径?/span>
WebRootQؓWeb root folder
2、加?/span>Struts
在所建立目test上右键后Q提C如下页面:
在弹出的菜单中,Ҏ图例提示Q选择Myeclipse后在弹出的二U菜单中选择Add Struts Capabilities…后提C如下图所C:
在弹出的对话框中Q设|如下:
Struts config pathQ默认,一般不需要改变?/span>
Struts specificationQ选择Struts版本Q在此项目中Q选择Struts 1.2版本?/span>
Base Package for new classesQ设|ؓI?/span>
取消Install Struts TLDs选项?/span>
其他默认Q?/span>
Finish.后在Package Explorer?/span>Lib包如下:
到此Q加?/span>Struts完成。在此需要关?/span>Struts-config.xml文g?/span>
3、加?/span>hibernate:
同加?/span>struts方式cMQ选择Myeclipse后在弹出的二U菜单中选择Add Hibernate Capabilities…后提C如下图所C:
可以Ҏ提示Q选择Hibernate SpecificationQ本目选择Hibernate3Q其他默认,Next>
默认后直接下一步。在此可以去?/span>Configuration File Name中的内容?/span>Next>
后去掉下一U页面的Create SessionFactory class选项。然?/span>FinishQ?/span>Finish完成后,?/span>Lib目录下会提示相关?/span>jar包?/span>
4、加?/span>spring in action in action
同加?/span>struts方式cMQ选择Myeclipse后在弹出的二U菜单中选择Add spring in action in action Capabilities…后提C如下图所C:
选择所需要的spring in action in action包,然后默认下一步,直到完成?/span>
到此Q?/span>Struts+hibernate+spring配置完成?/span>
附加Q在目名称的右键后q入Properties然后q入Java Build Path后查看加载的jar包?/span>
具体目的开发详l文档请见下一文章?/span>struts+hibernate+spring目开发示例?/span>
q个库必不可,因ؓ它结合了Ҏ通JSP的大量核心改q。它的一些特性包括:XML操作库、SQL库、特D国际化功能、以及对q代器和其它E序控制机制的支持。在需要高U流E控制结构、国际化功能或XML支持时用这个库?
DateTime
q个库提供各U操作日期和旉的工P包括恢复当前日期和时间、生成日期和月䆾列表、格式化日期和时间、时{换。用这个库可以方便地把日期和时间操作程序加入到你的应用E序中?
Mailer
q个库通过一个用户定义的SMTP服务器支持邮件发送,Z的JSP应用E序增加电子邮g发送功能。它q支持多位收件h、定制标题、MIME附g和错误处理。当需要在JSP面中创建和发送电子邮件消息时使用q个库?
Cache
q个库ؓ一个网站提供一个简单的~冲框架。它缓冲页面{译给客户端,允许你缓冲部分页面,~短响应旉。如果你的网站接收许多流量,使用q个库不时ؓ客户端提供页面缓冲快照而非“实况”面Q从而减L务器负蝲和页面处理时间?
XTages
q个库提供程序简化用XSLT解析和{换XML文档的过E。它可用于将一个XSLT转换应用于XML文档中、增加或删除XML节点、评估Xpath表达式和定义模板规则。当你需要高UXML/XSLT处理功能使用q个库?
Regexp
q个库允怽在JSP应用E序中用与Perl5兼容的常规表辑ּ。这个库支持Perl的匹?m)、替?s)和分解操作符。当你需要模式匹配和替代的常规表辑ּ支持时用这个库?
JSP Controls
q个库允怽建立单个面lgQ如d表格或进度条Q它们可以进行单独更新。这个库对AJAX应用E序特别有用Q虽然它也可用在非AJAX模式中。在建立AJAXcd的JSP应用E序时用这个库?
Pagers
q个库ؓ数据集实施一个分늳l,化在大型数据集(如数据库搜烦l果Q中来回Ud的操作过E。它q包括各U分|式,支持可浏览的l果目录。当你的应用E序需要一个粗劣的分页pȝ时用这个库?
JDBForms
q个库可以在数据库连接和表单元素之间建立链接Q徏立定制行动迅速简化数据库驱动的Web应用E序的开发。它q支持分cR搜索、过滤和样式功能Qƈ使用一个基于SWING的界面。要q速开发数据库支持的JSP应用E序时用这个库?
Google Tag Library
q个库可以执行和处理Google搜烦Q检查拼写ƈ且访问Google.com~存中的面。用这个库l你的网站增加Google搜烦功能Q或创徏一个用Google.com数据库的搜烦引擎?/p>