??xml version="1.0" encoding="utf-8" standalone="yes"?> public class FileLogger implements Logger { public void log(String msg) { a NoQ即不启用自动装配?/span>Autowire默认的倹{?br />
b byNameQ通过属性的名字的方式查?/span>JavaBean依赖的对象ƈ为其注入?br />
c byTypeQ通过属性的cd查找JavaBean依赖的对象ƈ为其注入?br />
d constructorQ?/span>byType一P也是通过cd查找依赖对象?br />
e autodetectQ在byType?/span>constructor之间自动的选择注入方式?br />
f defaultQ由上标签<beans>?/span>default-autowire属性确定?br />
?lt;beans default-autowire="byName">可以为本xml文g讄默认的自动装配的cd例如byNameQ当然在讄具体?lt;bean id="***" class="***" autowire="byType">Ӟ会自动改变默认的byName为byType?br />
2。在web.xml中通过配置如下参数
BufferedReader br = new BufferedReader(fr);
q其实就是一个decorator模式。因为针对File的读取方式有很多Q如果每U都要采用承的ҎQ那么会产生很多的子c,那样昄是很烦的?br />
装饰器也UCؓҎ工模式。它的目的就是给一个对象动态地d一些功能。就像是l对象刷了一层漆Qɘq个对象更加丰富Q而不是通过l承来增加功能。而这些功能的d是动态的q行期的Q当然这里的动态ƈ不是像aop中的引介introductorQ大家不要淆?br />
在我们的目中,l常会遇到日志的情况。大凡我们会定义一个log接口像下面?br />
public interface Logger {
public void log(String msg);
}
一般我们会把日志保存中文g中,所以有了一个FileLogger
//开始记录日志到文g?br />
}
}
此时如果在项目有些地斚w要对日志q行加密Q有些地方又不需要加密,或者有些地方生成的文g是以xml的方式。此时如果采用承的ҎQ也能实玎ͼ但是从面向对象的角度来说Qƈ不徏议对象的层次太深Q增加系l的复杂性,q样对于pȝ的扩展和l护都不是很方便。此时Decorator模式可以帮我们解决q些问题Q我们可以ؓq个一般的FileLogger对象上刷一层不同的漆,那么q些漆,从上面增加的功能角度来说Q就是加了一?#8220;加密”的漆Q或加了一?#8220;生成xml”的漆?br />
先定义一个Decorator接口Q此接口也实CLogger接口
public class LoggerDecorator implements Logger{
Logger logger;
public LoggerDecorator(Logger logger){
this.logger=logger;
}
//开始记录日?br />
public void log(String msg){
//此处便是l实CLogger接口的,被刷了a漆的(增加了功能的例如加密{?对象记录日志
logger.log(msg);
}
}
public class EncryptDecorator extends LoggerDecorator{
public EncryptDecorator(Logger logger){
super(logger);
}
public void log(String msg){
//刷加密字W串的a?br />
msg=this.encryptMsg(msg);
//记录加密后的日志
logger.log(msg);
}
}
//客户端的调用
public DecoratorClient{
public static void main(String args[]){
Logger logger=new FileLogger();
Logger decorator=new EncryptDecorator(logger);
decorator.log("加密的字W串");
}
}
q样基本把Decorator模式的应用v来,当然在项目中我们可能q需要更丰富一下我们的c,此处仅用q样的简单示例来讲述?/p>
]]>
下面介绍集合框架中的几个常用的接口:
1.Collection 允许处理一l对象,位于集合层次l构的顶?br />
2.List 扩展Collection接口以处理序?br />
3.Queue 扩展Collection接口以处理列表中的特D类型,其元素只能从前面删除
4.Set 扩展Collection接口以处理集合,集合中的元素必须是唯一?br />
5.SortedSet 扩展Set接口以处理排序的集合
当然除了上述的接口外Q集合中q用Copmarator、Iterator、ListIterator{接??br />
Collection接口是构造集合框架的基础Q必被定义集合的Q意类实现Q同样它也是一个泛型接口?br />
List接口Q?br />
该接口扩展了Collection接口Q它声明集合是存储一个序列的元素。我们可以把它看成是动态数l。学q数据结构的朋友都知道,数组可以使用Z0的烦引,对于泛型的List接口而言Q他可以指定保存不同的对象类型?br />
Ҏ摘要
boolean
add(E o)
保?collection 包含指定的元素(可选操作)?/td>
boolean
addAll(Collection<? extends E> c)
指?collection 中的所有元素都d到此 collection 中(可选操作)?/td>
void
clear()
U除?collection 中的所有元素(可选操作)?/td>
boolean
contains(Object o)
如果?collection 包含指定的元素,则返?true?/td>
boolean
containsAll(Collection<?> c)
如果?collection 包含指定 collection 中的所有元素,则返?true?/td>
boolean
equals(Object o)
比较?collection 与指定对象是否相{?/td>
int
hashCode()
q回?collection 的哈希码倹{?/td>
boolean
isEmpty()
如果?collection 不包含元素,则返?true?/td>
Iterator<E>
iterator()
q回在此 collection 的元素上q行q代的P代器?/td>
boolean
remove(Object o)
从此 collection 中移除指定元素的单个实例Q如果存在的话(可选操作)?/td>
boolean
removeAll(Collection<?> c)
U除?collection 中那些也包含在指?collection 中的所有元素(可选操作)?/td>
boolean
retainAll(Collection<?> c)
仅保留此 collection 中那些也包含在指?collection 的元素(可选操作)?/td>
int
size()
q回?collection 中的元素数?/td>
Object[]
toArray()
q回包含?collection 中所有元素的数组?/td>
<T> T[]
toArray(T[] a)
q回包含?collection 中所有元素的数组Q返回数l的q行时类型与指定数组的运行时cd相同?/td>
相对于Collection接口而言QList接口增加了add(int index, E element),add(int index,Collection c)ҎQ这些方法用于将元素插入到特定的位置Q这也是动态数l的Ҏ?br />
Set接口Q?br />
该接口扩展了Collection接口Q但不允许有相同的存在的元素Q而上q的List接口却没有此U束Q其实很好理解,我们可以把它惌成数学中的集合,在U集合中Q是不允许有相同的元素的?br />
SortedSet接口扩展了Set接口Q此接口是升序的集合Q由于是有序的,所有自然其中的数据元素是有意义的,否则升序的算法无从用v。自然就不能存在为null的对象。下表是该接口特有的ҎQ?br />
Ҏ摘要
boolean
add(E o)
向列表的Nq加指定的元素(可选操作)?/td>
void
add(int index, E element)
在列表的指定位置插入指定元素Q可选操作)?/td>
boolean
addAll(Collection<? extends E> c)
q加指定 collection 中的所有元素到此列表的l尾Q顺序是指定 collection 的P代器q回q些元素的顺序(可选操作)?/td>
boolean
addAll(int index, Collection<? extends E> c)
指?collection 中的所有元素都插入到列表中的指定位|(可选操作)?/td>
void
clear()
从列表中U除所有元素(可选操作)?/td>
boolean
contains(Object o)
如果列表包含指定的元素,则返?true?/td>
boolean
containsAll(Collection<?> c)
如果列表包含指定 collection 的所有元素,则返?true?/td>
boolean
equals(Object o)
比较指定的对象与列表是否相等?/td>
E
get(int index)
q回列表中指定位|的元素?/td>
int
hashCode()
q回列表的哈希码倹{?/td>
int
indexOf(Object o)
q回列表中首ơ出现指定元素的索引Q如果列表不包含此元素,则返?-1?/td>
boolean
isEmpty()
如果列表不包含元素,则返?true?/td>
Iterator<E>
iterator()
q回以正顺序在列表的元素上q行q代的P代器?/td>
int
lastIndexOf(Object o)
q回列表中最后出现指定元素的索引Q如果列表不包含此元素,则返?-1?/td>
ListIterator<E>
listIterator()
q回列表中元素的列表q代器(以正的序Q?/td>
ListIterator<E>
listIterator(int index)
q回列表中元素的列表q代器(以正的序Q,从列表的指定位置开始?/td>
E
remove(int index)
U除列表中指定位|的元素Q可选操作)?/td>
boolean
remove(Object o)
U除列表中出现的首个指定元素Q可选操作)?/td>
boolean
removeAll(Collection<?> c)
从列表中U除指定 collection 中包含的所有元素(可选操作)?/td>
boolean
retainAll(Collection<?> c)
仅在列表中保留指?collection 中所包含的元素(可选操作)?/td>
E
set(int index, E element)
用指定元素替换列表中指定位置的元素(可选操作)?/td>
int
size()
q回列表中的元素数?/td>
List<E>
subList(int fromIndex, int toIndex)
q回列表中指定的 fromIndexQ包?Q和 toIndexQ不包括Q之间的部分视图?/td>
Object[]
toArray()
q回以正顺序包含列表中的所有元素的数组?/td>
<T> T[]
toArray(T[] a)
q回以正顺序包含列表中所有元素的数组Q返回数l的q行时类型是指定数组的运行时cd?/td>
Queue接口Q?br />
q个接口?.4的版本中是没有,新增的。看名字q道是队列Q先q先出?br />
Ҏ摘要
Comparator<? super E>
comparator()
q回与此有序集合兌的比较器Q如果用元素的自然序Q则q回 null?/td>
E
first()
q回此有序集合中当前W一个(最的Q元素?/td>
SortedSet<E>
headSet(E toElement)
q回此有序集合的部分视图Q其元素严格于 toElement?/td>
E
last()
q回此有序集合中最后一个(最大的Q元素?/td>
SortedSet<E>
subSet(E fromElement, E toElement)
q回此有序集合的部分视图Q元素范围从 fromElementQ包括)?toElementQ不包括Q?/td>
SortedSet<E>
tailSet(E fromElement)
q回此有序集合的部分视图Q其元素大于或等?fromElement?/td>
从队列顶部删除元??
Ҏ摘要
E
element()
索,但是不移除此队列的头?/td>
boolean
offer(E o)
如果可能Q将指定的元素插入此队列?/td>
E
peek()
索,但是不移除此队列的头Q如果此队列为空Q则q回 null?/td>
E
poll()
索ƈU除此队列的_如果此队列ؓI,则返?null?/td>
E
remove()
索ƈU除此队列的头?/td>
]]>
]]>
1。减配|文仉配置信息的数?br />
配置applicationContext.xml或者分布在其它的xml文g中的beanӞ讄bean与bean之间的相互依赖关pL一件痛苦且Ҏ出错的事。autowire属性的出现减轻了配|文件的定w?br />
<bean>的autowire属性有6个倹{分别ؓQ?br />
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath*:spring/*.xml</param-value>
</context-param>
会自动把WEB-INF/classes/sring目录下的所有以.xmll尾的文件加载spring容器q行理Q而不必手动编写每个applicationContex.xml,accessContext.xml{配|文件?br />
3。利用属性ؓmappingDirectoryLocation来配|相关的目录位置Q从而避免ؓ该目录下的所有文件名q行配置
<property name="mappingDirectoryLocation">
<list>
<value>classpath:/package1/<value>
</list>
</property>
如:
<!-- 讄Hibernate3的SessionFactory -->
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="dataSource">
<ref bean="dataSource"/>
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">net.sf.hibernate.dialect.SQLServerDialect</prop>
<prop key="hibernate.show_sql">true</prop>
<prop key="hibernate.generate_statistics">true</prop>
<prop key="hibernate.connection.release_mode">auto</prop>
<prop key="hibernate.autoReconnect">true</prop>
</props>
</property>
<property name="mappingDirectoryLocations">
<list>
<value>classpath:com/apache/model</value>
</list>
</property>
</bean>
4。消除ProxyFactoryBean的繁重配|?br />
a.通过l承于parent ProxyFactoryBean
b.使用aop自动代理的方?br />
在Spring中进行事务的理均是Zaop的方式,为每个需要事务管理的bean均设定相应的ProxyFactoryBean又是一仉常繁重的工作。用自动代理可以消除这L重复的工作。方法如下,声明DefaultAdvisorAutoProxyCreator为所有的advisor作ؓ代理Q在context上下文中查找所有的advisorQ然后自动代理那些被在pointcut加入了切面的bean。针对事务用spring中的事务的advisor,TransactionAttributeSourceAdvisor?br />
该advisor有两U方式进行注入,一U是setter方式Q如下:
<!-- 配置自动代理事务 -->
<bean id="transactionAdvisor" class="org.springframework.transaction.interceptor.TransactionAttributeSourceAdvisor">
<property name="transactionInterceptor" ref="transactionInterceptor"/>
</bean>
另一U是constructor方式Q如下:
<!-- 配置自动代理事务 -->
<bean id="transactionAdvisor" class="org.springframework.transaction.interceptor.TransactionAttributeSourceAdvisor">
<constructor-arg>
<ref bean="transactionInterceptor"/>
</constructor-arg>
</bean>
以constructor方式q行注入?br />
]]>
以上是简易的pȝ逻辑l构Q?/span>***Actionl承?/span>xwork?/span>SupportActionQ通过Spring来进行管理,在整?/span>Spring的容器中Q?/span>Spring负责理整个pȝ的所?/span>BeanQƈ负责初始?/span>Bean之间的依赖关pR?/span>***Action中注入了服务层对?/span>***ServiceImpl,?/span>ServiceImpl又注入了***DaoImpl对象。下面会逐步l化上面的关pd?/span>
先看下面的web.xml配置
web.xml
<display-name>Struts Blank</display-name>
<context-param>
<param-name>webAppRootKey</param-name>
<param-value>wxy.root</param-value>
</context-param>
<!-- spring xml文g配置目录?/span>class目录下的spring目录?/span>WEB-INF/classes/spring -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath*:spring/*.xml</param-value>
</context-param>
<!-- 配置log4j的日志信?/span>WEB-INF/classes/config/log4j.properties -->
<context-param>
<param-name>log4jConfigLocation</param-name>
<param-value>classpath*:config/log4j.properties</param-value>
</context-param>
<!-- 配置Character Encoding Filter -->
<filter>
<filter-name>encodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<!-- 配置Struts2 -->
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>
</filter>
<filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
</welcome-file-list>
<!-- 载入Spring ApplicationContext -->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!-- Spring hIntrospector防止内存泄漏 -->
<listener>
<listener-class>org.springframework.web.util.IntrospectorCleanupListener</listener-class>
</listener>
未完待箋.
q里所说的Portal是指JCP-JSR168规范所描述的:Portal是一个基于Web的应用,通常它提供个性化、单点登录、内定w成和昄{功能。Portal技术包括三个方面:
1Q?nbsp; Portal服务?Portal Server)Q?/p>
2Q?nbsp; Portlet容器Q?Portlet Container)
3Q?nbsp; Portlet?/p>
1) Portal Server 的定义是
一?PortalQ门L站)是指一?Web-based 的系l,通常都会提供个h化设|、单一登陆、以及由各种不同来源或不同网站取得各式各L信息Qƈ且将q些信息攑֜|页之中l合而成的呈现^収ͼ门户|站会有_y的个人化讄L供定制的|页Q当不同{的用者来览该页面将获得不同的信息内宏V?
负责接收HTTPhQ调用portletQƈportlet产生的内容聚集到portal pageq回l客戗?/p>
2) Portlet Container 的定义是
portlet container 是提?portlets 执行的环境,包含了许?portlets q且理他们的生命周期,他也会永q保存着 portlets 的喜好设|,一?portlet container 接收到来?portal 的请求后Q接着这个请求传递给存在 container ?portlet 执行。portlet container 没有义务ȝ?portlets 产生的信息內容,q个工作必须?portal 来处理。portal ?portlet container 可以攑֜一赯为同一个系l的lgQ或者分开成ؓ两个独立的组件?
负责提供portlet的运行时环境Q管理portlet的生命周期,q负责提供portlet持久化能力?/p>
3) Portlet 的定义是
一?Portlet 是以 Java 技术ؓ技术的 Web lgQ由 Portlet Container 所理Q专门处理客L request 以及产生各种动态的信息内容。Portlets 为可插式 ( pluggable ) 的客L面组Ӟ提供呈现层成Z个信息系l。这些由 portlet 产生的内容也被称为片D?(fragment)Q而片D|h一些规则的Markup( HTML、XHTML、WML )Q而且可以和其他的片段l合而成一个复杂的文g。?Portlet 中的内容正常来说是与其他 Portlet 的内容聚合而成Z?Portal |页。?Portlet 的生命周期是?Portlet Container 所理控制的。客L?portlets 的互动是?portal 通过典型?request/response 方式实现Q正常来_客户会和 portlets 所产生的内容互动,举例来说Q根据下一步的q接或者是认送出的表单,l果 portal 会接收?portlet 的动作,这个处理状况{向到目标 portlet。这?portlet 内容的生可能会因ؓ不同的用者而有不同的变化,完全是根据客户对于这?portlet 的设|?/p>
Portal主要是解决企业信息和应用的前端集成问题,它负责连l企业后台EAIQ集成企业的l构和非l构化信息,q提供统一的访问企业信息和应用的入口?/p>
(摘自JSR168规范文)
portlet ?servlet 的关p?br /> Portlet ?Servlet 是兄弟有那么一点点怼却又有那么一点点不同Q因?Servlet ?Portlet 不尽然相同,所以研I小i決定将 portlets 定义成ؓ一个新的组Ӟ因此定义?portlets 一个新的ƈ且明的界面与行为。ؓ了尽可能与现有的 servlet l合辑ֈ重复使用的目的,portlet 的规范利用了 servlet 的规范,许多观念都很怼的,l合 portlets、servlets ?jsp 在同一个网站系l中Q我们称?portlet application 。在同一?portlet application 中,他们分享同一?classloaderQcontext ?session?
1) Portlet ?Servlet 的相g?/p>
@ portlets 也是 Java 技术的 web lg
@ portlets 也是有特定的 container 在管?br />
@ portlets 可以动态生各U内?br />
@ portlets 的生命周期由 container 所理
@ portlets 和客L的互动是通过 request/response 的机?
2) Portlet ?Servlet 也有一些不?/p>
@ portlets 只?markup 信息片段Q不是完整的|页文g。?Portal 会将所有的 Portlet markup 信息?D|C个完整的 Portal |页?br />
@ portlets 不会?URL 有直接的关系
@ 客户端必通过 portal pȝ才能?portlets 互动
@ portlets 有一些定义好?request 处理Qaction request 以及 render request?br />
@ portlets 默认定义 portlet modes 及窗口状态可以指出在|页中该 portlet 的哪个功能正在执行及现在?状态?br />
@ portlets 可以在同一?portal |页之中存在多个?
3) Portlet 有一些附加的功能?Servlet 所没有?/p>
@ Portlets 能够存取及储存永久配|文件及定制资料?br /> @ portlets 可以存取使用者数?br /> @ portlets h URL 的重写功能在文g中去动态徏立连l,允许 portal server 不用ȝ道如何在|页的片 D之中徏立连l及动作?br /> @ portlets 可以储存临时性的数据?portlet session 之中Q拥有两个不同的范围Q?br /> application-wide scope ?portlet private scope ?
4) Portlet 不具有一些功能, 但是 Servlet 却有提供
@ servlet h讄輸出的文字编? character set encoding)方式
@ servlet 可以讄 HTTP 输出?header
@ servlet 才能夠接收客户对?portal 发出?URL h
ZPortal开发项目的优势
1、可以与以后新开发的或已集成到Portal中的企业应用实现无缝集成?/p>
2、可以分享Portal服务器和Portlet容器提供的种U功能。这要视Portal服务器提供商而定?/p>
3、由于Portlet已规范化QJSR168Q,所以应用中开发的Portlet可以部v在不同的Portal服务器上?br />