??xml version="1.0" encoding="utf-8" standalone="yes"?>91美女片黄在线观看,精品视频在线观看网站,国产私拍精品 http://www.aygfsteel.com/shmily432685/category/4001.htmlzh-cn Mon, 08 Oct 2007 04:10:08 GMT Mon, 08 Oct 2007 04:10:08 GMT 60 使用Spring邮g抽象层发送简单邮?通过自己~写Q更新后发布)1 http://www.aygfsteel.com/shmily432685/archive/2005/12/30/26041.html闉| 闉| Fri, 30 Dec 2005 04:49:00 GMT http://www.aygfsteel.com/shmily432685/archive/2005/12/30/26041.html http://www.aygfsteel.com/shmily432685/comments/26041.html http://www.aygfsteel.com/shmily432685/archive/2005/12/30/26041.html#Feedback 1 http://www.aygfsteel.com/shmily432685/comments/commentRss/26041.html http://www.aygfsteel.com/shmily432685/services/trackbacks/26041.html 1、我们定义一个发送邮件的接口:OrderManager.java 1 public interface OrderManager extends BaseManager{ 2 /** 3 *email,要发送的邮g地址; 4 *Code:Ȁzȝ 5 */ 6 public void placeOrder(String email); 7 }
2、我们需要对该接口进行实现的Ҏ:OrderManagerImpl.java
1 import javax.mail.Message; 2 import javax.mail.MessagingException; 3 import javax.mail.internet.InternetAddress; 4 import javax.mail.internet.MimeMessage; 5 import org.springframework.mail.MailException; 6 import org.springframework.mail.javamail.JavaMailSender; 7 import org.springframework.mail.javamail.MimeMessagePreparator; 8 import service.OrderManager; 9 11 public class OrderManagerImpl extends BaseManagerImpl implements OrderManager { 12 13 private JavaMailSender mailsender; 14 private MyMailMessage message; 15 16 17 public void setMessage(CityMailMessage message) 18 { 19 this .message = message; 20 } 21 public void setMailsender(JavaMailSender mailsender) { 22 this .mailsender = mailsender; 23 } 24 public void placeOrder( final String email ) { 25 26 27 MimeMessagePreparator preparator = new MimeMessagePreparator() { 28 public void prepare(MimeMessage mimeMessage) throws MessagingException { 29 mimeMessage.setRecipient(Message.RecipientType.TO, 30 new InternetAddress(email)); 31 mimeMessage.setFrom( new InternetAddress(message.getFrom())); 32 /**转换~码为GBK*/ 33 mimeMessage.setSubject(message.getSubject(), " GBK " ); 36 mimeMessage.setText(email + " <br> " + message.getSubject() +message.getText() , " GBK " ); 37 38 } 39 }; 40 try { 41 mailsender.send(preparator); 42 } 43 catch (MailException ex) { 44 // log it and go on 45 System.err.println(ex.getMessage()); 46 } 47 } 48 }
3、spring配置发送email的applicationContext-email.xml
1 <? xml version = " 1.0 " encoding = " UTF-8 " ?> 2 <! DOCTYPE beans PUBLIC " -//SPRING//DTD BEAN//EN " 3 " http://www.springframework.org/dtd/spring-beans.dtd " > 4 5 < beans > 6 < bean id = " mailSender " class = " org.springframework.mail.javamail.JavaMailSenderImpl " > 7 < property name = " host " > 8 < value > smtp. 163 .com </ value > 9 </ property > 10 < property name = " username " > 11 < value > username </ value > 12 </ property > 13 < property name = " password " > 14 < value > password </ value > 15 </ property > 16 < property name = " javaMailProperties " > 17 < props > 18 < prop key = " mail.smtp.auth " > true </ prop > 19 < prop key = " mail.smtp.timeout " > 25000 </ prop > 20 </ props > 21 </ property > 22 </ bean > 23 24 < bean id = " mailMessage " class = " org.springframework.mail.SimpleMailMessage " > 25 < property name = " from " > 26 < value >Email </ value > 27 </ property > 28 < property name = " subject " > 29 < value >标题 </ value > 30 </ property > 31 < property name ="text " > 32 < value >内容 </value> 33 </ property > 46 </ bean > 47 48 < bean id = " orderManager " class = " cn.cityyouth.service.impl.OrderManagerImpl " > 49 < property name = " mailsender " > 50 < ref bean = " mailSender " /> 51 </ property > 52 < property name = " message " > 53 < ref bean = " mailMessage " /> 54 </ property > 55 </ bean > 56 57 </ beans >
4、最后配|自qjsp面以及action
1 package cn.cityyouth.web.action; 2 3 import javax.servlet.http.HttpServletRequest; 4 import javax.servlet.http.HttpServletResponse; 5 import org.apache.struts.action.ActionForm; 6 import org.apache.struts.action.ActionForward; 7 import org.apache.struts.action.ActionMapping; 8 import org.apache.struts.action.ActionMessage; 9 import org.apache.struts.action.ActionMessages; 10 import com.test.service.OrderManager; 11 12 public class SendMailAction extends BaseAction { 13 14 /** 15 * Method execute 16 * 17 * @param mapping 18 * @param form 19 * @param request 20 * @param response 21 * @return ActionForward 22 */ 23 public ActionForward execute(ActionMapping mapping, ActionForm form, 24 HttpServletRequest request, HttpServletResponse response) { 25 OrderManager omi = (OrderManager) this .getBean( " orderManager " ); 26 String useremail = " 123@163.com " ; 27 omi.placeOrder(useremail); 28 } 29 }
到此所有的开发以l束?br />
Sring邮g抽象层的主要包是Qorg.springframework.mail 包。它包含叫MailSender为发送邮件的核心接口和包含简单邮件属性例如from,to,cc,subject,text叫SimpleMailMessage的值对? q个包也包含一个检查异常的层次Q它支持一个更高别的抽象过低别的邮gpȝ异常伴随根异常存在MailException. 请参考JavaDocs为更多的信息杂邮件异常层ơ?/p>
spring in action in action also provides a sub-interface of MailSender for specialized JavaMail features such as MIME messages, namely org.springframework.mail.javamail.JavaMailSender It also provides a callback interface for preparation of JavaMail MIME messages, namely org.springframework.mail.javamail.MimeMessagePreparator
Spring也支持一个MailSender的专用于JavaMail特征例如MIME消息子接口,命名为org.springframework.javamail.JavaMailerSener。它也支持一个ؓJavaMail MIME信息的准备回调接口,命名为org.springframework.mail.JavaMail.MimeMessagePreparator.
]]> JMS 消息服务配置 http://www.aygfsteel.com/shmily432685/archive/2005/12/05/22502.html闉| 闉| Mon, 05 Dec 2005 01:42:00 GMT http://www.aygfsteel.com/shmily432685/archive/2005/12/05/22502.html http://www.aygfsteel.com/shmily432685/comments/22502.html http://www.aygfsteel.com/shmily432685/archive/2005/12/05/22502.html#Feedback 0 http://www.aygfsteel.com/shmily432685/comments/commentRss/22502.html http://www.aygfsteel.com/shmily432685/services/trackbacks/22502.html JMS ?/SPAN>
JMS x息服务,是能够异步处理客戯求的开发模型。ؓ支持消息的异步处理, Java/J2EE q_引入?/SPAN>JMS API ?/SPAN>JMS 支持两种消息模型Q点对点和发?/SPAN>/ 订阅模式?/SPAN>
JMS 抽象对象
?/SPAN> spring in action 框架?/SPAN> jms 相关包结构看Q主要包括如下内容:
?SPAN style="FONT: 7pt 'Times New Roman'"> org.springframework.jms:
?SPAN style="FONT: 7pt 'Times New Roman'"> org.springframework.jms.connection:
?SPAN style="FONT: 7pt 'Times New Roman'"> org.springframework.jms.core:
?SPAN style="FONT: 7pt 'Times New Roman'"> org.springframework.jms.core.support:
?SPAN style="FONT: 7pt 'Times New Roman'"> org.springframework.jms.support
?SPAN style="FONT: 7pt 'Times New Roman'"> org.springframework.jms.support.converter:
?SPAN style="FONT: 7pt 'Times New Roman'"> org.springframework.jms.support.destination
发送消?/SPAN>
JmsTemplate 模板的用:
了解配置Q?/SPAN>
<beans>
<!?/SPAN>定义q接工厂 -->
<bean id=”connectionFactory?class=”org.springframework.jndi.JndiObjectFactoryBean?gt;
<property name=”jndiName?gt;
<value>ConnectionFactory</value>
</property>
<property name=”jndiTemplate?gt;
<ref local=”jndiTemplate?>
</property>
</bean>
<!?/SPAN>定义目的?/SPAN>-->
<bean id=”destination?class=”org.springframework.jndi.JndiObjectFactoryBean?gt;
<property name=”jndiName?gt;
<value>queue/testQueue</value>
</property>
<property name=”jndiTemplate?gt;
<ref local=”jndiTemplate?>
</property>
</bean>
<!—jmsTemplate 模板 -->
<bean id=”jmsTemplate?class=”org.springframework.jms.core.JmsTemplate?gt;
<property name=”connectionFactory?gt;
<ref local=”connectionFactory?>
</property>
<property name=”defaultDestination?gt;
<ref local=”destination?>
</property>
</bean>
<bean id=”jndiTemplate?class=”org.springframework.jms.jndi.JndiTemplate?gt;
<property name=”environment?gt;
<props>
<prop key = “java.naming.factory.initial?gt;
Org.jnp.interfaces.NamingContextFactory
</prop>
<prop key = “java.naming.provider.url?gt;
Jnp://url
</prop>
<prop key = “java.naming.factory.url.pkgs?gt;
Org.jboss.naming:org.jnp.interfaces
</prop>
</props>
</property>
</bean>
<beans>
以上配置通过 spring in action JNDI抽象服务中的 org.springframework.jndi.JndiObjectFactoryBean 获得。最后定义同客户应用交互?/SPAN>jmsTemplate. ?/SPAN>org.springframework.jms.core.JmsTemplate, 它将引用以上配置中的目的地和q接工厂?/SPAN>
~写客户端代?/SPAN>
JmsTemplate Jt = (JmsTemplate)this.getBean();
Jt.sent(new MessageCreator())
{
Public Message createMessage(Session session) throws JMSException{
Return session.createTextMessge(?/SPAN>文本消息 ,queue/testQueue?;
Log.info(?/SPAN>发送消息成功; ?;
}
}
?/SPAN>spring in action 框架提供?/SPAN>Jms 抽象中, JmsTemplate ?/SPAN>MessageCreator l合能够发送消息,因此需要实?/SPAN>MessageCreator 回调接口定义?/SPAN>createMessage 发法?/SPAN>
]]>myeclipse中weblogic服务?/title> http://www.aygfsteel.com/shmily432685/archive/2005/11/26/21511.html闉| 闉| Sat, 26 Nov 2005 08:11:00 GMT http://www.aygfsteel.com/shmily432685/archive/2005/11/26/21511.html http://www.aygfsteel.com/shmily432685/comments/21511.html http://www.aygfsteel.com/shmily432685/archive/2005/11/26/21511.html#Feedback 6 http://www.aygfsteel.com/shmily432685/comments/commentRss/21511.html http://www.aygfsteel.com/shmily432685/services/trackbacks/21511.html myeclipse配置weblogic
weblogic安装参见
http://zhangstar.blogbus.com/logs/2004/09/413796.html
MyEclipse默认的应用服务器为JBoss3Q这里我们用WebLogic8.1。启动EclipseQ选择“窗口\首选项”菜单,打开首选项对话框。展开MyEclipse下的Application Serversl点Q点击JBoss 3Q选中右面的Disable单选按钮,停用JBoss 3。然后点击WebLogic 8Q选中双的Enable单选按钮,启用WebLogic服务器。同时下面的配置如下Q? (1)BEA home directoryQC:\BEA。假定WebLogic安装在D:\BEA文g夹中? (2)WebLogic installation directoryQC:\BEA\weblogic81? (3)Admin usernameQ用户名? (4)Admin passwordQ密码? (5)Execution domain rootQ安装后Q启动服务的路径? (6)Execution domain nameQmydomain? (7)Execution server nameQmyserver? (8)Hostname:PortNumberQlocalhost:7001? (9)Security policy fileQD:\BEA\weblogic81\server\lib\weblogic.policy? (10)JAAS login configuration fileQ省略? 以上配置Ҏ安装情况不同而不同?BR>如图Q?BR> 接着展开WebLogic 8l点Q点击JDKQ在双的WLS JDK name处选择WebLogic 8的默认JDK。这里组合框中缺省ؓj2re1.4.2_03Q即之前单独安装的jre。单击Add按钮Q弹出WebLogic > Add JVM对话框,在JRE名称处随便输入一个名字,如jre1.4.1_02。然后在JREȝ录处选择WebLogic安装文g夹中的JDK文g夹,如D:\BEA\jdk141_02Q程序会自动填充Javadoc URL文本框和JREpȝ库列表框。单ȝ定按钮关闭对话框。这时候就可以在WLS JDK namel合框中选择jre1.4.1_02了。之后还要在下面的Optional Java VM argumentsQ如-ms64m -mx64m -Djava.library.path="D:/BEA/weblogic81/server/bin" -Dweblogic.management.discover=false -Dweblogic.ProductionModeEnabled=false 最后点击PathsQ在双的Prepend to classpath列表框中Q通过Add JAR/ZIP按钮Q加入D:\BEA\weblogic81\server\lib\weblogic.jar、D:\BEA\weblogic81\server\lib\webservices.jar。如果用到数据库Q还需把数据库的驱动类库加q来Q这里我们用WebLogic自带的SQL Server数据库驱动库D:\BEA\weblogic81\server\lib\mssqlserver4v65.jar? xQMyEclipse中WebLogic8的配|工作就完成了。下面可以看看在Eclipse中能否启动WebLogic了?自从安装了MyEclipse之后QEclipse工具栏中׃有一个Run/Stop Servers下拉按钮。点击该按钮的下拉部分,选择“WebLogic 8\Start”菜单,卛_始启动WebLogic了。通过查看下面的控制台消息Q就可以知道启动是否成功Q或有什么异常发生。停止WebLogic可选择“WebLogic\Stop”菜?/P>
]]> web.xml规则l过整理ȝ如下Q?/title> http://www.aygfsteel.com/shmily432685/archive/2005/11/11/19258.html闉| 闉| Fri, 11 Nov 2005 02:29:00 GMT http://www.aygfsteel.com/shmily432685/archive/2005/11/11/19258.html http://www.aygfsteel.com/shmily432685/comments/19258.html http://www.aygfsteel.com/shmily432685/archive/2005/11/11/19258.html#Feedback 0 http://www.aygfsteel.com/shmily432685/comments/commentRss/19258.html http://www.aygfsteel.com/shmily432685/services/trackbacks/19258.html 1、部|描q符文g像所?/SPAN>XML 文g一P必须以一?/SPAN>XML 头开始。这个头声明可以使用?/SPAN>XML 版本q给出文件的字符~码?/SPAN> 2、DOCYTPE声明必须立即出现在此头之后。这个声明告诉服务器适用?/SPAN>servlet 规范的版本(?/SPAN>2.2 ?/SPAN>2.3 Qƈ指定理此文件其余部分内容的语法?/SPAN>DTD(Document Type Definition Q文档类型定?/SPAN>) ?/SPAN>所有部|描q符文g的顶层(根)元素?/SPAN>web-app 。请注意Q?/SPAN>XML 元素不像 HTML Q他们是大小写敏感的。因此, web-App ?/SPAN>WEB-APP 都是不合法的Q?/SPAN>web-app 必须用小写?/SPAN>
1 <? xml version = " 1.0 " encoding = " UTF-8 " ?> 2 3 < web - app xmlns = " http://java.sun.com/xml/ns/j2ee " xmlns:xsi = " http://www.w3.org/2001/XMLSchema-instance " version = " 2.4 " xsi:schemaLocation = " http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd " > 4 5 </ web - app > 6 7
2?
部v描述W文件内的元素次?/SPAN>
XML 元素不仅是大写敏感的,而且它们q对出现在其他元素中的次序敏感?/SPAN>
XML 头必L文g中的W一, DOCTYPE 声明必须是第二项Q?/SPAN>web- app 元素必须是第三项。在 web-app 元素内,元素的次序也很重要。服务器不一定强制要求这U次序,但它们允许(实际上有些服务器是q样做的Q完全拒l执行含有次序不正确的元素的 Web 应用。这表示使用非标准元素次序的 web.xml 文g是不可移植的?/SPAN>
下面的列表给Z所有可直接出现?/SPAN>web-app 元素内的合法元素所必需的次序?/SPAN>
此列表说?/SPAN>servlet 元素必须出现在所?/SPAN>servlet-mapping 元素之前。请注意Q所有这些元素都是可选的。因此,可以省略掉某一元素Q但不能把它放于不正的位置?/SPAN> l icon icon元素指出 IDE ?/SPAN>GUI 工具用来表示 Web 应用的一个和两个囑փ文g的位|?/SPAN> l display-name display-name元素提供 GUI 工具可能会用来标记这个特定的 Web 应用的一个名U?/SPAN> l description description元素l出与此有关的说明性文本?/SPAN> l context-param context-param元素声明应用范围内的初始化参数?/SPAN> l filter qo器元素将一个名字与一个实?/SPAN>javax.servlet.Filter 接口的类相关联?/SPAN> l filter-mapping 一旦命名了一个过滤器Q就要利?/SPAN>filter-mapping 元素把它与一个或多个 servlet ?/SPAN>JSP 面相关联?/SPAN> l listener servlet API的版?/SPAN>2.3 增加了对事g监听E序的支持,事g监听E序在徏立、修改和删除会话?/SPAN>servlet 环境时得到通知?/SPAN>Listener 元素指出事g监听E序cR?/SPAN> l servlet 在向 servlet ?/SPAN>JSP 面制定初始化参数或定制 URL Ӟ必须首先命名 servlet ?/SPAN>JSP 面?/SPAN>Servlet 元素是用来完成此项d的?/SPAN> l servlet-mapping 服务器一般ؓ servlet 提供一个缺省的 URL Q?/SPAN>。但是,常常会更改这?/SPAN> URLQ以?/SPAN> servlet可以讉K初始化参数或更容易地处理相对 URL。在更改~省 URLӞ使用 servlet-mapping元素?/SPAN> l session-config 如果某个会话在一定时间内未被讉KQ服务器可以抛弃它以节省内存。可通过使用 HttpSession ?/SPAN>setMaxInactiveInterval Ҏ明确讄单个会话对象的超时|或者可利用 session-config 元素制定~省时倹{?/SPAN> l mime-mapping 如果 Web 应用h惛_Ҏ的文Ӟ希望能保证给他们分配特定?/SPAN>MIME cdQ则 mime-mapping 元素提供q种保证?/SPAN> l welcom-file-list welcome-file-list元素指示服务器在收到引用一个目录名而不是文件名?/SPAN>URL Ӟ使用哪个文g?/SPAN> l error-page error-page元素使得在返回特?/SPAN>HTTP 状态代码时Q或者特定类型的异常被抛出时Q能够制定将要显C的面?/SPAN> l taglib taglib元素Ҏ记库描述W文Ӟ Tag Libraryu Descriptor file Q指定别名。此功能使你能够更改 TLD 文g的位|,而不用编辑用这些文件的 JSP 面?/SPAN> l resource-env-ref resource-env-ref元素声明与资源相关的一个管理对象?/SPAN> l resource-ref resource-ref元素声明一个资源工厂用的外部资源?/SPAN> l security-constraint security-constraint元素制定应该保护?/SPAN>URL 。它?/SPAN>login-config 元素联合使用 l login-config ?/SPAN>login-config 元素来指定服务器应该怎样l试图访问受保护面的用h权。它?/SPAN>sercurity-constraint 元素联合使用?/SPAN> l security-role security-role元素l出安全角色的一个列表,q些角色出现在 servlet 元素内的 security-role-ref 元素?/SPAN>role-name 子元素中。分别地声明角色可高 IDE 处理安全信息更ؓҎ?/SPAN> l env-entry env-entry元素声明 Web 应用的环境项?/SPAN> l ejb-ref ejb-ref元素声明一?/SPAN>EJB 的主目录的引用?/SPAN> l ejb-local-ref ejb-local-ref元素声明一?/SPAN>EJB 的本C目录的应用?BR>3?/SPAN>
]]> Spring JMS 消息处理及配|?/title> http://www.aygfsteel.com/shmily432685/archive/2005/11/10/19071.html闉| 闉| Wed, 09 Nov 2005 16:14:00 GMT http://www.aygfsteel.com/shmily432685/archive/2005/11/10/19071.html http://www.aygfsteel.com/shmily432685/comments/19071.html http://www.aygfsteel.com/shmily432685/archive/2005/11/10/19071.html#Feedback 0 http://www.aygfsteel.com/shmily432685/comments/commentRss/19071.html http://www.aygfsteel.com/shmily432685/services/trackbacks/19071.html spring in action JMS
spring in action ?JMS 抽象框架化了 JMS API 的用,q与 JMS 提供者(比如 IBM ?WebSphere MQ 5.3Q^滑地集成?I>org.springframework.jms.core 包提供了?spring in action 中?JMS 的核心功能。它的模板类处理资源的创建和释放Q简化了 JMS 的用?/P>
像其他大多数 spring in action 模板cMPJMS 模板cL供了执行公共操作?helper Ҏ。在需要更复杂应用的情况下Q类把处理Q务的核心委托l用户实现的回调接口。JMS cL供了方便的方法,用来发送消息、同步地使用消息以及向用户公开 JMS 会话和消息的制作者?/P>
以下 JMS 包和 org.springframework.jms.core 一h成了 spring in action JMS 的功能:
org.springframework.jms.support
提供转换 JMSException
的功能。{换代码把到?JMSException
层次l构转换成未到异常的镜像层ơ结构?
org.springframework.jms.support.converter
提供 MessageConverter
抽象Q以?Java 对象?JMS 消息之间q行转换?
org.springframework.jms.support.destination
提供理 JMS 目标的不同策略,比如针对 JNDI 中保存的目标的服务定位器?
org.springframework.jms.connection
提供适合在独立应用程序中使用?ConnectionFactory
实现。connection q包含针?JMS ?spring in action PlatformTransactionManager
实现。它允许?JMS 作ؓ事务性资源集成到 spring in action 的事务管理机制中?/DD>
IBM WebSphere MQ
像前面提到的,CZ应用E序会用 spring in action ?JMS 框架通过 JMS 接口?IBM ?WebSphere MQ 集成。通过在应用程序和 Web 服务之间传递消息,WebSphere MQ 提供了可靠的、有恢复能力的应用程序集成。它使用队列和事务性工具帮助保持消息跨|络的完整性。WebSphere MQ 降低了信息丢q风险和调和通信 IT pȝ的需要?/P>
WebSphere MQ 在它所支持的所有^C提供了一致的应用E序~程接口Q这有助于让集成的程序可UL。除了标准接口外QWebSphere MQ q完整实CJMS 接口Q包括对发布-订阅消息传递的支持。WebSphere MQ Explorer 工具可以q程地管理和配置整个 MQ |络。管理和配置工具Z开放源码的 Eclipse 框架Q而且是可扩展的?/P>
spring in action JMS 模板
spring in action 框架提供?JmsTemplate
的两个实现?CODE>JmsTemplate cM?JMS 1.1 APIQ子c?JmsTemplate102
则?JMS 1.0.2 API。我的示例应用程序用的?JmsTemplate102
?/P>
JMS 模板被用来发送和接收 JMS 消息。Spring 采用回调机制?JMS 信息传递进行协调?CODE>MessageCreator 回调接口?JmsTemplate
中的调用代码提供?Session
创徏消息。ؓ了支?JMS API 更复杂的应用Q回?SessionCallback
向用h供了 JMS 会话Q?callback ProducerCallback
则公开?Session
?MessageProducer
l合?
清单 1 昄了示例应用程序用的 JMS 模板的配|。清单摘?spring in action -mqseries-jms.xml 文gQ请参阅 下蝲 Q?
清单 1. JMS 模板配置
<!-- JMS Queue Template -->
<bean id="jmsQueueTemplate"
class="org.springframework.jms.core.JmsTemplate102">
<property name="connectionFactory">
<ref bean="jmsQueueConnectionFactory"/>
</property>
<property name="destinationResolver">
<ref bean="jmsDestinationResolver"/>
</property>
<property name="pubSubDomain">
<value>false</value>
</property>
<property name="receiveTimeout">
<value>20000</value>
</property>
</bean>
jmsQueueTemplate
bean ?JMS q接工厂?JMS 目标解析器绑定在一P用于解析 JMS 客户机通过 JNDI 提供的目标队列名?CODE>connectionFactory 属性指定了如何获得?JMS 提供者的q接。在本例中,清单 2 昄了如何从 JNDI 索连接工厂?/P>清单 2. 通过 JNDI 配置 JMS q接工厂
<!-- JMS Queue Connection Factory -->
<bean id="internalJmsQueueConnectionFactory"
class="org.springframework.jndi.JndiObjectFactoryBean">
<property name="jndiTemplate">
<ref bean="jndiTemplate"/>
</property>
<property name="jndiName">
<value>MQ_JMS_MANAGER</value>
</property>
</bean>
可以看到Q?CODE>JndiObjectFactoryBean 被绑定到 internalJmsQueueConnectionFactory
?CODE>JndiObjectFactoryBean ?JndiTemplate
属性进?JNDI 查询。Spring 用 JndiTemplate
中指定的环境属性和初始上下文在 JNDI 中查询连接工厂。清?3 昄?JndiTemplate
配置 bean 的配|?/P>清单 3. JNDI 查询?JNDI 模板配置
<bean id="jndiTemplate" class="org.springframework.jndi.JndiTemplate">
<property name="environment">
<props>
<prop key="java.naming.factory.initial">
com.sun.jndi.fscontext.RefFSContextFactory
</prop>
<prop key="java.naming.provider.url">
file:/C:/JNDI-Directory
</prop>
</props>
</property>
</bean>
以上配置q行 JNDI 查询时用 com.sun.jndi.fscontext.RefFSContextFactory
指定初始上下文工厂,用基于文件的 file:/C:/JNDI-Directory 作ؓ提供?URL。根据示例应用程序的意图QJNDI 讉K会采用基于文件的 FSContext
版本Q请参阅 参考资?/FONT> Q的配置?MQ 队列l定?JNDI?/P>
有了定义好的 JMS 模板Q下一步就是把它绑定到CZ应用E序中,然后可以用它发送和接收消息了?/P>
spring in action JMS 实现
JMS 模板可以l定到应用程序中Q以发送和接收 JMS 消息。在清单 4 中可以看出我如何?清单 1 中的 JMS 模板l定到示例应用程序中?/P>清单 4. ?JmsTemplate l定到应用程序中
<bean id="jmsSender"
class="springexample.client.JMSSender">
<property name="jmsTemplate102">
<ref bean="jmsQueueTemplate"/>
</property>
</bean>
<bean id="jmsReceiver"
class="springexample.client.JMSReceiver">
<property name="jmsTemplate102">
<ref bean="jmsQueueTemplate"/>
</property>
</bean>
可以看到Q我?jmsQueueTemplate
l定到用来发送和接收消息?JmsSender
应用E序 bean ?JmsReceiver
bean。清?5 昄了与 JMSSender
cL关的代码?/P>清单 5. ?JmsTemplate 发?JMS 消息?JMSSender
public class JMSSender {
private JmsTemplate102 jmsTemplate102;
public JmsTemplate102 getJmsTemplate102() {
return jmsTemplate102;
}
public void setJmsTemplate102(JmsTemplate102 jmsTemplate102) {
this.jmsTemplate102 = jmsTemplate102;
}
public void sendMesage(){
jmsTemplate102.send("JMS_RequestResponseQueue",
new MessageCreator() {
public Message createMessage(Session session)
throws JMSException {
return session.createTextMessage("This is a sample message");
}
});
}
JMSSender
cȝ jmsTemplate102.send()
Ҏ发?JMS 消息?CODE>send() Ҏ的第一个参数是 JNDI 队列名,队列名指定了消息应当发送到哪里。(很快׃看到如何?WebSphere MQ 的队列名l定?JNDI。)send()
Ҏ的第二个参数?MessageCreator
cR?CODE>JmsTemplate 中的调用代码提供?Session
c,q个cL供了一个创?JMS 消息的回调接口?/P>
下一步是?JMS ?Session
cdZ个简单的文本消息。在代码执行Ӟ消息会传递给 WebSphere MQ 服务器的队列。清?6 昄了?JmsTemplate
?JMS 消息?JMSReceiver
应用E序 bean 的代码?/P>清单 6. ?JmsTemplate ?JMS 消息?JMSReceiver
public class JMSReceiver {
private JmsTemplate102 jmsTemplate102;
public JmsTemplate102 getJmsTemplate102() {
return jmsTemplate102;
}
public void setJmsTemplate102(JmsTemplate102 jmsTemplate102) {
this.jmsTemplate102 = jmsTemplate102;
}
public void processMessage(){
Message msg = jmsTemplate102.receive("JMS_RequestResponseQueue");
try{
TextMessage textMessage = (TextMessage) msg;
if( msg!=null){
System.out.println(" Message Received -->" +
textMessage.getText());
}
}catch(Exception e){
e.printStackTrace();
}
}
}
JMSReceiver
cȝ jmsTemplate102.receive()
Ҏ同步地接?JMS 消息?CODE>receive() Ҏ指定 JNDI 队列名,q从中检索消息?CODE>JMSTemplate cȝ processMessage()
Ҏ由接?JMS 客户用?CODE>JSMTemplate bean 的属?receiveTimeout Q列?JMSTemplate
配置中)指定接收客户机同步地从队列中接收消息时要{候的旉?/P>
现在应用E序的代码已完成Q下一步就是配|?WebSphere MQ 队列q把它们l定?JNDI 对象?/P>
队列理器的讄
在运行应用程序之前,需要设|?WebSphere MQ 的队列管理器和队列,q把它们l定?JNDI。如果喜Ƣ的话,可以按照q部分的CZ做:只需 下蝲 讄 WebSphere MQ 队列的批文g和应用程序的源代码和部v描述W即可。把 zip 文g解压到驱动器 C:?/P>
讄队列 q行 C:\SpringSeriesPart4JMS\batch 文g夹中?mqsetup.bat 文g。这个批文g要求?path 环境变量中设|好 MQ 安装?bin 文g夹(例如 C:\mqseries\bin Q。运行了Ҏ件之后,应当看到消息 ?CODE>All valid MQSC commands were processed”。要打开 MQ Explorer q检查已l创建的队列理器和队列Q请选择 Start -> Programs -> IBM MQSeries -> MQSeriesExplorer 。图 1 昄出示例应用程?QueueManager
MQJMS.QManager
已经创徏q正在运行?/P>?1. WebSphere MQ ?QueueManager 配置
请在应用E序屏幕左侧面板上点?MQJMS.QManager
下的 Queues 文g夏V应当看到已l创Z一个队?RequestResponseQueue
Q如?2 所C?/P>?2. WebSphere MQ 的请?响应队列配置
q就完成了队列的讄?/P>
讄 JMS ?JNDI 理 在示例应用程序中QJNDI 的访问利用了可以?JNDI 主页得到的基于文件的 FSContext
版本Q请参阅 参考资?/FONT> Q?I>FSContext.jar 文g也包含在 WebSphere MQ ?JMS 支持当中。请d文g?\MQSeriesInstallable\MQSeries\Java\lib ?\MQSeriesInstallable\MQSeries\Java\bin 到系l的 PATH 环境变量中。而且Q请?\MQSeriesInstallable\MQSeries\Java\lib 文g夹中的所?jar 文gd到系l的 CLASSPATH 环境变量中。还可以q行 C:\SpringSeriesPart4JMS\batch 文g夹中?classpath.cmd 文gQ它会设|必要的 path ?CLASSPATH 变量。要做到q点Q只需要修?classpath.cmd 文g中的 MQ_JAVA_INSTALL_PATH
Q把它指?WebSphere MQ JMS 的安装目录?/P>
接下来,修改 \MQSeriesInstallableDirectory\Java\bin 中的 JMSAdmin.config 配置文gQMQSeries JMS 理E序用它指明应用E序要用的上下文工厂和 JNDI 实现的地址。请取消以下行的注释Q?/P>
INITIAL_CONTEXT_FACTORY=com.sun.jndi.fscontext.RefFSContextFactory
q注释掉其余两个 INITIAL_CONTEXT_FACTORY
变量。还要取消以下行的注释:
PROVIDER_URL=file:/C:/JNDI-Directory
q注释掉其余两个 PROVIDER_URL
变量?/P>
可以?C:\SpringSeriesPart4JMS\batch 文g夹中发现参考的CZ配置文g?/P>
Z保存 JNDI 对象Q请在驱动器 C: 上创建名?JNDI-Directory 的目录。切换到 \MQSeriesInstallableDirectory\Java\bin 目录q运?JMSAdmin ҎӞ应当看到 InitCtx 变量?/P>
逐个输入以下内容Q?/P>
def qcf(MQ_JMS_MANAGER) qmgr(MQJMS.QManager)
按回?BR>
def q(JMS_RequestResponseQueue) qmgr(MQJMS.QManager)
queue(RequestResponseQueue)
按回?BR>
现在已经?WebSphere MQ 队列l定?JNDI 对象Q作为应用程序客户可以通过 JNDI 查询对象。现在剩下的是看代码的实际作用了!
q行CZ
要运行示例,请从 spring in action sourceforge download 下蝲 spring in action 框架和它的所有依赖文件ƈ解压Q例如解压到 c:\。会创徏文g?C:\spring-framework-1.2-rc2 Q或最新版本)?/P>
要运?spring in action 应用E序Q请把本文的源代码解压到L文g夹,例如 c:\ 。会创徏文g?SpringSeriesPart4JMS 。就像前面提到过的,q需要安?Apache Ant 和它?spring in action 依赖 jar 文g。请?spring in action ?—??spring in action .jar Q在 C:\spring-framework-1.2-rc2\dist 中)?commons-logging.jar Q在 C:\spring-framework-1.2-rc2\lib\jakarta-commons 中)拯?SpringSeriesPart4JMS\lib 文g夏V还要把所有的 jar 库从 \MQSeriesInstallableDirectory\Java\lib 目录拯?SpringSeriesPart4JMS\lib 文g夏V其中包?MQseries ?JMS 的相兛_。现在就拥有了构建的依赖集?/P>
接下来,打开命o提示W,切换?SpringProject4 目录Qƈ在命令提C符下输入以下命令:
> ant -f build-jmssender.xml.
q会构徏q运?SendMQSpringJMS
c,它会调用 JMSSender
c,发送消息到 WebSphere MQ RequestResponse
队列?CODE>SendMQSpringJMS q会通过它的 ClassPathXmlApplicationContext
装入 spring in action 配置文g。一?bean 全部装蝲Q就可以通过 spring in action ?ApplicationContext ?getBean()
Ҏ讉K JMSSenderQ请参阅清单 7Q?/P>清单 7. 装入CZ应用E序?spring in action 配置
ClassPathXmlApplicationContext appContext =
new ClassPathXmlApplicationContext(new String[] {
"spring in action -mqseries-jms.xml"
});
JMSSender jmsSender = (JMSSender)
appContext.getBean("jmsSender");
消息传递到队列上之后,误?JMS 接收方客h以检索消息。请打开命o提示W,切换到目?SpringProject4 Qƈ输入Q?/P>
> ant -f build-jmsreceiver.xml
q会构徏q运?ReceiveMQSpringJMS
c,该类会调?JMSReceiver
c,以从 WebSphere MQ ?RequestResponse
队列接收文本消息。在控制C会打印出以下消息Q?/P>
Message Received --> This is a sample message.
l束?/FONT>
?spring in action pd的最后这文章中Q您学习?spring in action JMS 框架的基。我首先介绍了示例应用程序的核心lg —?spring in action JMS 框架?IBM ?WebSphere MQ 5.3Q然后介l了如何?spring in action JMS 模板?WebSphere MQ 队列发送消息和从中接收消息。虽然这个示例非常简单,但是可以把这里介l的步骤应用到更复杂的应用程序?/P>
我希望介l?spring in action 框架核心模块的这一pdҎ有所帮助。请参阅 参考资?/FONT> 学习更多有关 spring in action 框架?spring in action JMS 的内宏V?/P>
下蝲
描述
名字
大小
下蝲Ҏ
Example code, spring in action files, and build scripts
wa-spring4-SpringSeriesPart4JMS.zip
17 KB
FTP
参考资?
学习
您可以参阅本文在 developerWorks 全球站点上的 英文原文 ?BR>
?A >轻量U开发的成功U诀Q第 3 部分: spring in action 露出水面 ”(Bruce TateQdeveloperWorksQ?005 q?6 月)QBruce Tate 介绍?spring in action 作ؓ轻量U容器的意义?BR>
?A >Writing Java Message Service programs using WebSphere MQ V5.3 ”(Willy FarrellQdeveloperWorksQ?003 q?10 月)Q安装和配置 WebSphere MQ 5.3 以进?JMS 开发和试的详l指对{?BR>
?A >?AXIS ~写 JMS 应用E序 ”(Naveen BalaniQdeveloperWorksQ?003 q?2 月)Q开发同?JMS SOAP 应用E序?BR>
Web 架构专区 Q数癄涉及Z Web 的解x案的文章?/LI> 获得产品和技?/B>
讨论
加入本文?A href="javascript:void forumWindow()">论坛 ?您也可以通过点击文章剙或者底部的论坛链接参加讨论?
developerWorks blogs Q加?developerWorks C?BR> ]]> Spring MVC 框架以及基本配置 http://www.aygfsteel.com/shmily432685/archive/2005/11/09/19070.html闉| 闉| Wed, 09 Nov 2005 15:59:00 GMT http://www.aygfsteel.com/shmily432685/archive/2005/11/09/19070.html http://www.aygfsteel.com/shmily432685/comments/19070.html http://www.aygfsteel.com/shmily432685/archive/2005/11/09/19070.html#Feedback 0 http://www.aygfsteel.com/shmily432685/comments/commentRss/19070.html http://www.aygfsteel.com/shmily432685/services/trackbacks/19070.html spring in action 框架提供了构?Web 应用E序的全功能 MVC 模块。?spring in action 可插入的 MVC 架构Q可以选择是用内|的 spring in action Web 框架q是 Struts q样?Web 框架。通过{略接口QSpring 框架是高度可配置的,而且包含多种视图技术,例如 JavaServer PagesQJSPQ技术、Velocity、Tiles、iText ?POI。Spring MVC 框架q不知道使用的视图,所以不会强q您只?JSP 技术。Spring MVC 分离了控制器、模型对象、分z֙以及处理E序对象的角Ԍq种分离让它们更Ҏq行定制?/P>
spring in action ?Web MVC 框架是围l?DispatcherServlet
设计的,它把h分派l处理程序,同时带有可配|的处理E序映射、视图解析、本地语a、主题解析以及上载文件支持。默认的处理E序是非常简单的 Controller
接口Q只有一个方?ModelAndView handleRequest(request, response)
。Spring 提供了一个控制器层次l构Q可以派生子cR如果应用程序需要处理用戯入表单,那么可以l承 AbstractFormController
。如果需要把多页输入处理C个表单,那么可以l承 AbstractWizardFormController
?/P>
CZ应用E序有助于直观地学习q些Ҏ。银行应用程序允许用h索他们的帐户信息。在构徏银行应用E序的过E中Q可以学到如何配|?spring in action MVC 框架和实现框架的视图层,视图层包?JSTL 标记Q用于显C出的数据Q和JavaServer Pages 技术?BR>
配置 spring in action MVC
要开始构建示例应用程序,请配|?spring in action MVC ?DispatcherServlet
。请?web.xml 文g中注册所有配|。清?1 昄了如何配|?sampleBankingServlet
?/P>
清单 1. 配置 spring in action MVC DispatcherServlet
<servlet>
<servlet-name>sampleBankingServlet</servlet-name>
<servlet-class>
org.springframework.we.servlet.DispatcherServlet
<servlet-class>
<load-on-startup>1<load-on-startup>
<servlet>
DispatcherServlet
从一?XML 文g装入 spring in action 应用E序上下文,XML 文g的名U是 servlet 的名U后面加?-servlet 。在q个CZ中,DispatcherServlet
会从 sampleBankingServlet-servlet.xml 文g装入应用E序上下文?
配置应用E序?URL
下一步是配置惌 sampleBankingServlet
处理?URL。同Pq是要在 web.xml 中注册所有这些信息?/P>
清单 2. 配置惌处理?URL
<servlet-mapping>
<servlet-name> sampleBankingServlet<servlet-name>
<url-pattern>*.jsp</url-pattern>
</servlet-mapping>
装入配置文g
下面Q装入配|文件。ؓ了做到这点,请ؓ Servlet 2.3 规范注册 ContextLoaderListener
或ؓ Servlet 2.2 及以下的容器注册 ContextLoaderServlet
。ؓ了保障后向兼Ҏ,L ContextLoaderServlet
。在启动 Web 应用E序ӞContextLoaderServlet
会装?spring in action 配置文g。清?3 注册?ContextLoaderServlet
?/P>
清单 3. 注册 ContextLoaderServlet
<servlet>
<servlet-name>context>servlet-name>
<servlet-class>
org.springframework.web.context.ContextLoaderServlet
</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
contextConfigLocation
参数定义了要装入?spring in action 配置文gQ如下面?servlet 上下文所C?/P>
<context-param>
<param-value>contextConfigLocation</param-value>
<param-value>/WEB-INF/sampleBanking-services.xml</param-value>
</context-param>
sampleBanking-services.xml 文g代表CZ银行应用E序服务的配|和 bean 配置。如果想装入多个配置文gQ可以在 <param-value>
标记中用逗号作分隔符?BR>-------------------------------------------------------------------------------------------------------------------------
spring in action MVC CZ
CZ银行应用E序允许用户Ҏ惟一?ID 和口令查看帐户信息。虽?spring in action MVC 提供了其他选项Q但是我采?JSP 技术作N面。这个简单的应用E序包含一个视N用于用户输入QID 和口令)Q另一|C用L帐户信息?/P>
我从 LoginBankController
开始,它扩展了 spring in action MVC ?SimpleFormController
?CODE>SimpleFormContoller 提供了显CZ HTTP GET
h接收到的表单的功能,以及处理?HTTP POST
接收到的相同表单数据的功能?CODE>LoginBankController ?AuthenticationService
?AccountServices
服务q行验证Qƈ执行帐户zd。?配置视图属?/FONT> ”一节中?清单 5 描述了如何把 AuthenticationService
?AccountServices
q接?LoginBankController
?清单 4 昄?LoginBankController
的代码?/P>
配置视图属?/FONT>
下面Q我必须注册在接收到 HTTP GET
h时显C的面。我?spring in action 配置中用 formView
属性注册这个页面,如清?5 所C?CODE>sucessView 属性代表表单数据提交而且 doSubmitAction()
Ҏ中的逻辑成功执行之后昄的页面?CODE>formView ?sucessView
属性都代表被定义的视图的逻辑名称Q逻辑名称映射到实际的视图面?/P>
清单 5. 注册 LoginBankController
<bean id="loginBankController"
class="springexample.controller.LoginBankController">
<property name="sessionForm"><value>true</value></property>
<property name="commandName"><value>loginCommand</value></property>
<property name="commandClass">
<value>springexample.commands.LoginCommand</value>
</property>
<property name="authenticationService">
<ref bean="authenticationService" />
</property>
<property name="accountServices">
<ref bean="accountServices" />
</property>
<property name="formView">
<value>login</value>
</property>
<property name="successView">
<value>accountdetail</value>
</property>
</bean>
commandClass
?commandName
标记军_在视图面中活动的 bean。例如,可以通过 login.jsp 面讉K loginCommand
beanQ这个页面是应用E序的登录页面。一旦用h交了d面Q应用程序就可以?LoginBankController
?onSubmit()
Ҏ中的命o对象索出表单数据?/P>
视图解析?/FONT>
spring in action MVC ?视图解析?/I> 把每个逻辑名称解析成实际的资源Q即包含帐户信息?JSP 文g。我用的?spring in action ?InternalResourceViewResolver
Q如 清单 6 所C?/P>
因ؓ我在 JSP 面中用了 JSTL 标记Q所以用Ld名称解析成资?/jsp/login.jsp Q?viewClass
成ؓ JstlView
?/P>
验证和帐h?/FONT>
像前面提到的,LoginBankController
内部q接?spring in action ?AccountServices
?AuthenticationService
?CODE>AuthenticationService cd理银行应用程序的验证?CODE>AccountServices cd理典型的银行服务Q例如查找交易和甉|。清?7 昄了银行应用程序的验证和帐h务的配置?/P>
清单 7. 配置验证和帐h?/B>
<beans>
<bean id="accountServices"
class="springexample.services.AccountServices">
</bean>
<bean id="authenticationService"
class="springexample.services.AuthenticationService">
</bean>
</beans>
以上服务?sampleBanking-services.xml 中注册,然后装入 web.xml 文g中,像 前面讨论的那?/FONT> 。控制器和服务配|好后,q个单的应用E序完成了。现在我们来看看部v和测试它时会发生什? -------------------------------------------------------------------------------------------------------------------------
部v应用E序
我把CZ应用E序部v?Tomcat servlet 容器中。Tomcat ?Java Servlet ?Java ServerPagest 技术的官方参考实C使用?servlet 容器。如果以前没q么做过Q请 下蝲 jakarta-tomcat-5.0.28.exe q运行它?Tomcat 安装到自己喜Ƣ的M位置Q例?c:\tomcat5.0
?/P>
接下来,下蝲CZ代码 q攑ֈ驱动器(例如 c:\ Q上。创Z spring in action 目的文件夹之后Q打开它ƈ?spring in action -banking 子文件夹拯?c:\tomvat5.0\webapps 。spring-banking 文gҎ一?Web 档案Q里面包?spring in action MVC CZ应用E序。lib 文g夹包含应用程序需要的 spring in action 框架、与Spring 相关?MVC 库以?JSTL 标记库和 jar 文g?/P>
要启?Tomcat 服务器,请用以下命令:
cd bin C:\Tomcat 5.0\bin> catalina.bat start
Tomcat 应当启动q|?spring in action MVC CZ应用E序?BR>=================================================================================
试应用E序
要测试应用程序,h开 Web 览器,指向 http://localhost:tomcatport /springbanking q用 Tomcat 服务器实际运行的端口替换 tomcatport 。应当看到图 1 所C的d屏幕。输入用?ID “admin”和口o“password”,q按下登录按钮。其他用?ID 或口令会造成来自验证服务的错误?/P>
?1. spring in action MVC CZd屏幕
d成功之后Q会看到?2 所C的帐户l节面?/P>
?2. spring in action MVC CZ帐户l节面 ================================================================================
l束?/FONT>
在三部分?spring in action pd 的第三篇文章中,我介l了 spring in action MVC 框架的特性。我演示了如何配|和开?spring in action MVC 应用E序、如何配|?spring in action MVC 控制器和向其中插入依赖项、如何用 JavaServer Pages 技术开发应用程序视图,以及如何把自q面?spring in action MVC 的视囑ֱ集成。ȝq篇文章Ӟ我演CZ如何?Tomcat servlet 容器中部|应用程序以及如何在览器中试它?/P>
Ll关?spring in action pd 的下一文章。在下一文章中Q我介l如何把Z JMS 的应用程序与 spring in action 框架集成。同Ӟ请参?参考资?/FONT> 学习更多有关 spring in action 框架?spring in action MVC 的内宏V?BR>=================================================================================
下蝲
描述
名字
大小
下蝲Ҏ
Example source code, spring in action files, jar files
wa-spring3-SpringProjectPart3.zip
1966 KB
FTP
=================================================================================
U别: 中
Naveen Balani , 技术架构师, Webify Solutions
2005 q?10 ?13 ?/P>
?Naveen Balani ?spring in action pd的第 3 部分中,学习如何?spring in action 框架开发基?MVC ?应用E序?/BLOCKQUOTE>
?spring in action pd 的第 3 部分中,我介l?spring in action MVC 框架。就像在以前的文章中一P我用银行CZ介绍如何建模和构建简单的应用E序。示例应用程序包含了已经学过的一些技术(例如依赖注入Q,但是主要演示 spring in action MVC 的特性?/P>
在开始之前,?下蝲q篇文章的源代码 。请参阅 参考资?/FONT> 讉K spring in action 框架?Tomcat 5.0Q运行示例需要它们?/P>
spring in action MVC 框架
spring in action 框架提供了构?Web 应用E序的全功能 MVC 模块。?spring in action 可插入的 MVC 架构Q可以选择是用内|的 spring in action Web 框架q是 Struts q样?Web 框架。通过{略接口QSpring 框架是高度可配置的,而且包含多种视图技术,例如 JavaServer PagesQJSPQ技术、Velocity、Tiles、iText ?POI。Spring MVC 框架q不知道使用的视图,所以不会强q您只?JSP 技术。Spring MVC 分离了控制器、模型对象、分z֙以及处理E序对象的角Ԍq种分离让它们更Ҏq行定制?/P>
spring in action ?Web MVC 框架是围l?DispatcherServlet
设计的,它把h分派l处理程序,同时带有可配|的处理E序映射、视图解析、本地语a、主题解析以及上载文件支持。默认的处理E序是非常简单的 Controller
接口Q只有一个方?ModelAndView handleRequest(request, response)
。Spring 提供了一个控制器层次l构Q可以派生子cR如果应用程序需要处理用戯入表单,那么可以l承 AbstractFormController
。如果需要把多页输入处理C个表单,那么可以l承 AbstractWizardFormController
?/P>
CZ应用E序有助于直观地学习q些Ҏ。银行应用程序允许用h索他们的帐户信息。在构徏银行应用E序的过E中Q可以学到如何配|?spring in action MVC 框架和实现框架的视图层,视图层包?JSTL 标记Q用于显C出的数据Q和JavaServer Pages 技术?/P>
配置 spring in action MVC
要开始构建示例应用程序,请配|?spring in action MVC ?DispatcherServlet
。请?web.xml 文g中注册所有配|。清?1 昄了如何配|?sampleBankingServlet
?/P>清单 1. 配置 spring in action MVC DispatcherServlet
<servlet>
<servlet-name>sampleBankingServlet</servlet-name>
<servlet-class>
org.springframework.we.servlet.DispatcherServlet
<servlet-class>
<load-on-startup>1<load-on-startup>
<servlet>
DispatcherServlet
从一?XML 文g装入 spring in action 应用E序上下文,XML 文g的名U是 servlet 的名U后面加?-servlet 。在q个CZ中,DispatcherServlet
会从 sampleBankingServlet-servlet.xml 文g装入应用E序上下文?
配置应用E序?URL
下一步是配置惌 sampleBankingServlet
处理?URL。同Pq是要在 web.xml 中注册所有这些信息?/P>清单 2. 配置惌处理?URL
<servlet-mapping>
<servlet-name> sampleBankingServlet<servlet-name>
<url-pattern>*.jsp</url-pattern>
</servlet-mapping>
装入配置文g
下面Q装入配|文件。ؓ了做到这点,请ؓ Servlet 2.3 规范注册 ContextLoaderListener
或ؓ Servlet 2.2 及以下的容器注册 ContextLoaderServlet
。ؓ了保障后向兼Ҏ,L ContextLoaderServlet
。在启动 Web 应用E序ӞContextLoaderServlet
会装?spring in action 配置文g。清?3 注册?ContextLoaderServlet
?/P>清单 3. 注册 ContextLoaderServlet
<servlet>
<servlet-name>context>servlet-name>
<servlet-class>
org.springframework.web.context.ContextLoaderServlet
</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
contextConfigLocation
参数定义了要装入?spring in action 配置文gQ如下面?servlet 上下文所C?/P>
<context-param>
<param-value>contextConfigLocation</param-value>
<param-value>/WEB-INF/sampleBanking-services.xml</param-value>
</context-param>
sampleBanking-services.xml 文g代表CZ银行应用E序服务的配|和 bean 配置。如果想装入多个配置文gQ可以在 <param-value>
标记中用逗号作分隔符?/P>
spring in action MVC CZ
CZ银行应用E序允许用户Ҏ惟一?ID 和口令查看帐户信息。虽?spring in action MVC 提供了其他选项Q但是我采?JSP 技术作N面。这个简单的应用E序包含一个视N用于用户输入QID 和口令)Q另一|C用L帐户信息?/P>
我从 LoginBankController
开始,它扩展了 spring in action MVC ?SimpleFormController
?CODE>SimpleFormContoller 提供了显CZ HTTP GET
h接收到的表单的功能,以及处理?HTTP POST
接收到的相同表单数据的功能?CODE>LoginBankController ?AuthenticationService
?AccountServices
服务q行验证Qƈ执行帐户zd。?配置视图属?/FONT> ”一节中?清单 5 描述了如何把 AuthenticationService
?AccountServices
q接?LoginBankController
?清单 4 昄?LoginBankController
的代码?/P>
配置视图属?/FONT>
下面Q我必须注册在接收到 HTTP GET
h时显C的面。我?spring in action 配置中用 formView
属性注册这个页面,如清?5 所C?CODE>sucessView 属性代表表单数据提交而且 doSubmitAction()
Ҏ中的逻辑成功执行之后昄的页面?CODE>formView ?sucessView
属性都代表被定义的视图的逻辑名称Q逻辑名称映射到实际的视图面?/P>清单 5. 注册 LoginBankController
<bean id="loginBankController"
class="springexample.controller.LoginBankController">
<property name="sessionForm"><value>true</value></property>
<property name="commandName"><value>loginCommand</value></property>
<property name="commandClass">
<value>springexample.commands.LoginCommand</value>
</property>
<property name="authenticationService">
<ref bean="authenticationService" />
</property>
<property name="accountServices">
<ref bean="accountServices" />
</property>
<property name="formView">
<value>login</value>
</property>
<property name="successView">
<value>accountdetail</value>
</property>
</bean>
commandClass
?commandName
标记军_在视图面中活动的 bean。例如,可以通过 login.jsp 面讉K loginCommand
beanQ这个页面是应用E序的登录页面。一旦用h交了d面Q应用程序就可以?LoginBankController
?onSubmit()
Ҏ中的命o对象索出表单数据?/P>
视图解析?/FONT>
spring in action MVC ?视图解析?/I> 把每个逻辑名称解析成实际的资源Q即包含帐户信息?JSP 文g。我用的?spring in action ?InternalResourceViewResolver
Q如 清单 6 所C?/P>
因ؓ我在 JSP 面中用了 JSTL 标记Q所以用Ld名称解析成资?/jsp/login.jsp Q?viewClass
成ؓ JstlView
?/P>
验证和帐h?/FONT>
像前面提到的,LoginBankController
内部q接?spring in action ?AccountServices
?AuthenticationService
?CODE>AuthenticationService cd理银行应用程序的验证?CODE>AccountServices cd理典型的银行服务Q例如查找交易和甉|。清?7 昄了银行应用程序的验证和帐h务的配置?/P>清单 7. 配置验证和帐h?/B>
<beans>
<bean id="accountServices"
class="springexample.services.AccountServices">
</bean>
<bean id="authenticationService"
class="springexample.services.AuthenticationService">
</bean>
</beans>
以上服务?sampleBanking-services.xml 中注册,然后装入 web.xml 文g中,像 前面讨论的那?/FONT> 。控制器和服务配|好后,q个单的应用E序完成了。现在我们来看看部v和测试它时会发生什?
部v应用E序
我把CZ应用E序部v?Tomcat servlet 容器中。Tomcat ?Java Servlet ?Java ServerPagest 技术的官方参考实C使用?servlet 容器。如果以前没q么做过Q请 下蝲 jakarta-tomcat-5.0.28.exe q运行它?Tomcat 安装到自己喜Ƣ的M位置Q例?c:\tomcat5.0
?/P>
接下来,下蝲CZ代码 q攑ֈ驱动器(例如 c:\ Q上。创Z spring in action 目的文件夹之后Q打开它ƈ?spring in action -banking 子文件夹拯?c:\tomvat5.0\webapps 。spring-banking 文gҎ一?Web 档案Q里面包?spring in action MVC CZ应用E序。lib 文g夹包含应用程序需要的 spring in action 框架、与Spring 相关?MVC 库以?JSTL 标记库和 jar 文g?/P>
要启?Tomcat 服务器,请用以下命令:
cd bin C:\Tomcat 5.0\bin> catalina.bat start
Tomcat 应当启动q|?spring in action MVC CZ应用E序?/P>
试应用E序
要测试应用程序,h开 Web 览器,指向 http://localhost:tomcatport /springbanking q用 Tomcat 服务器实际运行的端口替换 tomcatport 。应当看到图 1 所C的d屏幕。输入用?ID “admin”和口o“password”,q按下登录按钮。其他用?ID 或口令会造成来自验证服务的错误?/P>?1. spring in action MVC CZd屏幕
d成功之后Q会看到?2 所C的帐户l节面?/P>?2. spring in action MVC CZ帐户l节面
l束?/FONT>
在三部分?spring in action pd 的第三篇文章中,我介l了 spring in action MVC 框架的特性。我演示了如何配|和开?spring in action MVC 应用E序、如何配|?spring in action MVC 控制器和向其中插入依赖项、如何用 JavaServer Pages 技术开发应用程序视图,以及如何把自q面?spring in action MVC 的视囑ֱ集成。ȝq篇文章Ӟ我演CZ如何?Tomcat servlet 容器中部|应用程序以及如何在览器中试它?/P>
Ll关?spring in action pd 的下一文章。在下一文章中Q我介l如何把Z JMS 的应用程序与 spring in action 框架集成。同Ӟ请参?参考资?/FONT> 学习更多有关 spring in action 框架?spring in action MVC 的内宏V?/P>
下蝲
描述
名字
大小
下蝲Ҏ
Example source code, spring in action files, jar files
wa-spring3-SpringProjectPart3.zip
1966 KB
FTP
参考资?
学习
获得产品和技?/B>
讨论
加入本文?A href="javascript:void forumWindow()">论坛 ?您也可以通过点击文章剙或者底部的论坛链接参加讨论?
developerWorks blogs Q加?developerWorks C?
===============================================================================
关于作?/FONT>
Naveen Balani 把他的大部分旉花在设计和开发基?J2EE 的框架和产品上。他?IBM developerWorks 撰写了各cL章,涉及的主题有 ESB、SOA、JMS、Web 服务架构、CICS、AXIS、DB2、XML Extender、WebSphere Studio、MQSeries、Java 无线讑֤?DB2 Everyplace for Palm、J2ME、MIDP、Java-Nokia、Visual Studio .Net 以及无线数据同步。可以给他发邮gQ他的地址是:naveenbalani@rediffmail.com ?/P>
================================================================================ 原文出处Q?A >http://www-128.ibm.com/developerworks/cn/java/wa-spring3/ ]]> 使用 Spring 更好地处?Struts 动作 三种整合 Struts 应用E序?Spring 的方?/title> http://www.aygfsteel.com/shmily432685/archive/2005/11/09/19069.html闉| 闉| Wed, 09 Nov 2005 15:53:00 GMT http://www.aygfsteel.com/shmily432685/archive/2005/11/09/19069.html http://www.aygfsteel.com/shmily432685/comments/19069.html http://www.aygfsteel.com/shmily432685/archive/2005/11/09/19069.html#Feedback 0 http://www.aygfsteel.com/shmily432685/comments/commentRss/19069.html http://www.aygfsteel.com/shmily432685/services/trackbacks/19069.html
U别: 中
George Franciscus , 负责? Nexcel
2005 q?11 ?03 ?/P>
Struts Recipes 的合著?George Franciscus 介l另一个重大的 Struts 整合H门 —?q次是将 Struts 应用E序导入 spring in action 框架。请跟随 GeorgeQ他向您展C如何改?Struts 动作Q得管?Struts 动作像理 spring in action beans 那样。结果是一个增强的 web 框架Q这个框架可以方便地利用 spring in action AOP 的优ѝ?/BLOCKQUOTE>
您肯定已l听说过控制反{ (IOC) 设计模式Q因为很长一D|间以来一直在传关于它的信息。如果您在Q何功能中使用q?spring in action 框架Q那么您q道其原理的作用。在本文中,我利用这一原理把一?Struts 应用E序注入 spring in action 框架Q您亲w体会到 IOC 模式的强大?/P>
一?Struts 应用E序整合q?spring in action 框架h多方面的优点。首先,Spring 是ؓ解决一些关?JEE 的真实世界问题而设计的Q比如复杂性、低性能和可试性,{等。第二,Spring 框架包含一?AOP 实现Q允许您面向方面技术应用于面向对象的代码。第三,一些h可能会说 spring in action 框架只有处理 Struts ?Struts 处理自己好。但是这是观炚w题,我演CZU将 Struts 应用E序整合?spring in action 框架的方法后Q具体由您自己决定用哪一U?/P>
我所演示的方法都是执行v来相对简单的Q但是它们却h明显不同的优炏V我为每一U方法创Z一个独立而可用的例子Q这h可以完全理解每U方法。请参阅 下蝲 部分获得完整例子源代码。请参阅 参考资?/FONT> Q下?Struts MVC ?spring in action 框架?/P>
Z?spring in action q么了不P
spring in action 的创立?Rod Johnson 以一U批判的眼光看待 Java?企业软g开发,q且提议很多企业N都能够通过战略C?IOC 模式Q也UC依赖注入Q来解决。当 Rod 和一个具有奉献精的开放源码开发者团队将q个理论应用于实跉|Q结果就产生?spring in action 框架。简a之,Spring 是一个轻型的容器Q利用它可以使用一个外?XML 配置文g方便地将对象q接在一赗每个对象都可以通过昄一?JavaBean 属性收C个到依赖对象的引用,留给您的单Q务就只是在一?XML 配置文g中把它们q接好?/P>
依赖注入是一个强大的Ҏ,但是 spring in action 框架能够提供更多Ҏ。Spring 支持可插拔的事务理器,可以l您的事务处理提供更q泛的选择范围。它集成了领先的持久性框Ӟq且提供一个一致的异常层次l构。Spring q提供了一U用面向方面代码代替正常的面向对象代码的简单机制?/P>
spring in action AOP 允许您?I>拦截?/I> 在一个或多个执行点上拦截应用E序逻辑。加强应用程序在拦截器中的日志记录逻辑会生一个更可读的、实用的代码基础Q所以拦截器q泛用于日志记录。您很快׃看到Qؓ了处理横切关注点QSpring AOP 发布了它自己的拦截器Q您也可以编写您自己的拦截器?/P>
整合 Struts ?spring in action
?Struts 怼QSpring 可以作ؓ一?MVC 实现。这两种框架都具有自q优点和缺点,管大部分h同意 Struts ?MVC 斚w仍然是最好的。很多开发团队已l学会在旉紧迫的时候利?Struts 作ؓ构造高品质软g的基。Struts h如此大的推动力,以至于开发团队宁愿整?spring in action 框架的特性,而不愿意转换?spring in action MVC。没必要q行转换Ҏ来说是一个好消息。Spring 架构允许您将 Struts 作ؓ Web 框架q接到基?spring in action 的业务和持久层。最后的l果是现在一切条仉具备了?/P>
在接下来的小H门中,您将会了解到三种?Struts MVC 整合?spring in action 框架的方法。我揭C每U方法的~陷q且Ҏ它们的优炏V?一旦您了解到所有三U方法的作用Q我会向您展示一个o人兴奋的应用E序Q这个程序用的是这三种Ҏ中我最喜欢的一U?/P>
三个窍?/FONT>
接下来的每种整合技术(或者窍门)都有自己的优点和特点。我偏爱其中的一U,但是我知道这三种都能够加深您?Struts ?spring in action 的理解。在处理各种不同情况的时候,q将l您提供一个广阔的选择范围。方法如下:
装蝲应用E序环境
无论您用哪U技术,都需要?spring in action ?ContextLoaderPlugin
?Struts ?ActionServlet
装蝲 spring in action 应用E序环境。就像添加Q何其他插件一P单地向您?struts-config.xml 文gd该插Ӟ如下所C:
<plug-in className=
"org.springframework.web.struts.ContextLoaderPlugIn">
<set-property property=
"contextConfigLocation" value="/WEB-INF/beans.xml"/>
</plug-in>
前面已经提到q,?下蝲 部分Q您能够扑ֈq三个完全可使用的例子的完整源代码。每个例子都Z个书c搜索应用程序提供一U不同的 Struts ?spring in action 的整合方法。您可以在这里看C子的要点Q但是您也可以下载应用程序以查看所有的l节?/P>
H门 1. 使用 spring in action ?ActionSupport
手动创徏一?spring in action 环境是一U整?Struts ?spring in action 的最直观的方式。ؓ了它变得更单,Spring 提供了一些帮助。ؓ了方便地获得 spring in action 环境Q?CODE>org.springframework.web.struts.ActionSupport cL供了一?getWebApplicationContext()
Ҏ。您所做的只是?spring in action ?ActionSupport
而不?Struts Action
cL展您的动作,如清?1 所C:
清单 1. 使用 ActionSupport 整合 Struts
package ca.nexcel.books.actions;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts.action.ActionError;
import org.apache.struts.action.ActionErrors;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.action.DynaActionForm;
import org.springframework.context.ApplicationContext;
import org.springframework.web.struts.ActionSupport;
import ca.nexcel.books.beans.Book;
import ca.nexcel.books.business.BookService;
public class SearchSubmit extends ActionSupport { |(1)
public ActionForward execute(
ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse response)
throws IOException, ServletException {
DynaActionForm searchForm = (DynaActionForm) form;
String isbn = (String) searchForm.get("isbn");
//the old fashion way
//BookService bookService = new BookServiceImpl();
ApplicationContext ctx =
getWebApplicationContext(); |(2)
BookService bookService =
(BookService) ctx.getBean("bookService"); |(3)
Book book = bookService.read(isbn.trim());
if (null == book) {
ActionErrors errors = new ActionErrors();
errors.add(ActionErrors.GLOBAL_ERROR,new ActionError
("message.notfound"));
saveErrors(request, errors);
return mapping.findForward("failure") ;
}
request.setAttribute("book", book);
return mapping.findForward("success");
}
}
让我们快速思考一下这里到底发生了什么。在 (1) 处,我通过?spring in action ?ActionSupport
c而不?Struts ?Action
c进行扩展,创徏了一个新?Action
。在 (2) 处,我?getWebApplicationContext()
Ҏ获得一?ApplicationContext
。ؓ了获得业务服务,我用在 (2) 处获得的环境?(3) 处查找一?spring in action bean?/P>
q种技术很单ƈ且易于理解。不q的是,它将 Struts 动作?spring in action 框架耦合在一赗如果您x换掉 spring in action Q那么您必须重写代码。ƈ且,׃ Struts 动作不在 spring in action 的控制之下,所以它不能获得 spring in action AOP 的优ѝ当使用多重独立?spring in action 环境Ӟq种技术可能有用,但是在大多数情况下,q种Ҏ不如另外两种Ҏ合适?/P>
H门 2. 覆盖 RequestProcessor
?spring in action ?Struts 动作中分L一个更巧妙的设计选择。分ȝ一U方法是使用 org.springframework.web.struts.DelegatingRequestProcessor
cL覆盖 Struts ?RequestProcessor
处理E序Q如清单 2 所C:
清单 2. 通过 spring in action ?DelegatingRequestProcessor q行整合
<?xml version="1.0" encoding="ISO-8859-1" ?>
<!DOCTYPE struts-config PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 1.1//EN"
"http://jakarta.apache.org/struts/dtds/struts-config_1_1.dtd">
<struts-config>
<form-beans>
<form-bean name="searchForm"
type="org.apache.struts.validator.DynaValidatorForm">
<form-property name="isbn" type="java.lang.String"/>
</form-bean>
</form-beans>
<global-forwards type="org.apache.struts.action.ActionForward">
<forward name="welcome" path="/welcome.do"/>
<forward name="searchEntry" path="/searchEntry.do"/>
<forward name="searchSubmit" path="/searchSubmit.do"/>
</global-forwards>
<action-mappings>
<action path="/welcome" forward="/WEB-INF/pages/welcome.htm"/>
<action path="/searchEntry" forward="/WEB-INF/pages/search.jsp"/>
<action path="/searchSubmit"
type="ca.nexcel.books.actions.SearchSubmit"
input="/searchEntry.do"
validate="true"
name="searchForm">
<forward name="success" path="/WEB-INF/pages/detail.jsp"/>
<forward name="failure" path="/WEB-INF/pages/search.jsp"/>
</action>
</action-mappings>
<message-resources parameter="ApplicationResources"/>
<controller processorClass="org.springframework.web.struts.
DelegatingRequestProcessor"/> |(1)
<plug-in className="org.apache.struts.validator.ValidatorPlugIn">
<set-property property="pathnames"
value="/WEB-INF/validator-rules.xml,/WEB-INF/validation.xml"/>
</plug-in>
<plug-in className="org.springframework.web.struts.ContextLoaderPlugIn">
<set-property property="csntextConfigLocation" value="/WEB-INF/beans.xml"/>
</plug-in>
</struts-config>
我利用了 <controller>
标记来用 DelegatingRequestProcessor
覆盖默认?Struts RequestProcessor
。下一步是在我?spring in action 配置文g中注册该动作Q如清单 3 所C:
清单 3. ?spring in action 配置文g中注册一个动?/B>
<?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="bookService" class="ca.nexcel.books.business.BookServiceImpl"/>
<bean name="/searchSubmit"
class="ca.nexcel.books.actions.SearchSubmit"> |(1)
<property name="bookService">
<ref bean="bookService"/>
</property>
</bean>
</beans>
注意Q在 (1) 处,我用名U属性注册了一?beanQ以匚w struts-config 动作映射名称?CODE>SearchSubmit 动作揭示了一?JavaBean 属性,允许 spring in action 在运行时填充属性,如清?4 所C:
清单 4. h JavaBean 属性的 Struts 动作
package ca.nexcel.books.actions;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts.action.Action;
import org.apache.struts.action.ActionError;
import org.apache.struts.action.ActionErrors;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.action.DynaActionForm;
import ca.nexcel.books.beans.Book;
import ca.nexcel.books.business.BookService;
public class SearchSubmit extends Action {
private BookService bookService;
public BookService getBookService() {
return bookService;
}
public void setBookService(BookService bookService) { | (1)
this.bookService = bookService;
}
public ActionForward execute(
ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse response)
throws IOException, ServletException {
DynaActionForm searchForm = (DynaActionForm) form;
String isbn = (String) searchForm.get("isbn");
Book book = getBookService().read(isbn.trim()); |(2)
if (null == book) {
ActionErrors errors = new ActionErrors();
errors.add(ActionErrors.GLOBAL_ERROR,new ActionError("message.notfound"));
saveErrors(request, errors);
return mapping.findForward("failure") ;
}
request.setAttribute("book", book);
return mapping.findForward("success");
}
}
在清?4 中,您可以了解到如何创徏 Struts 动作。在 (1) 处,我创Z一?JavaBean 属性?CODE>DelegatingRequestProcessor 自动地配|这U属性。这U设计 Struts 动作q不知道它正?spring in action 理Qƈ且您能够利?Sping 的动作管理框架的所有优炏V由于您?Struts 动作注意不到 spring in action 的存在,所以您不需要重写您?Struts 代码可以用其他控制反转容器来替换?spring in action ?/P>
DelegatingRequestProcessor
Ҏ的确比第一U方法好Q但是仍然存在一些问题。如果您使用一个不同的 RequestProcessor
Q则需要手动整?spring in action ?DelegatingRequestProcessor
。添加的代码会造成l护的麻烦ƈ且将来会降低您的应用E序的灵zL。此外,q有q一些用一pd命o来代?Struts RequestProcessor
的传闅R?q种改变会对这U解x法的使用寿命造成负面的媄响?/P>
H门 3. 动作管理委托给 spring in action
一个更好的解决Ҏ是将 Strut 动作理委托l?spring in action 。您可以通过?struts-config
动作映射中注册一个代理来实现。代理负责在 spring in action 环境中查?Struts 动作。由于动作在 spring in action 的控制之下,所以它可以填充动作?JavaBean 属性,qؓ应用诸如 spring in action ?AOP 拦截器之cȝҎ带来了可能?
清单 5 中的 Action
cM清单 4 中的相同。但?struts-config 有一些不同:
清单 5. spring in action 整合的委托方?/B>
<?xml version="1.0" encoding="ISO-8859-1" ?>
<!DOCTYPE struts-config PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 1.1//EN"
"http://jakarta.apache.org/struts/dtds/struts-config_1_1.dtd">
<struts-config>
<form-beans>
<form-bean name="searchForm"
type="org.apache.struts.validator.DynaValidatorForm">
<form-property name="isbn" type="java.lang.String"/>
</form-bean>
</form-beans>
<global-forwards type="org.apache.struts.action.ActionForward">
<forward name="welcome" path="/welcome.do"/>
<forward name="searchEntry" path="/searchEntry.do"/>
<forward name="searchSubmit" path="/searchSubmit.do"/>
</global-forwards>
<action-mappings>
<action path="/welcome" forward="/WEB-INF/pages/welcome.htm"/>
<action path="/searchEntry" forward="/WEB-INF/pages/search.jsp"/>
<action path="/searchSubmit"
type="org.springframework.web.struts.DelegatingActionProxy" |(1)
input="/searchEntry.do"
validate="true"
name="searchForm">
<forward name="success" path="/WEB-INF/pages/detail.jsp"/>
<forward name="failure" path="/WEB-INF/pages/search.jsp"/>
</action>
</action-mappings>
<message-resources parameter="ApplicationResources"/>
<plug-in className="org.apache.struts.validator.ValidatorPlugIn">
<set-property
property="pathnames"
value="/WEB-INF/validator-rules.xml,/WEB-INF/validation.xml"/>
</plug-in>
<plug-in
className="org.springframework.web.struts.ContextLoaderPlugIn">
<set-property property="contextConfigLocation" value="/WEB-INF/beans.xml"/>
</plug-in>
</struts-config>
清单 5 是一个典型的 struts-config.xml 文gQ只有一个小的差别。它注册 spring in action 代理cȝ名称Q而不是声明动作的cdQ如Q?Q处所C。DelegatingActionProxy cM用动作映名U查?spring in action 环境中的动作。这是我们使用 ContextLoaderPlugIn
声明的环境?/P>
一?Struts 动作注册Z?spring in action bean 是非常直观的Q如清单 6 所C。我利用动作映射使用 <bean>
标记的名U属性(在这个例子中?"/searchSubmit
"Q简单地创徏了一?bean。这个动作的 JavaBean 属性像M spring in action bean 一栯填充Q?
清单 6. ?spring in action 环境中注册一?Struts 动作
<?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="bookService" class="ca.nexcel.books.business.BookServiceImpl"/>
<bean name="/searchSubmit"
class="ca.nexcel.books.actions.SearchSubmit">
<property name="bookService">
<ref bean="bookService"/>
</property>
</bean>
</beans>
动作委托的优?/FONT>
动作委托解决Ҏ是这三种Ҏ中最好的。Struts 动作不了?spring in action Q不对代码作M改变可用于?spring in action 应用E序中?CODE>RequestProcessor 的改变不会媄响它Qƈ且它可以利用 spring in action AOP Ҏ的优点?
动作委托的优点不止如此。一旦让 spring in action 控制您的 Struts 动作Q您可以?spring in action l动作补充更强的zd。例如,没有 spring in action 的话Q所有的 Struts 动作都必LU程安全的。如果您讄 <bean>
标记?singleton 属性ؓ“false”,那么不管用何U方法,您的应用E序都将在每一个请求上有一个新生成的动作对象。您可能不需要这U特性,但是把它攑֜您的工具׃也很好。您也可以利?spring in action 的生命周期方法。例如,当实例化 Struts 动作Ӟ<bean>
标记?init-method 属性被用于q行一个方法。类似地Q在从容器中删除 bean 之前Qdestroy-method 属性执行一个方法。这些方法是理昂贵对象的好办法Q它们以一U与 Servlet 生命周期相同的方式进行管理?/P>
拦截 Struts
前面提到q,通过?Struts 动作委托l?spring in action 框架而整?Struts ?spring in action 的一个主要的优点是:您可以将 spring in action ?AOP 拦截器应用于您的 Struts 动作。通过?spring in action 拦截器应用于 Struts 动作Q您可以用最的代h处理横切x炏V?/P>
虽然 spring in action 提供很多内置拦截器,但是我将向您展示如何创徏自己的拦截器q把它应用于一?Struts 动作。ؓ了用拦截器Q您需要做三g事:
创徏拦截器?
注册拦截器?
声明在何处拦截代码?/LI>
q看h非常单的几句话却非常强大。例如,在清?7 中,我ؓ Struts 动作创徏了一个日志记录拦截器?q个拦截器在每个Ҏ调用之前打印一句话Q?/P>清单 7. 一个简单的日志记录拦截?/B>
package ca.nexcel.books.interceptors;
import org.springframework.aop.MethodBeforeAdvice;
import java.lang.reflect.Method;
public class LoggingInterceptor implements MethodBeforeAdvice {
public void before(Method method, Object[] objects, Object o) throws Throwable {
System.out.println("logging before!");
}
}
q个拦截器非常简单?CODE>before() Ҏ在拦截点中每个方法之前运行。在本例中,它打印出一句话Q其实它可以做您惛_的Q何事。下一步就是在 spring in action 配置文g中注册这个拦截器Q如清单 8 所C:
清单 8. ?spring in action 配置文g中注册拦截器
<?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="bookService" class="ca.nexcel.books.business.BookServiceImpl"/>
<bean name="/searchSubmit"
class="ca.nexcel.books.actions.SearchSubmit">
<property name="bookService">
<ref bean="bookService"/>
</property>
</bean>
<!-- Interceptors -->
<bean name="logger"
class="ca.nexcel.books.interceptors.LoggingInterceptor"/> |(1)
<!-- AutoProxies -->
<bean name="loggingAutoProxy"
class="org.springframework.aop.framework.autoproxy.
BeanNameAutoProxyCreator"> |(2)
<property name="beanNames">
<value>/searchSubmit</valuesgt; |(3)
</property>
<property name="interceptorNames">
<list>
<value>logger</value> |(4)
</list>
</property>
</bean>
</beans>
您可能已l注意到了,清单 8 扩展?清单 6 中所C的应用E序以包含一个拦截器。具体细节如下:
?(1) 处,我注册了q个拦截器?
?(2) 处,我创Z一?bean 名称自动代理Q它描述如何应用拦截器。还有其他的Ҏ定义拦截点,但是q种Ҏ常见而简ѝ?
?(3) 处,我将 Struts 动作注册为将被拦截的 bean。如果您惌拦截其他?Struts 动作Q则只需要在 "beanNames" 下面创徏附加?<value>
标记?
?(4) 处,当拦截发生时Q我执行了在 (1) 处创建的拦截?bean 的名U。这里列出的所有拦截器都应用于“beanNames”?/LI>
是q样。就像这个例子所展示的,您?Struts 动作|于 spring in action 框架的控制之下,为处理您?Struts 应用E序提供了一pd全新的选择。在本例中,使用动作委托可以L地利?spring in action 拦截器提?Struts 应用E序中的日志记录能力?/P>
l束?/FONT>
在本文中Q您已经学习了将 Struts 动作整合?spring in action 框架中的三种H门。?spring in action ?ActionSupport
来整?StrutsQ第一U窍门中是q样做的Q简单而快P但是会将 Struts 动作?spring in action 框架耦合在一赗如果您需要将应用E序ULC个不同的框架Q则需要重写代码。第二种解决Ҏ通过委托 RequestProcessor
巧妙地解开代码的耦合Q但是它的可扩展性不强,q且?Struts ?RequestProcessor
变成一pd命oӞq种Ҏ持l不了很长时间。第三种Ҏ是这三种Ҏ中最好的Q将 Struts 动作委托l?spring in action 框架可以使代码解耦,从而您可以在您的 Struts 应用E序中利?spring in action 的特性(比如日志记录拦截器)?/P>
三种 Struts-Spring 整合H门中的每一U都被实现成一个完整可用的应用E序。请参阅 下蝲 部分仔细研究它们?/P>
下蝲
描述
名字
大小
下蝲Ҏ
ActionSupport sample code
j-sr2-actionsupport.zip
5 MB
FTP
RequestProcessor sample code
j-sr2-requestprocessor.zip
5 MB
FTP
Delegate sample code
j-sr2-delegate.zip
5 MB
FTP
参考资?
学习
获得产品和技?/B>
讨论
加入本文?A href="javascript:void forumWindow()">论坛 ?您也可以通过点击文章剙或者底部的论坛链接参加讨论?
developerWorks blogs Q加?developerWorks C?/LI>
关于作?/FONT>
]]> Myeclipseq_struts+hibernate+spring目开发示?/title> http://www.aygfsteel.com/shmily432685/archive/2005/11/05/18233.html闉| 闉| Fri, 04 Nov 2005 18:32:00 GMT http://www.aygfsteel.com/shmily432685/archive/2005/11/05/18233.html 阅读全文 ]]> 使用Spring邮g抽象层发送简单邮?通过自己~写Q更新后发布) http://www.aygfsteel.com/shmily432685/archive/2005/11/04/18177.html闉| 闉| Fri, 04 Nov 2005 09:49:00 GMT http://www.aygfsteel.com/shmily432685/archive/2005/11/04/18177.html
Spring提供了一个发送电子邮件的高抽象层,它向用户屏蔽了底层邮件系l的一些细节,同时负责低层ơ的代表客户端的资源处理。Spring邮g抽象层的主要包ؓorg.springframework.mail。它包括了发送电子邮件的主要接口MailSender?装了简单邮件的属性如from, to,cc, subject, text的值对象叫做SimpleMailMessage? 1、我们定义一个发送邮件的接口:OrderManager.java
1 public interface OrderManager extends BaseManager{ 2 /** 3 *email,要发送的邮g地址; 4 *Code:Ȁzȝ 5 */ 6 public void placeOrder(String email); 7 }
2、我们需要对该接口进行实现的Ҏ:OrderManagerImpl.java
1 import javax.mail.Message; 2 import javax.mail.MessagingException; 3 import javax.mail.internet.InternetAddress; 4 import javax.mail.internet.MimeMessage; 5 import org.springframework.mail.MailException; 6 import org.springframework.mail.javamail.JavaMailSender; 7 import org.springframework.mail.javamail.MimeMessagePreparator; 8 import service.OrderManager; 9 11 public class OrderManagerImpl extends BaseManagerImpl implements OrderManager { 12 13 private JavaMailSender mailsender; 14 private MyMailMessage message; 15 16 17 public void setMessage(CityMailMessage message) 18 { 19 this .message = message; 20 } 21 public void setMailsender(JavaMailSender mailsender) { 22 this .mailsender = mailsender; 23 } 24 public void placeOrder( final String email ) { 25 26 27 MimeMessagePreparator preparator = new MimeMessagePreparator() { 28 public void prepare(MimeMessage mimeMessage) throws MessagingException { 29 mimeMessage.setRecipient(Message.RecipientType.TO, 30 new InternetAddress(email)); 31 mimeMessage.setFrom( new InternetAddress(message.getFrom())); 32 /**转换~码为GBK*/ 33 mimeMessage.setSubject(message.getSubject(), " GBK " ); 36 mimeMessage.setText(email + " <br> " + message.getSubject() +message.getText() , " GBK " ); 37 38 } 39 }; 40 try { 41 mailsender.send(preparator); 42 } 43 catch (MailException ex) { 44 // log it and go on 45 System.err.println(ex.getMessage()); 46 } 47 } 48 }
3、spring配置发送email的applicationContext-email.xml
1 <? xml version = " 1.0 " encoding = " UTF-8 " ?> 2 <! DOCTYPE beans PUBLIC " -//SPRING//DTD BEAN//EN " 3 " http://www.springframework.org/dtd/spring-beans.dtd " > 4 5 < beans > 6 < bean id = " mailSender " class = " org.springframework.mail.javamail.JavaMailSenderImpl " > 7 < property name = " host " > 8 < value > smtp. 163 .com </ value > 9 </ property > 10 < property name = " username " > 11 < value > username </ value > 12 </ property > 13 < property name = " password " > 14 < value > password </ value > 15 </ property > 16 < property name = " javaMailProperties " > 17 < props > 18 < prop key = " mail.smtp.auth " > true </ prop > 19 < prop key = " mail.smtp.timeout " > 25000 </ prop > 20 </ props > 21 </ property > 22 </ bean > 23 24 < bean id = " mailMessage " class = " org.springframework.mail.SimpleMailMessage " > 25 < property name = " from " > 26 < value >Email </ value > 27 </ property > 28 < property name = " subject " > 29 < value >标题 </ value > 30 </ property > 31 < property name ="text " > 32 < value >内容 </value> 33 </ property > 46 </ bean > 47 48 < bean id = " orderManager " class = " cn.cityyouth.service.impl.OrderManagerImpl " > 49 < property name = " mailsender " > 50 < ref bean = " mailSender " /> 51 </ property > 52 < property name = " message " > 53 < ref bean = " mailMessage " /> 54 </ property > 55 </ bean > 56 57 </ beans >
4、最后配|自qjsp面以及action
1 package cn.cityyouth.web.action; 2 3 import javax.servlet.http.HttpServletRequest; 4 import javax.servlet.http.HttpServletResponse; 5 import org.apache.struts.action.ActionForm; 6 import org.apache.struts.action.ActionForward; 7 import org.apache.struts.action.ActionMapping; 8 import org.apache.struts.action.ActionMessage; 9 import org.apache.struts.action.ActionMessages; 10 import com.test.service.OrderManager; 11 12 public class SendMailAction extends BaseAction { 13 14 /** 15 * Method execute 16 * 17 * @param mapping 18 * @param form 19 * @param request 20 * @param response 21 * @return ActionForward 22 */ 23 public ActionForward execute(ActionMapping mapping, ActionForm form, 24 HttpServletRequest request, HttpServletResponse response) { 25 OrderManager omi = (OrderManager) this .getBean( " orderManager " ); 26 String useremail = " 123@163.com " ; 27 omi.placeOrder(useremail); 28 } 29 }
到此所有的开发以l束?BR>
Sring邮g抽象层的主要包是Qorg.springframework.mail 包。它包含叫MailSender为发送邮件的核心接口和包含简单邮件属性例如from,to,cc,subject,text叫SimpleMailMessage的值对? q个包也包含一个检查异常的层次Q它支持一个更高别的抽象过低别的邮gpȝ异常伴随根异常存在MailException. 请参考JavaDocs为更多的信息杂邮件异常层ơ?/P>
spring in action also provides a sub-interface of MailSender for specialized JavaMail features such as MIME messages, namely org.springframework.mail.javamail.JavaMailSender It also provides a callback interface for preparation of JavaMail MIME messages, namely org.springframework.mail.javamail.MimeMessagePreparator
Spring也支持一个MailSender的专用于JavaMail特征例如MIME消息子接口,命名为org.springframework.javamail.JavaMailerSener。它也支持一个ؓJavaMail MIME信息的准备回调接口,命名为org.springframework.mail.JavaMail.MimeMessagePreparator.
]]>
վ֩ģ壺
ľ |
ݳ |
|
|
|
˫Ѽɽ |
ɳ |
º |
DZɽ |
ʤ |
|
|
|
|
|
Ͳ |
ԣ |
|
°Ͷ |
ɽ |
ˮ |
|
|
|
|
ɽ |
Ű |
ȷ |
|
ˮ |
佭 |
IJ |
|
Ϫ |
|
|
|
|
ˮ |
żҽ |
̫ |