if (null = book)I ActionErrors errors = new ActionErrorso errors. add(ActionErrors GLOBAL ERROR, new ActionError("message. notfound")) save Errors (request, errors) return mapping. findForward( failure ") request setAttribute("book", book) return mapping. findForward( success") 在清单4中,您可以了解到如何创建 Struts动作。在(1)处,创建了一个 JavaBean 属性。 DelegatingRequestProcessor自动地配置这种属性。这种设计使 Struts动作并不 知道它正被 Spring管理,并且使您能够利用 Sping的动作管理框架的所有优点。由于您 的 Struts动作注意不到 Spring的存在,所以您不需要重写您的 Struts代码就可以使 用其他控制反转容器来替换掉 Spring DelegatingRequestProcessor方法的确比第一种方法好,但是仍然存在一些问题。如果 您使用一个不同的 RequestProcessor,则需要手动整合 Spring的 DelegatingRequestProcessor。添加的代码会造成维护的麻烦并且将来会降低您的应用程 序的灵活性。此外,还有过一些使用一系列命令来代替 Struts requestProcessor的传闻 这种改变将会对这种解决方法的使用寿命造成负面的影响。 窍门3.将动作管理委托给 Spring 一个更好的解决方法是将 Strut动作管理委托给 Spring。您可以通过在 struts- config动作映射中注册一个代理来实现。代理负责在 Spring环境中查找 Struts 动作。由于动作在 Spring的控制之下,所以它可以填充动作的 JavaBean属性,并为应
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) 处,创建了一个 JavaBean 属性。DelegatingRequestProcessor 自动地配置这种属性。这种设计使 Struts 动作并不 知道它正被 Spring 管理,并且使您能够利用 Sping 的动作管理框架的所有优点。由于您 的 Struts 动作注意不到 Spring 的存在,所以您不需要重写您的 Struts 代码就可以使 用其他控制反转容器来替换掉 Spring。 DelegatingRequestProcessor 方法的确比第一种方法好,但是仍然存在一些问题。如果 您使用一个不同的 RequestProcessor,则需要手动整合 Spring 的 DelegatingRequestProcessor。添加的代码会造成维护的麻烦并且将来会降低您的应用程 序的灵活性。此外,还有过一些使用一系列命令来代替 Struts RequestProcessor 的传闻。 这种改变将会对这种解决方法的使用寿命造成负面的影响。 窍门 3. 将动作管理委托给 Spring 一个更好的解决方法是将 Strut 动作管理委托给 Spring。您可以通过在 struts-config 动作映射中注册一个代理来实现。代理负责在 Spring 环境中查找 Struts 动作。由于动作在 Spring 的控制之下,所以它可以填充动作的 JavaBean 属性,并为应
用诸如 Spring的AOP拦截器之类的特性带来了可能 清单5中的 Action类与清单4中的相同。但是 struts- config有一些不同: 清单5. Spring整合的委托方法 <?xml version="1.0 encoding="Is0-8859-1 ? < DOCTYPE struts-config PUblIc //Apache Software Foundation//DTD Struts Configuration 11//EN http://jakarta.apacheorg/struts/dtds/struts-config11.dtd> Kstruts-config <form-beans> <form-bean e- searchFor type="org. apache. struts. validator. DynavalidatorForm"> <form-property name="isbn" type=" java. lang String /> </form-bean> /form-beans Kglobal-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 Forward name="success" path="/WEB-INF/pages/detail. jsp/
用诸如 Spring 的 AOP 拦截器之类的特性带来了可能。 清单 5 中的 Action 类与清单 4 中的相同。但是 struts-config 有一些不同: 清单 5. Spring 整合的委托方法 <?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> K /action-mappings> message-resources parameter="ApplicationResources"/> Kplug-in className="org. apache struts. validator. ValidatorPlugIn"> set-property value="/WEB-INF/validator-rules. xml, /WEB-INF/validation xm1/> </plug-in) <plug-in className="org. springframework. web. struts. ContextLoaderPlugIn> <set-property property="contextConfigLocation value="/WEB-INF/beans. xmI"/ </plug-i </struts-config> 清单5是一个典型的 struts- config.xm1文件,只有一个小小的差别。它注册 Spring代 理类的名称,而不是声明动作的类名,如(1)处所示。 DelegatingActionProxy类使用动 作映射名称查找 Spring环境中的动作。这就是我们使用 ContextLoaderPlugln声明的环 境 将一个 Struts动作注册为一个 Spring bean是非常直观的,如清单6所示。利用 动作映射使用<bean>标记的名称属性(在这个例子中是"/ searchSubmit")简单地创建 了一个bean。这个动作的 JavaBean属性像任何 Spring bean一样被填充: 清单6.在 Spring环境中注册一个 Struts动作 <?xml version="1.0 encoding="UTF-8?> <! DOCTYPE beans PUBLIC "-/SPRING//DTD BEAN//EN http://www.springframeworkorg/dtd/spring-beans.dtd> <beans> bean id="bookService" class="ca. nexcel books business Book ServiceImpl"/>
<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 文件,只有一个小小的差别。它注册 Spring 代 理类的名称,而不是声明动作的类名,如(1)处所示。DelegatingActionProxy 类使用动 作映射名称查找 Spring 环境中的动作。这就是我们使用 ContextLoaderPlugIn 声明的环 境。 将一个 Struts 动作注册为一个 Spring bean 是非常直观的,如清单 6 所示。利用 动作映射使用 <bean> 标记的名称属性(在这个例子中是 "/searchSubmit")简单地创建 了一个 bean。这个动作的 JavaBean 属性像任何 Spring bean 一样被填充: 清单 6. 在 Spring 环境中注册一个 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"> Kref bean="book Service /> </property> </bean> </beans> 动作委托的优点 动作委托解决方法是这三种方法中最好的。 Struts动作不了解 Spring,不对代码作任 何改变就可用于非 Spring应用程序中。 RequestProcessor的改变不会影响它,并且它可 以利用 Spring AOP特性的优点, 动作委托的优点不止如此。一旦让 Spring控制您的 Struts动作,您就可以使用 Spring给动作补充更强的活力。例如,没有 Spring的话,所有的 Struts动作都必须是 线程安全的。如果您设置<bean标记的 singleton属性为“ false”,那么不管用何种 方法,您的应用程序都将在每一个请求上有一个新生成的动作对象。您可能不需要这种特 性,但是把它放在您的工具箱中也很好。您也可以利用 Spring的生命周期方法。例如 当实例化 Struts动作时,<bean>标记的 init-method属性被用于运行一个方法。类似 地,在从容器中删除bean之前, destroy- method属性执行一个方法。这些方法是管理昂 贵对象的好办法,它们以一种与 Servlet生命周期相同的方式进行管理。 五、 Spring在项目开发中的应用 作者:0461116武冰冰 5.1.课程相关介绍 5.1.1.对项目组的贡献 即自己开发了一些 spring的应用实例,系统详细的讲述 spring的用法。在项目 开始之前,我对于 spring是一窍不通的,通过这个项目,我开始去自学 spring
<bean name="/searchSubmit" class="ca.nexcel.books.actions.SearchSubmit"> <property name="bookService"> <ref bean="bookService"/> </property> </bean> </beans> 动作委托的优点 动作委托解决方法是这三种方法中最好的。Struts 动作不了解 Spring,不对代码作任 何改变就可用于非 Spring 应用程序中。RequestProcessor 的改变不会影响它,并且它可 以利用 Spring AOP 特性的优点。 动作委托的优点不止如此。一旦让 Spring 控制您的 Struts 动作,您就可以使用 Spring 给动作补充更强的活力。例如,没有 Spring 的话,所有的 Struts 动作都必须是 线程安全的。如果您设置 <bean> 标记的 singleton 属性为“false”,那么不管用何种 方法,您的应用程序都将在每一个请求上有一个新生成的动作对象。您可能不需要这种特 性,但是把它放在您的工具箱中也很好。您也可以利用 Spring 的生命周期方法。例如, 当实例化 Struts 动作时,<bean> 标记的 init-method 属性被用于运行一个方法。类似 地,在从容器中删除 bean 之前,destroy-method 属性执行一个方法。这些方法是管理昂 贵对象的好办法,它们以一种与 Servlet 生命周期相同的方式进行管理。 五、Spring 在项目开发中的应用 作者:0461116 武冰冰 5.1.课程相关介绍 5.1.1. 对项目组的贡献 即自己开发了一些 spring 的应用实例,系统详细的讲述 spring 的用法。在项目 开始之前,我对于 spring 是一窍不通的,通过这个项目,我开始去自学 spring
并且用它自己做了一些小项目,到目前为止,我能够用它熟练的开发项目 51.2课程收获与总结 从开学到现在,每节课我都很认真地在听讲,觉得通过这门课程,我得到很 多的收获。 首先是从课堂内容介绍,让我无论是从理论上还是实际操作方面,都对面向 对象有了一个大体的认识和了解。通过这些了解,再结合以前做过的一些相关的 项目,明显对自己的编程能力和编程意识有了一个较大的提高,并且把这样的提 高在本课程的 project中得以展现。 其次是学生老师共同讲解的授课模式方面。由于多数同学自己的理解能力和 技术水平相差不大,所以由同学普及的一些知识,不仅有用,而且利于理解。不 论是前沿的新技术,还是得以反复论证的经典套路,都让我感觉受益匪浅 从授课配套设施上来看,OOAD的PPT应该是在我学过的诸多课程中,算 是非常详细的了,深入浅出,图文并茂,并且能把代码和概念很好的结合起来, 加之在软院三年培养出来的学习能力,以及在软件工程课上对一些知识的初步了 解,让我对于OOAD的课件看起来觉得容易理解且非常直观 这样的直观不仅体现在对课程的学习方面,在课后复习,课前预习阶段,这 样清楚的PPT也是一个很好的辅助手段。 最后是我们分组负责的项目,每一个人都要做一次 presentation,那么对于 做演讲的同学来说其实是一个很好的机会,能够切身的去学习那些知识,并通过 作 presentation在向大家讲解一遍,加深了认识,多次重复的学习帮助大家掌 握某项知识。 5.1.3.课程意见 首先,课堂练习是一种很有效的增强学习的手段。毋庸置疑,它非常有利于 巩固我在这节课上所学习的知识。对于一些不明白,不理解,或者理解不透彻的 地方,可以通过课堂练习进行进一步的理解或者是巩固。课堂练习也更让我容易 把握当天讲授知识的重点和难点内容,从而更加有针对性的进行学习。但是,老 师您让我们完成的课堂练习中,很多我都觉得没有什么必要去完成,因为我觉得 自己并不能从中收获什么。所以我建议老师,能够多做些有意思的练习,多于很 多可有可无的练习,尽量不要浪费时间。 其次,我觉得应该在现有的基础上,在教学的多样性上进行进一步的挖掘 应该说,作为一种当前最流行的编程模式,面向对象的思想之所以能得以越来越 多的应用,因为其较强的逻辑性和易学易懂,也将是越来越多的编程模式的最终 发展方向。作为软件学院的学生,还是希望对这种编程思想有更深入,更彻底的 理解。一些图文并茂等多种教学手段的引入,或许能让我对OO有比现在更加深 刻的认识。 六、项目相关介绍
并且用它自己做了一些小项目,到目前为止,我能够用它熟练的开发项目。 5.1.2 课程收获与总结 从开学到现在,每节课我都很认真地在听讲,觉得通过这门课程,我得到很 多的收获。 首先是从课堂内容介绍,让我无论是从理论上还是实际操作方面,都对面向 对象有了一个大体的认识和了解。通过这些了解,再结合以前做过的一些相关的 项目,明显对自己的编程能力和编程意识有了一个较大的提高,并且把这样的提 高在本课程的 project 中得以展现。 其次是学生老师共同讲解的授课模式方面。由于多数同学自己的理解能力和 技术水平相差不大,所以由同学普及的一些知识,不仅有用,而且利于理解。不 论是前沿的新技术,还是得以反复论证的经典套路,都让我感觉受益匪浅。 从授课配套设施上来看,OOAD 的 PPT 应该是在我学过的诸多课程中,算 是非常详细的了,深入浅出,图文并茂,并且能把代码和概念很好的结合起来, 加之在软院三年培养出来的学习能力,以及在软件工程课上对一些知识的初步了 解,让我对于 OOAD 的课件看起来觉得容易理解且非常直观。 这样的直观不仅体现在对课程的学习方面,在课后复习,课前预习阶段,这 样清楚的 PPT 也是一个很好的辅助手段。 最后是我们分组负责的项目,每一个人都要做一次 presentation,那么对于 做演讲的同学来说其实是一个很好的机会,能够切身的去学习那些知识,并通过 作 presentation 在向大家讲解一遍,加深了认识,多次重复的学习帮助大家掌 握某项知识。 5.1.3. 课程意见 首先,课堂练习是一种很有效的增强学习的手段。毋庸置疑,它非常有利于 巩固我在这节课上所学习的知识。对于一些不明白,不理解,或者理解不透彻的 地方,可以通过课堂练习进行进一步的理解或者是巩固。课堂练习也更让我容易 把握当天讲授知识的重点和难点内容,从而更加有针对性的进行学习。但是,老 师您让我们完成的课堂练习中,很多我都觉得没有什么必要去完成,因为我觉得 自己并不能从中收获什么。所以我建议老师,能够多做些有意思的练习,多于很 多可有可无的练习,尽量不要浪费时间。 其次, 我觉得应该在现有的基础上,在教学的多样性上进行进一步的挖掘。 应该说,作为一种当前最流行的编程模式,面向对象的思想之所以能得以越来越 多的应用,因为其较强的逻辑性和易学易懂,也将是越来越多的编程模式的最终 发展方向。作为软件学院的学生,还是希望对这种编程思想有更深入,更彻底的 理解。一些图文并茂等多种教学手段的引入,或许能让我对 OO 有比现在更加深 刻的认识。 六、 项目相关介绍