Spring3 MVC - 3到 Spring MVC框架简介

java2se200

贡献于2012-03-30

字数:0 关键词: Spring MVC Web框架

1 Spring3 MVC - 3 到 Spring MVC 框架简介 Spring3 MVC 框架简介 Spring MVC 是 Spring 的框架的 Web 组件。 它提供了丰富的功能,为建设强大的 Web 应用程序。 Spring MVC 框架的架构,并在这样的高度可配置的方式,每一块的逻辑和功能设计。 此外 Spring 可以毫不费 力地与其他流行的 Web 框架,如 Struts,WebWork 的,的 Java Server Faces 和 Tapestry 集成。 这 意味着,你甚至可以告诉 Spring 使用 Web 框架中的任何一个。 比 Spring 更不紧耦合的 servlet 或 JSP 向客户端呈现视图。 喜欢速度与其他视图技术集成,Freemarker 的,Excel 或 PDF 现在也有可能。 Spring3.0 MVC 系列 • 第 1 部分:到 Spring 3.0 MVC 框架简介 • 第 2 部分:在 Spring 3.0 MVC 创建 Hello World 应用程序 • 第 3 部分:在 Spring 3.0 MVC 的形式处理 • 第 4 部分:Spring3 MVC 的 Tiles Support 与 Eclipse 中的例子插件教程 • 第 5 部分:Spring3 MVC 的国际化及本地化教程与范例在 Eclipse • 第 6 部分:Spring3 MVC 示例教程 Spring 主题 • 第 7 部分:创建 Spring3 MVC Hibernate 3 的示例在 Eclipse 中使用 Maven 的 在 Spring Web MVC,你可以使用任何对象作为命令或表单支持对象,你不需要实现框架特定的接口或 基类。 Spring 的数据绑定是高度灵活的:例如,将验证错误类型不作为应用系统错误,可以通过评估 的不匹配。 因此,你不必重复你的业务对象的属性,简单的无类型的字符串,在表单对象仅仅是为了 处理无效的意见,或正确转换的字符串。 相反,它往往是最好直接绑定到业务对象。 请求处理生命周期 Spring 的 Web MVC 框架是,像许多其他 Web MVC 框架,要求为导向,围绕一个中心的 servlet,它把 请求分派给控制器,提供其他功能,有利于开发 Web 应用而设计的。 Spring DispatcherServlet DispatcherServlet 是 Spring IoC 容器完全集成,并允许我们使用的每一个 Spring 的其他功能。 2 以下是 Spring3.0 MVC 请求流程的生命周期: 客户端将请求发送到 Web 容器中的 HTTP 请求的形式。 这个传入的请求被截获由前端控制器 (DispatcherServlet 的),然后它会试图找出相应的处理程序映 射 。 帮助处理程序映射,DispatcherServlet 将请求派遣适当的控制器。 控制器尝试处理请求和 ModelAndView 实例的形式返回到前端控制器模型和视图对象。 前端控制器,然后试图解决咨询视图解析器对象的视图(可以是 JSP,FreeMarker 的,速度等) 。 选定的视图,然后返回到客户端呈现。 Spring3.0 的特点 • Spring3.0 框架支持 Java 5。 它提供了注释的配置支持。 Java 5 的功能,例如泛型,注解, 可以使用可变参数等在 Spring。 • 正在引进一种新的表达语言 The Spring 的表达语言规划环境地政局局长。 Spring 的表达式语 言可以使用,同时定义了基于 XML 和注释的 bean 定义。 • Spring3.0 框架支持 REST Web 服务。 • 数据格式可从来没有那么容易。 Spring 3.0 支持了注释的格式。 现在,我们可以使用@ DateFimeFormat(ISO = ISO.DATE)和@NumberFormat(样式= Spring.CURRENCY)标注 日期和货币格式转换。 • Spring3.0 已经开始支持 JPA 2.0 的。 配置 Spring 3.0 的 MVC 切入点的 Spring 3.0 MVC DispatcherServlet 。 DispatcherServlet 的是正常的 servlet 的类,它 HttpServlet HttpServlet 的的基类。 因此,我们需要在它 web.xml 配置。 example org.springframework.web.servlet.DispatcherServlet 1 example *.html 在上面的代码片断中,我们必须在 web.xml 中配置 DispatcherServlet 的。 请注意,我们已经映射*. HTML URL 模式,例如 DispatcherServlet 的。 因此,任何与*. HTML 模式的 URL 将调用 Spring MVC 的前端控制器。 3 一旦 DispatcherServlet 的初始化,它会查找一个文件名[servlet-name]-servlet.xml Web 应用程序的 WEB - INF 文件夹中。 在上面的例子中,将寻找所谓 example-servlet.xml servlet.xml 的框架。 请注意上面的架构图。 WebApplicationContext 上图中指定 ApplicationContext 平原扩展 Web 应用程 序所需的一些额外的功能。 在 WebApplicationContext 是能够解决的主题,它也与相应的 servlet 相关。 在 WebApplicationContext 在 ServletContext 中的约束,并通过对 RequestContextUtils 类的静态方法, 您可以随时查找在 WebApplicationContext。 继续 现在,我们有关的 Spring 3.0 MVC 框架,其生命周期架构的想法, 在接下来的部分中,我们将创建一 个工作 Spring3.0 的 Hello World 应用程序从头。 Spring3 MVC:在 Spring 3.0 MVC 创建 Hello World 应用程序 Spring3.0 MVC 系列的第 2 部分。 在以前的文章中,我们经历介绍的 Spring MVC 3.0 框架,其请求处 理生命周期和体系结构图。 在这篇文章中,让我们在 Spring MVC 3.0 创建一个简单的的 Hello World 应用程序。 对于创建的 Hello World 演示应用程序,我们将使用 Eclipse IDE 中。 我们需要的东西 之前,我们与我们的第一个 Hello World Struts 2 的示例开始,我们将需要一些工具。 1. JDK 1.5 以上( 下载 ) 2. 以上的 Tomcat 5.x 的或任何其他容器(Glassfish 的中,WebSphere,JBoss 的 ,在 Weblogic 等)( 下载 ) 3. Eclipse 的 3.2.x 中,它上面的( 下载 ) 4. Spring3.0 MVC JAR 文件:( 下载 )。 以下是此应用程序所需的 JAR 文件的清单。 o commons-logging-1.0.4.jar o jstl-1.2.jar o org.springframework.asm - 3.0.1.RELEASE - A.jar o org.springframework.beans - 3.0.1.RELEASE - A.jar 4 o org.springframework.context - 3.0.1.RELEASE - A.jar o org.springframework.core - 3.0.1.RELEASE - A.jar o org.springframework.expression - 3.0.1.RELEASE - A.jar o org.springframework.web.servlet - 3.0.1.RELEASE - A.jar o org.springframework.web - 3.0.1.RELEASE - A.jar 请注意,根据 Spring MVC 的当前版本,上述 jar 文件的版本号可能会改变。 我们的目标 我们的目标是创建一个基本的 Spring MVC 应用中使用最新的 3.0 版本。 将会有一个索引页,它会显示 一个链接”打招呼”给用户。 点击此链接,用户将被重定向到另一页打招呼 ,它会显示一条消息的”Hello World,Spring3.0!”。 入门 让我们开始我们的第一个 Spring3.0 基于 MVC 的应用程序。 打开 Eclipse 转到文件- >新建- >项目,然后选择动态 Web 项目中的新建项目向导屏幕。 5 选择动态 Web 项目后,按” 下一步”“ 。 6 写项目名称。 例如 Spring3MVC。 一旦做到这一点,选择目标运行时环境(如 Apache Tomcat 的 V6.0)。 这是在 Eclipse 环境中运行的项目。 在此之后按下 Finish。 一旦该项目被创建,您可以在 Project Explorer 中看到它的结构。 现在的 WebContent 所有所需的 JAR 文件>的 WEB - INF> lib 文件夹中复制。 创建此文件夹,如果它 不存在。 Spring 控制器类 我们需要一个 Spring MVC 控制器类,将处理该请求,并显示”Hello World”消息。 为此,我们将创建 一个包 net.viralpatel.spring3.controller 的源文件夹中。 这个包将包含控制器文件。 7 创建一个类叫做 HelloWorldController net.viralpatel.spring3.controller 包并复制到它下面的内容。 文件:net.viralpatel.spring3.controller.HelloWorldController package net.viralpatel.spring3.controller; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.servlet.ModelAndView; @Controller public class HelloWorldController { @RequestMapping(“/hello”) public ModelAndView helloWorld() { String message = “Hello World, Spring 3.0!”; return new ModelAndView(“hello”, “message”, message); } } 请注意,我们已经注明 HelloWorldController 类@Controller 和 7 号线和 10 @RequestMapping(“/hello”) 当春扫描我们的包,将其识别为一个处理请求的控制器 bean 这个 bean。 @RequestMapping 注解告 诉 Spring,这个控制器应该处理所有请求/ URL 路径打招呼开始。 这包括/hello/*和/hello.html 。 在 HelloWorld()方法返回 ModelAndView 对象。 ModelAndView 对象,试图解决一个名为”Hello” 和数据模型是被传递回浏览器,所以我们可以在 JSP 访问数据视图。 逻辑视图名称解析 为”/WEB-INF/jsp/hello.jsp” 我们将讨论这在短期内如何的”Hello”,这是在 ModelAndView 对象返回 的逻辑名称映射到路径/ WEB-INF/jsp/hello.jsp。 ModelAndView 对象还包含了一个关键的”消息”和价值的”Hello World,Spring3.0!”的消息。 这是数 据,我们通过我们的观点。 通常情况下,这将是一个价值形式的 Java bean 将包含要显示的数据我们 认为对象。 在这里,我们只是传递一个字符串。 这样的观点:创建 JSP 要显示 Hello World 消息,我们将创建一个 JSP。 请注意,这个 JSP 是创建文件夹/ WEB-INF/jsp。 创 建 hello.jsp 下 WEB-INF/jsp 目录,并复制以下内容进去。 文件:WEB-INF/jsp/hello.jsp Spring 3.0 MVC Series: Hello World - ViralPatel.net 8 ${message} 上面的 JSP 只显示一条消息,使用表达式${message} 。 请注意,”消息”的名称,我们在设置一个消 息字符串 ModelAndView 对象。 同时,我们也将需要一个 index.jsp 文件,这将是我们的应用程序的入口点。 创建一个 WebContent 文件夹下的文件在您的项目并复制以下内容的 index.jsp。 文件的 WebContent / index.jsp 的 Spring 3.0 MVC Series: Index - ViralPatel.net Say Hello Spring MVC 的映射 Web.xml 中 正如在以前的文章(Spring3.0 MVC)讨论,Spring MVC 应用的切入点将是在部署描述符(web.xml) 中定义的 Servlet。 因此,我们将定义在 web.xml 中的一个条目 org.springframework.web.servlet.DispatcherServlet org.springframework.web.servlet.DispatcherServlet 类。 打开 web.xml 文件,该文件是在 WEB - INF 文件夹,并复制粘贴下面的代码。 文件:WEB-INF/web.xml 中 Spring3MVC index.jsp spring 9 org.springframework.web.servlet.DispatcherServlet 1 spring *.html 上面的代码将在 web.xml 中映射 URL 模式*. HTML 的 DispatcherServlet。 另外请注意,我们已经定 义作为欢迎文件的 index.jsp。 这里有一点要注意标签在 web.xml 中的 servlet 的名称。 DispatcherServlet 的初始化 后,它会查找一个文件名[servlet-name]-servlet.xml Web 应用程序的 WEB - INF 文件夹中。 在这个 例子中,该框架将称为文件 spring-servlet.xml 寻找。 Spring 配置文件 The Spring - servlet.xml 中创建一个文件在 WEB - INF 文件夹,并复制到它下面的内容。 文件:WEB-INF/spring-servlet.xml 在上面的 XML 配置文件,我们已经定义了一个标记。 这将允许 Spring 载入 net.viralpatel.spring3.controller 从包中的所有组件和它的所有子包。 这将载入我们 10 HelloWorldController 类。 另外,我们定义一个 bean viewResolver 。 这个 bean 将解决意见,并添 加前缀字符串/ WEB-INF/jsp /以及后缀。JSP 在 ModelAndView 的观点。 请注意,我们已经在我们的 HelloWorldController 类,返回一个 ModelAndView 对象的视图名称的”Hello”。 这将是解决路径/ WEB-INF/jsp/hello.jsp。 这是所有 Folks 您可能需要运行的应用程序现在看到的结果。 我假设你已经在 Eclipse 中配置 Tomcat 的。 所有您需 要做的: 从”窗口”>“显示视图”>“服务器打开服务器视图。 在此视图中右键单击并选择 New> Server,并添加您 的服务器的详细信息。 要运行该项目,从 Project Explorer 中的项目名称上点击右键并选择>运行在服务器上运行(快捷键: ALT + SHIFT + X,R ) 下载源代码 点击这里下载源代码(9.05kb) 继续 在本教程中,我们创建了一个小型的 Hello World 应用程序,使用 Spring 3.0 MVC 框架。 此外,我们 了解了 Spring 的配置和喜欢不同@Controller @ @RequestMapping RequestMapping 的。 在下一篇 文章中,我们将看到它是多么容易使用 Spring 3.0 的 MVC 来处理表单数据。 Spring3 MVC:在 Spring 3.0 MVC 的处理形式 Spring3.0 MVC 系列的第 3 部分。 在以前的文章中,我们创建了一个在 Spring MVC 的 Hello World 应用程序。 我们俯身如何在 web.xml 中配置 Spring MVC 中,如何使用不同的注释,如@控制器,@ RequestMapping 的等在这篇文章中,让我们来看看如何处理在 Spring 3.0 MVC 的形式。 11 我们将利用我们在以前的文章中创建一个基本参考,并添加在它的形式的功能框架。 另外,我们创建 的应用程序将是一个联系人管理器应用程序。 我们的目标 我们的目标是创建基本的联系人管理器应用程序。 这个应用程序将有一个表格,从用户的详细联系方 式。 现在我们将只打印在日志中的细节。 我们将学习如何捕捉在 Spring3 MVC 的表单数据。 入门 让我们添加的接触形式,以 Spring3 MVC Hello World 应用程序。 打开 index.jsp 文件,并改变它,以 下列: 文件的 WebContent / index.jsp 的 上面的代码将重定向用户 contacts.html 页。 查看- contact.jsp 创建一个 JSP 文件,将显示联系表格给我们的用户。 文件:/的 WebContent / WEB - INF / JSP / contact.jsp <%@taglib uri=“http://www.springframework.org/tags/form” prefix=“form”%> Spring 3 MVC Series - Contact Manager 12

Contact Manager

First Name
Last Name
Email
Telephone
在这里,我们在上面的 JSP 显示的形式。 请注意的形式提交给 addContact.html 页。 在 Spring3 添加的表格和控制器 现在我们将添加在 The Spring 3 的逻辑显示的形式,并获取它的值。 为此,我们将创建两个 Java 文 件。 首先 Contact.java 这只不过是形式显示/检索从屏幕上的数据和 ContactController.java ContactController.java 这是 Spring 的控制器类。 13 文件:net.viralpatel.spring3.form.Contact package net.viralpatel.spring3.form; public class Contact { private String firstname; private String lastname; private String email; private String telephone; //.. getter and setter for all above fields. } 上述文件是从屏幕上的数据的接触形式持有。 请注意,我没有表现出 getter 和 setter 方法。 您可以按 ALT + SHIFT + S,R pressiong 这些方法产生。 文件:net.viralpatel.spring3.controller.ContactController package net.viralpatel.spring3.controller; import net.viralpatel.spring3.form.Contact; import org.springframework.stereotype.Controller; import org.springframework.validation.BindingResult; import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.SessionAttributes; import org.springframework.web.servlet.ModelAndView; @Controller @SessionAttributes public class ContactController { @RequestMapping(value = “/addContact”, method = RequestMethod.POST) public String addContact(@ModelAttribute(“contact”) Contact contact, BindingResult result) { System.out.println(“First Name:” + contact.getFirstname() + “Last Name:” + contact.getLastname()); return “redirect:contacts.html”; } @RequestMapping(“/contacts”) public ModelAndView showContacts() { return new ModelAndView(“contact”, “command”, new Contact()); } } 在上面的控制器类,请注意,我们已经创建了两个请求映射/联系人/ addContact 的方法。 方法 showContacts()时将调用用户对一个 URL contacts.html 的请求。 这种方法将呈现一个模型,名为” 接触”。 请注意 ModelAndView ModelAndView 对象,我们已经通过一个名为”命令”空白的联系对象。 14 Spring 框架预计 name 命令的对象,如果您使用 在你的 JSP 文件。 另外请注意, addContact()方法,我们有注明此 RequestMapping 的,并通过一个属性的方法 =“RequestMethod.POST” 。 因此,该方法将被调用,只有当用户生成一个 POST 方法请求 URL / addContact.html。 我们已经注明@ModelAttribute 与标注的参数联系。 这将结合从请求对象联系的 数据。 在此方法中,我们只印的名字和姓氏值和重定向的视图 cotnacts.html。 这是所有 Folks 现在的形式完成。 只要运行在 Eclipse 应用程序由 pression ALT + SHIFT + X,R。它将显示的联系表 格。 只需输入视图的值,然后按添加按钮。 一旦你按下按钮,它会打印 SYSOUT 日志的名字和姓氏。 下载源代码 点击这里下载源代码(7.43kb) 在这篇文章中,我们将学习如何创建一个表单,使用 The Spring 3 MVC,并显示在 JSP。 此外,我们 学会了如何检索使用 ModelAttribute 注解的形式值。 在下一节 ,我们将通过在 Spring3 MVC 的表单 验证和不同的数据转换方法。 Spring 3 MVC: Tiles Plugin Tutorial with Example in Eclipse Spring3.0 MVC 系列的第 4 部分。 在以前的文章中,我们看到了如何创建使用 Spring MVC 的表单, 并显示在 JSP。 同时,我们也了解注解@ModelAttribute 。 在这一部分,我们将讨论关于 Tiles 框架和它与 Spring 3.0 MVC 的集成。 我们将添加 Tiles Support 支持我们的 HelloWorld Spring 应用程序,我们在前面部分中创建的。 我强烈建议你去通过以前的文章 中和下载我们的示例应用程序的源代码。 Tiles Support2 15 如今,网站一般分为可重复使用的模板正在呈现不同的网页之间的的。 例如,一个网站中包含的页眉, 页脚,菜单等项目仍然通过了该网站相同,并给它一个共同的外观和感觉。 这是很难很难的代码在每 一个网页,如果以后需要改变是不是所有的页面需要修改。 因此,我们使用模板化机制。 我们创建一 个共同的页眉,页脚,菜单页,其中包括在每一页。 Tiles Support 插件允许模板和组件。 事实上,这两种机制是相似的:你定义页面的某些部分(a ”Tile”) 组装建立另一部分或整页。 A 部分参数,使动态内容,并且可以在 Java 语言中的一种方法。 Tiles 是 用来保持一致的外观和感觉整个 Web 应用程序的所有网页模板系统。 增加模板的可重用性和减少代码 重复。 是指在一个中央配置文件的网站的一个共同的布局,这种布局可以延长 Web 应用程序的所有网页。 我们的应用程序布局 我们的目标是我们的 Spring3 HelloWorld 应用程序添加页眉,页脚和菜单。 以下将是相同的布局。 所需的 jar 文件 为了增加 Tiles Support 到我们 Spring3 的应用程序的支持,我们将需要几个 jar 文件。 以下是在我们 的例子中的 JAR 名单。 在 WEB-INF/lib 文件夹中添加这些 JAR。 16 在上面的列表中突出显示的 jar 文件要在 Tiles Support 一体化项目增添了新的罐子。 在 Spring MVC 的配置 Tiles 框架 要配置 Tiles,an entry for bean TilesConfigure has to be made in spring-servlet.xml。 打开 WEB - INF 文件夹的 Spring- servlet.xml 中之 间添加以下代码 标记。 文件:/的 WebContent / WEB - INF /Spring- servlet.xml 中 org.springframework.web.servlet.view.tiles2.TilesView /WEB-INF/tiles.xml 输入配置文件/ WEB-INF/tiles.xml 是通过在上面的 bean 定义的参数。 这个文件包含了我们的 Web 应用程序的 Tiles 定义。 17 在 WEB - INF 文件夹,复制下面的代码创建的文件 tiles.xml。 文件:的 WebContent / WEB - INF 文件/ tiles.xml org.springframework.web.servlet.view.tiles2.TilesView /WEB-INF/tiles.xml 这里,tiles.xml 我们定义一个模板 base.definition。 此布局包含的头,标题,身体,菜单和页脚等属 性。 布局是那么的联系页面的扩展和新的定义。 我们已经覆盖默认的布局,并改变了机构和标题的内 容。 创建视图 - JSP 18 我们将定义为我们的 web 应用在所谓的 layout.jsp 一个 JSP 文件的模板。 此模板将包含网页的不同部 分(页眉,页脚,菜单等)。 创建 4 个新的 JSP 文件 layout.jsp,header.jsp 中,menu.jsp 和 footer.jsp 和复制以下内容在他们每个人。 文件的 WebContent / WEB - INF / JSP / layout.jsp <%@ taglib uri=“http://tiles.apache.org/tags-tiles” prefix=“tiles”%> <tiles:insertAttribute name=“title” ignore=“true” />
文件的 WebContent / WEB - INF / JSP / header.jsp 中

Header

文件的 WebContent / WEB - INF / JSP / menu.jsp

Menu

文件的 WebContent / WEB - INF / JSP / footer.jsp

Copyright © ViralPatel.net

这是所有 Folks 19 在 Eclipse 中编译和执行应用程序和看到的标题,菜单和页脚是正确运用。 下载源代码 点击这里下载源代码(8.88kb)。 今天,我们看到了我们如何使用 Spring MVC 应用程序配置 Tiles 框架。 我们在 bean 定义中使用 org.springframework.web.servlet.view.tiles2.TilesConfigurer 类”定义的 Tiles Support 配置文件。 在 接下来的部分我们将讨论有关国际化/本地化和增加其在 Spring3 MVC 的支持。 我希望你喜欢这篇文 章。 随意张贴您的查询,并在注释部分的意见。 Spring3 MVC:国际化和本地化教程示例 Spring3.0 MVC 系列的第 5 部分。 在以前的文章中,我们看到了如何使用 Spring MVC 应用程序配置 Tiles 框架。 我们使用 org.springframework.web.servlet.view.tiles2.TilesConfigurer bean 定义的类 定义 Tiles Support 的配置文件。 这个分裂我们的 HelloWorld Spring MVC 的应用部分,如页眉,页脚 等。 在这一部分,我们将讨论有关国际化(I18N)和本地化(L10N)的在 Spring 3.0 MVC。 我们将添加 L10N 我们的 HelloWorld Spring 应用程序,我们在本系列前面的教程中创建的 i18n 支持。 我强烈建议 你去通过以前的文章中和下载我们的示例应用程序的源代码。 20 什么是国际化和本地化? 在计算,国际化和本地化是计算机软件,以适应不同的语言和地区差异的手段。 国际化是设计的软件 应用程序,以便它可以适应在没有更改设计的情况下,以各种语言和地区的过程中。 本地化是适应一 个特定的地区或语言的国际化软件加入区域设置特定的组件和翻译文本的过程。 这两个术语经常缩写为 numeronyms I18N(其中 18 代表字母之间的第一次我在国际化的最后 n)和本 地化,由于长度的话。 L10N 资本大号帮助,以区别于小写我在 I18N。 我们的目标 我们的目标是到我们的 Spring MVC 应用添加国际化和本地化支持。 一旦完成,我们的应用程序看起来 像。 我们将添加两个我们的应用程序语言支持:英语和德语。 根据用户的浏览器的区域设置,将选择适当 的语言。 此外,用户将可以选择从右上角角落里的应用程序的语言。 消息 Resouces 文件 我们将创建两个属性的文件,其中将包含所有要在应用程序中显示的消息。 这些文件都保存在所谓的” 资源”源文件夹。 创建一个在您的项目的源文件夹,右键单击项目名称>“新建”>“源文件夹和名称资源。 21 创建两个文件 messages_en.properties 和 messages_de.properties 在此文件夹,并复制到它下面的 内容。 文件:资源/ messages_en.properties label.firstname=First Name label.lastname=Last Name label.email=Email label.telephone=Telephone label.addcontact=Add Contact label.menu=Menu label.title=Contact Manager label.footer=© ViralPatel.net 文件:资源/ messages_de.properties label.firstname=Vorname label.lastname=Familiename label.email=Email label.telephone=Telefon label.addcontact=Addieren Kontakt label.title=Kontakt Manager label.menu=Menü label.footer=© ViralPatel.net 在 Spring MVC 的配置国际化(i18n)/本地化(localization) 现在,我们已经创建了信息资源的属性,为我们的应用程序。 我们需要在 Spring 配置文件中声明这些 文件。 我们将使用类 org.springframework.context.support.ReloadableResourceBundleMessageSource 定义消息资源。 此外,请注意,我们将为您提供一个功能,用户将能够选择应用程序的语言。 这是通过使用 org.springframework.web.servlet.i18n.LocaleChangeInterceptor 类。 LocaleChangeInterceptor 类 将截获的语言环境中的任何变化。 这些变化,然后将其保存在未来要求的 Cookie org.springframework.web.servlet.i18n.CookieLocaleResolver org.springframework.web.servlet.i18n.CookieLocaleResolver 类将被用来存储在 cookie 中的语言环 境的变化。 Spring- servlet.xml 文件中添加下面的代码。 文件:的 WebContent / WEB - INF 文件/The Spring - servlet.xml 中 22 注意:在上述配置中,我们已经定义到 CLASSPATH messageSource bean 基名属性:消息。 受此 影响,Spring,将确定的消息资源讯息: 将被用于这个应用程序。 更改视图 - 的 JSP 现在,因为我们已经创建了两个消息资源文件和配置在 Spring MVC,我们将在 JSP 文件中使用这些消 息。 打开我们的演示应用程序的所有 JSP 文件,下面的代码更新。 文件的 WebContent / WEB - INF / JSP / header.jsp 中 <%@taglib uri="http://www.springframework.org/tags" prefix="spring"%>

en | de 文件的 WebContent / WEB - INF / JSP / menu.jsp <%@taglib uri="http://www.springframework.org/tags” prefix="spring”%>

文件的 WebContent / WEB - INF / JSP / contact.jsp 23 <%@taglib uri="http://www.springframework.org/tags" prefix="spring"%> <%@taglib uri="http://www.springframework.org/tags/form" prefix="form"%> Spring 3 MVC Series - Contact Manager

24
"/>
请注意,在上面的 JSP 中,我们 标签来显示从资源包的消息。 这里,我们必须注意的一件事情是,在 header.jsp 中的文件,我们已经指定了两个环节,选择语言。 LANG =链接设置请求参数? 当用户点击这个链接。 注意,Spring 标识使用此请求参数 LocaleChangeInterceptor 拦截和相应改变的地方。 另外请注意,在配置 LocaleChangeInterceptorThe Spring - servlet.xml 文件中,我们已经指定为”lang” property ” paramName” 因此 Spring 框架将寻找所谓的”郎”从请求参数。 这是所有 Folks 这是相当多:)我们只是增加了国际化和本地化支持,我们的演示 Spring 3.0 MVC 应用程序中。 所有 你所要做的的仅仅是执行在 Eclipse 的应用程序。 按 Alt + Shift + X,R。 25 下载源代码 点击这里下载源代码(10.2kb) 今天,我们看到如何添加到 Spring 3.0 基于 Web 应用程序国际化的国际化和本地化本地化支持。 我们 使用 LocaleChangeInterceptor 拦截的语言环境和 ReloadableResourceBundleMessageSource 类添 26 加消息资源属性的变化。 在接下来的部分我们将讨论在 Spring MVC,以及如何实现它的主题。 我希 望你喜欢这篇文章。 随意张贴您的查询,并在注释部分的意见。 Spring3 例 Spring 教程 MVC:主题 Spring3.0 MVC 系列的第 6 部。 在以前的文章中,我们看到了如何添加到 Spring 3.0 基于 Web 应用 程序国际化的国际化和本地化本地化支持。 我们使用 LocaleChangeInterceptor 拦截的语言环境和 ReloadableResourceBundleMessageSource 类添加消息资源属性的变化。 在这一部分,我们将看到如何在 Spring MVC 中添加主题。 我们将创建三个不同的主题,并在我们的 HelloWorldSpring 项目中添加功能,用户可以选择任何可用的主题。 一旦用户选择了一个主题,我们 可以在 Cookie 中保存它,以便它可以在不同的会话之间持久。 在 Spring MVC 主题简介 主题是静态资源,典型的样式表和图像,影响视觉风格的应用程序的集合。 我们可以申请的 Spring Web MVC 框架的主题设置的整体外观和感觉应用,从而提高用户体验。 在您的 Web 应用程序要使用的主题,您必须设置的 org.springframework.ui.context.ThemeSource 接 口的一个实现。 在 WebApplicationContext 接口扩展 ThemeSource 但其职责委托一个专门的实施。 默 认情况下,委托将 org.springframework.ui.context.support.ResourceBundleThemeSource 实施,从 classpath 的根目录加载的属性文件。 要使用一个自定义的 ThemeSource 实现或配置的 ResourceBundleThemeSource 基地名称的前缀,你可以注册一个保留名称 themeSource 的应用程序 上下文的 bean。 Web 应用程序上下文自动检测与这个名字的 bean,并使用它。 当使用 ResourceBundleThemeSource,主题是指在一个简单的属性文件。 属性文件中列出的资源, 弥补主题。 下面是一个例子: 我们的目标 27 我们的目标是要改变的 Hello World 春 3 MVC 的主题支持。 用户将有 3 预定义的主题(默认情况下, 黑色和蓝色)的选项来选择主题。 Spring3 MVC 添加主题支持 让我们配置 Spring3 MVC 应用程序中添加主题支持。 为此,我们将下面的代码添加到 The Spring - servlet.xml 文件。 文件:的 WebContent / WEB - INF 文件/The Spring - servlet.xml 中 在上述配置中,首先我们必须增加 themeSource bean 。 请注意,这个 bean 是一个类 ResourceBundleThemeSource 实例 ResourceBundleThemeSource,我们也有指定的属性与价值”为 主题的 “ basenamePrefix。 ResourceBundleThemeSource 类加载的属性文件包含前缀开始”为主题 的主题定义”。 因此,如果我们定义了 3 个新主题在我们的项目(默认情况下,黑色和蓝色),然后我 们将创建 3 个属性文件,同时将有一定的配置属性。 此外,这些文件将被划归项目的类路径。 接下来,我们定义了一个拦截器,这是一个类的实例 org.springframework.web.servlet.theme.ThemeChangeInterceptor bean themeChangeInterceptor 。 另外请注意在这里,我们已经指定的属性 PARAMNAME 与价值主题 。 每 当一个请求参数具有不同价值观的”主题”,这个拦截器被调用。 一旦 themeChangeInterceptor 拦截主题的变化,这些变化,然后将其存储在使用类 org.springframework.web.servlet.theme.CookieThemeResolver 饼干 org.springframework.web.servlet.theme.CookieThemeResolver。 我们已经在我们的 Spring- servlet.xml 的配置文件配置这个类。 另外请注意,我们已经指定这个 bean 的默认主题名称。 现在,创建以下资源/项目文件夹的属性文件。 29 文件:资源/主题 default.properties css=themes/default.css 文件:资源/主题 blue.properties css=themes/blue.css 文件:资源/主题 black.properties css=themes/black.css 针对不同主题的 CSS 样式表 让我们创建 CSS 样式表将作为我们项目的主题文件。 创建以下文件夹中的 WebContent /主题的 CSS 文件。 文件的 WebContent /主题/是 default.css body { background-color: white; color: black; 30 } 文件的 WebContent /主题/ blue.css body { background-color: #DBF5FF; color: #007AAB; } 文件的 WebContent /主题/ black.css body { background-color: #888; color: white; } JSP 视图的变化 我们几乎完成剩余的变化和最后一位的是增加一个功能,为用户选择从 UI 的主题。 为此,我们将改变 header.jsp 中的文件,并添加不同主题的 3 个环节。 用户可以点击此链接的任何改变 web 应用的主题。 文件的 WebContent / WEB - INF / JSP / header.jsp 中 <%@taglib uri="http://www.springframework.org/tags" prefix="spring"%> <%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>

en | de def | blk | blu 请注意,在上面的 JSP 的变化中,我们创建了带参数的 3 个环节”?主题=“。 因此,每当用户点击这些 链接,将通过一个新的参数的要求与相应的主题。 Spring 的请求拦截器会取这个值,并相应地改变主 题。 这是所有 Folks 31 这是相当多吧:)我们刚刚添加主题支持我们的演示的 Spring 3.0 MVC 应用程序。 所有你所要做的的 仅仅是执行在 Eclipse 的应用程序。 按 Alt + Shift + X,R。 下载源代码 点击这里下载源代码(21KB,邮编) 创建 Spring3 MVC Hibernate 3 的示例在 Eclipse 中使用 Maven 的 让我们做一个完整的终端到终端的应用程序使用 Spring3.0 MVC 前端技术和 Hibernate 作为后端 ORM 技术。 对于这种应用,我们也将作为数据库使用 Maven 来坚持数据构建和依赖管理和 MySQL。 该应用程序将是一个简单的联系人管理器的应用程序,这将允许用户添加新的联系人。 将显示联系人 列表中,用户将可以删除现有的联系人。 我们的目标 正如上面描述的,我们的目标是创建一个联系人管理器应用程序,这将允许用户添加联系人,或将其删 除。 联系人管理应用程序的基本要求是: 1. 在联系人列表中添加新的联系人。 2. 从联系人列表中显示所有联系人。 3. 从联系人列表中删除联系人。 32 以下是最终应用的截图。 应用程序体系结构 我们将有一个为我们的演示应用程序的分层架构。 该数据库将被普遍称为 DAO 层的数据访问层的访问。 这一层将使用 Hibernate API 来与数据库交互。 DAO 层将调用一个服务层。 在我们的应用程序中,我 33 们将有一个服务接口称为 ContactService。 入门 对于我们的联系人管理器的例子,我们将使用 MySQL 数据库。 在任何 MySQL 数据库创建一个表接触。 这是非常初步的例子,因此,我们有最低的列代表联系。 随意延长这个例子中,创建一个更复杂的应 用程序。 CREATE TABLE CONTACTS ( id INT PRIMARY KEY AUTO_INCREMENT, firstname VARCHAR(30), lastname VARCHAR(30), telephone VARCHAR(15), email VARCHAR(30), created TIMESTAMP DEFAULT NOW() ); 在 Eclipse 中创建工程 联系人管理器应用程序将使用 Maven 的构建和依赖管理。 为此,我们将使用 Eclipse 中的 Maven 的动 态 Web 项目作为我们的应用程序的基础架构。 下载下面的源代码: Maven 的动态 Web 项目 (6.7 KB) 34 解压缩到您的硬盘驱动器和源代码导入 Eclipse 项目。 一旦该项目是在 Eclipse 中导入,我们将创建一 个 Java 源代码的包结构。 src /主/ Java 的文件夹下创建以下软件包。 • net.viralpatel.contact.controller -这个包将包含联系人管理器应用程序的 Spring 控制器类。 • net.viralpatel.contact.form -这个包将包含形式为 Contact Manager 应用程序的对象。 联系 的形式将一个简单的 POJO 类的不同属性,如名字,姓氏等。 • net.viralpatel.contact.service -这个包将包含我们的联系人管理器应用程序服务层的代码。 服 务层将有一个 ContactService 接口和相应的实现类 • net.viralpatel.contact.dao -这是 Contact Manager 应用程序的 DAO 层。 它由 ContactDAO 接口和相应的实现类。 DAO 层使用 Hibernate API 来与数据库交互。 实体类 - Hibernate 的域类 让我们先从 Contact Manager 应用程序的编码。 首先,我们将创建一个表单对象或 Hibernate 的 POJO 类来存储联系人信息。 这个类将是一个实体类,将与联系人数据库表联系起来。 net.viralpatel.contact.form 包和复制下面的代码下创建一个 Java 类 Contact.java。 文件:src /主/ JAVA / NET / viralpatel /联系方式/形式/ Contact.java package net.viralpatel.contact.form; 35 import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.Id; import javax.persistence.Table; @Entity @Table(name="CONTACTS") public class Contact { @Id @Column(name="ID") @GeneratedValue private Integer id; @Column(name="FIRSTNAME") private String firstname; @Column(name="LASTNAME") private String lastname; @Column(name="EMAIL") private String email; @Column(name="TELEPHONE") private String telephone; public String getEmail() { return email; } public String getTelephone() { return telephone; } public void setEmail(String email) { this.email = email; } public void setTelephone(String telephone) { this.telephone = telephone; } public String getFirstname() { return firstname; } public String getLastname() { 36 return lastname; } public void setFirstname(String firstname) { this.firstname = firstname; } public void setLastname(String lastname) { this.lastname = lastname; } public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } } 你会注意到的第一件事情是,import 语句导入 javax.persistence,而不是一个 Hibernate 或者 Spring 包。 与 Spring 中使用 Hibernate,标准的 JPA 注解很好的工作,这就是我这里使用。 • 首先,我们已经注明@Entity 实体,它告诉 Hibernate 这个类表示一个对象,我们可以坚持。 • @Table(name = “CONTACTS”)注解告诉 Hibernate 的表在这个类中的地图属 性。 在这一类 的第 16 行的第一个属性是我们的对象 ID 将是独一无二的,持续的所有事件。 这是为什么我们 带有@Id 。 • @GeneratedValue 批注说,这个值将确定源代码。 • @Column(name = “FIRSTNAME”)注解是用来映射在 Contacts 表中的这个属性 FirstName 列。 数据访问(DAO)层 Contact Manager 应用程序的 DAO 层包括一个 ContactDAO ContactDAO 和相应的 ContactDAOImpl 类 ContactDAOImpl。 创建以下 Java 中的文件 net.viralpatel.contact.dao 包。 文件:src /主/ JAVA / NET / viralpatel /联系我们/ DAO / ContactDAO.java package net.viralpatel.contact.dao; import java.util.List; import net.viralpatel.contact.form.Contact; public interface ContactDAO { public void addContact(Contact contact); public List listContact(); public void removeContact(Integer id); } 37 文件:src /主/ JAVA / NET / viralpatel /联系我们/ DAO / ContactDAOImpl.java package net.viralpatel.contact.dao; import java.util.List; import net.viralpatel.contact.form.Contact; import org.hibernate.SessionFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Repository; @Repository public class ContactDAOImpl implements ContactDAO { @Autowired private SessionFactory sessionFactory; public void addContact(Contact contact) { sessionFactory.getCurrentSession().save(contact); } public List listContact() { return sessionFactory.getCurrentSession().createQuery(“from Contact”) .list(); } public void removeContact(Integer id) { Contact contact = (Contact) sessionFactory.getCurrentSession().load( Contact.class, id); if (null != contact) { sessionFactory.getCurrentSession().delete(contact); } } } 在上面的代码的 DAO ContactDAOImpl ContactDAOImpl 实现数据访问 ContactDAO 接口 ContactDAO 定义方法 listContact() ( addContact() ()等,以从数据库中访问数据。 请注意,我们已经使用了两个@Repository @ @Autowired Autowired 进行。 带注释的标记类是由 Spring 使用基于注解的配置和 Classpath 扫描时,自动检测的候选人。 @Component 注解是主要的刻板印象,表明一个被注解的类是一个”组件”。 38 @Repository 注解,另一个是在 Spring 2.0 中引入的刻板印象。 这个注解是用来表明,作为一个仓库 一类的功能和需要有异常转换应用透明就可以了。 异常翻译的好处是,服务层只有从 Spring 的 DataAccessException 体系的例外处理,即使使用纯 JPA 的 DAO 类。 在 ContactDAOImpl 使用的另一种注解@Autowired 。 这是用来自动装配上的 SessionFactory ContactDAOImpl 的依赖。 服务层 联系人管理器的应用服务层组成的接口 ContactService 和相应的实现类 ContactServiceImpl。 创建下 面的 Java 文件 net.viralpatel.contact.service 包。 文件:src /主/ JAVA / NET / viralpatel /联系我们/服务/ ContactService.java package net.viralpatel.contact.service; import java.util.List; import net.viralpatel.contact.form.Contact; public interface ContactService { public void addContact(Contact contact); public List listContact(); public void removeContact(Integer id); } 文件:src /主/ JAVA / NET / viralpatel /联系我们/服务/ ContactServiceImpl.java package net.viralpatel.contact.service; import java.util.List; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import net.viralpatel.contact.dao.ContactDAO; import net.viralpatel.contact.form.Contact; @Service public class ContactServiceImpl implements ContactService { @Autowired private ContactDAO contactDAO; 39 @Transactional public void addContact(Contact contact) { contactDAO.addContact(contact); } @Transactional public List listContact() { return contactDAO.listContact(); } @Transactional public void removeContact(Integer id) { contactDAO.removeContact(id); } } 在上述服务层的代码,我们创建了一个接口 ContactService ,并在课堂上 ContactServiceImpl ContactServiceImpl 。 请注意,我们使用一些如春@Service @ @Autowired @Transactional @ Transactional 在我们的代码。 这些注解被称为春典型化注解。 用于装饰 ContactServiceImpl 类@Service 的刻板印象注释是一个专门@Component 注解的形式。 这 是适当的注释与服务层中@Service @服务,以方便工具的处理或预测任何未来服务的特定功能,可能 被添加到这个注解。 添加 Spring MVC 的支持 让我们添加到我们的 Web 应用程序的 Spring MVC 的支持。 更新 web.xml 文件,并添加 org.springframework.web.servlet.DispatcherServlet servlet 映射。 另外 请注意,我们已制订与 URL / springServlet,所以所有的请求处理的 Spring。 文件:/ src 目录/ webapp 的/ WEB - INF 目录/ web.xml 中 Spring3-Hibernate list.html 40 spring org.springframework.web.servlet.DispatcherServlet 1 spring / 一旦在 web.xml 配置,让我们在/ src 目录/主/ webapp 的/ WEB - INF 文件夹中添加- servlet.xml 的 Spring 和 jdbc.properties 文件。 文件:/ SRC /主/ webapp 的/ WEB - INF 目录/ jdbc.properties jdbc.driverClassName= com.mysql.jdbc.Driver jdbc.dialect=org.hibernate.dialect.MySQLDialect jdbc.databaseurl=jdbc:mysql://localhost:3306/ContactManager jdbc.username=root jdbc.password=testpass jdbc.properties 文件包含数据库连接信息,例如数据库 URL,用户名,密码,驱动程序类。 如果你不 使用 MySQL,你可能要编辑的 DriverClass 和其他数据库的方言。 文件:/ SRC /主/ webapp 的/ WEB - INF /Spring- servlet.xml 中 classpath:hibernate.cfg.xml org.hibernate.cfg.AnnotationConfiguration 42 ${jdbc.dialect} true Spring- servlet.xml 文件中包含不同的 The Spring ,如事务管理器,Hibernate 会话的工厂 bean,数 据源等映射 • jspViewResolver This bean -这个 bean 定义的视图解析器 Spring MVC 的。 对于这个 bean, 我们也设置为”/ / WEB-INF/jsp”作为”。jsp”为后缀的前缀。 因此 The Spring 自动解析 WEB-INF/jsp 文件夹,并分配后缀 JSP。JSP 来。 • messageSource bean -提供国际化,我们的演示应用程序中,我们定义束资源属性文件,要求 在 CLASSPATH 中的 messages.properties。 在 Spring MVC 相关: 国际化 • propertyConfigurer 绿 bean -这个 bean 是用来装载数据库属性文件 jdbc.properties。 这是 Hibernate 中的连接设置使用的文件存储在数据库连接的详细信息。 • 数据源 bean -这是 Java 的数据源连接到联系人管理器数据库。 我们提供的 JDBC 驱动程序类, 用户名,密码等配置。 • SessionFactory 的 bean -这是我们定义 Hibernate 配置不同的休眠设置。 hibernate.cfg.xml 中设置一个配置文件,其中包含实体类的映射 • TransactionManager 的绿 bean -我们使用 Hibernate 事务管理器来管理我们的联系人管理器 应用程序的交易。 文件:/ SRC /主要/资源/ hibernate.cfg.xml 中 43 文件:/ src /主/资源/ messages_en.properties label.firstname=First Name label.lastname=Last Name label.email=Email label.telephone=Telephone label.addcontact=Add Contact label.menu=Menu label.title=Contact Manager label.footer=© ViralPatel.net Spring MVC 的控制器 我们几乎完成了我们的应用程序。 只需添加下面的 Spring 控制器类 ContactController.java net.viralpatel.contact.controller 包。 文件:/ src /主/ JAVA / NET / viralpatel /联系我们/控制器/ ContactController.java package net.viralpatel.contact.controller; import java.util.Map; import net.viralpatel.contact.form.Contact; import net.viralpatel.contact.service.ContactService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.validation.BindingResult; import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; @Controller public class ContactController { @Autowired private ContactService contactService; @RequestMapping("/index") public String listContacts(Map map) { map.put("contact", new Contact()); map.put("contactList", contactService.listContact()); 44 return "contact"; } @RequestMapping(value = "/add", method = RequestMethod.POST) public String addContact(@ModelAttribute("contact") Contact contact, BindingResult result) { contactService.addContact(contact); return "redirect:/index"; } @RequestMapping("/delete/{contactId}") public String deleteContact(@PathVariable("contactId") Integer contactId) { contactService.removeContact(contactId); return "redirect:/index"; } } The Spring 控制器定义了三种方法来操纵 Contact Manager 应用程序。 • listContacts 方法-该方法使用服务接口 ContactServer 来获取我们的应用程序中的所有详细联 系方式。 它返回一个接触数组。 请注意,我们已经请求映射”/指数”,以这种方法。 因此,Spring 会自动调用此方法,每当遇到这个 URL 请求中。 • addContact 方法-这种方法增加了一个新的联系人,联系人列表。 获取详细联系方式 Contact 使用对象@ModelAttribute 注解。 另外请注意,请求”/添加”映射使用此方法。 请求的方法也 应发表。 在接触使用列表添加 ContactService 一旦接触,我们重定向到/索引页,再调用 listContacts()方法以显示到用户的联系人列表。 相关: 在 Spring MVC 的表单 • deleteContact 方法-这种方法将删除从联系人列表中的联系人。 类似的以这种方法也 addContact 重定向用户/索引页,一旦接触被删除。 要注意在这个方法是我们所请求的 URL 映射使用@ RequestMapping 注解的方式。 网址”/ / {的 ContactID}”映射因此,每当用户发 送一个请求/ delete/12,删除,deleteCotact 方法将尝试删除接触与 ID:12。 最后添加下面的 JSP 文件到 WEB-INF/jsp 文件夹。 文件:/ SRC /主/ webapp 的/ WEB - INF / JSP / contact.jsp <%@taglib uri=“http://www.springframework.org/tags” prefix=“spring”%> <%@taglib uri=“http://www.springframework.org/tags/form” prefix=“form”%> <%@taglib uri=“http://java.sun.com/jsp/jstl/core” prefix=“c”%> 45 Spring 3 MVC Series - Contact Manager | viralpatel.net

Contact Manager

“/>

Contacts

46
Name EmailTelephone  
${contact.lastname}, ${contact.firstname} ${contact.email} ${contact.telephone} delete
下载源代码 点击这里下载 Contact Manager 应用程序的完整的源代码(16 KB ) 这是所有 Folks 47 编译并执行在 Eclipse 中的联系人管理器应用程序。 在 Spring3 MVC 和 Hibernate 保存/ Retreving BLOB 对象 使用 BLOB / CLOB 数据类型在数据库中的某个时候一个简单的任务。 我发现,特别是与 Hibernate 3 的工作时,存储和检索 BLOB 对象,我们需要照顾的某些事情。 让我们看到了一个教程,我们将使用 Spring 3 MVC 和 Hibernate 3 的存储和检索数据库中的 BLOB 对象。 我们的目标 我们的目标是创建一个在 Spring3 MVC 和 Hibernate 的文档管理应用程序。 以下是功能。 1. 与领域,如文件名称,描述和浏览按钮选择文件系统的文件的主要页面上显示窗体。 2. 从本地驱动器,用户可以选择任何文件,并上传使用保存文件的功能相同。 3. 添加的所有文件保存在一个数据库表。 4. 目前数据库中的所有文件列表显示在主页上。 5. 列表中的每个文件有两个按钮:删除和下载。 6. 点击下载按钮,可以对任何文件下载。 7. 点击删除按钮,可以删除任何文件。 48 这里是最后文件管理器应用程序的屏幕截图。 第 1 步:创建数据库表 文件管理器应用程序,我们将使用 MySQL 数据库。 在 MySQL 数据库 docdb 中创建表文件。 这是非 常初步的例子,因此我们有最低的列代表一个文档。 随意延长这个例子中,创建一个更复杂的应用程 序。 CREATE DATABASE 'docdb'; USE 'docdb'; CREATE TABLE 'documents' ( 'id' int(11) NOT NULL AUTO_INCREMENT, 'name' varchar(200) NOT NULL, 'description' text NOT NULL, 'filename' varchar(200) NOT NULL, 'content' mediumblob NOT NULL, /* for ORACLE enter BLOB*/ 'content_type' varchar(255) NOT NULL, 'created' timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY ('id') ); 第 2 步:在 Eclipse 中创建 Maven 项目 文档管理器应用程序将使用 Maven 的构建和依赖管理。 为此,我们将使用 Eclipse 中的 Maven 的动态 Web 项目作为我们的应用程序的基础架构。 49 或直接下载下面的源代码: Maven 的动态 Web 项目 (6.7 KB) 一旦导入/创建在 Eclipse 的 Maven 的 Web 项目。 Maven 的 pom.xml 文件复制到以下内容。 这些都 是我们将使用我们的文件管理器应用程序的依赖关系。 文件:/的 pom.xml 4.0.0 MavenWeb MavenWeb war 0.0.1-SNAPSHOT maven-compiler-plugin 1.5 1.5 maven-war-plugin 2.0 javax.servlet servlet-api 2.5 org.springframework spring-beans ${org.springframework.version} org.springframework spring-jdbc ${org.springframework.version} 50 org.springframework spring-web ${org.springframework.version} org.springframework spring-webmvc ${org.springframework.version} org.springframework spring-orm ${org.springframework.version} taglibs standard 1.1.2 javax.servlet jstl 1.1.2 org.hibernate hibernate-entitymanager 3.3.2.ga mysql mysql-connector-java 5.1.10 commons-dbcp commons-dbcp 20030825.184428 commons-pool commons-pool 1.5.4 51 commons-fileupload commons-fileupload 1.2.1 commons-io commons-io 1.3 3.0.2.RELEASE UTF-8 52 解压缩到您的硬盘驱动器和源代码导入 Eclipse 项目。 一旦该项目是在 Eclipse 中导入,我们将创建一 个 Java 源代码的包结构。 首先重命名项目 DocumentManager 和 src /主/ Java 的文件夹下创建以下 包。 1. net.viralpatel.docmanager.controller -这个包将包含文件管理器应用程序的 Spring 控制器类。 2. net.viralpatel.docmanager.model -这个包将包含文件管理器应用程序的表单对象。 文档模 型,将具有不同属性,如文件名称,说明,文件名等简单的 POJO 类 3. net.viralpatel.docmanager.dao -这是文件管理器应用程序的 DAO 层。 它由 DocumentDao 类将使用 Hibernate API 来与数据库交互。 4. 在 src /主要/资源文件夹,将 Hibernate 配置文件:hibernate.cfg.xml 中。 5. 在 WEB - INF 文件夹中的 JSP / documents.jsp 文件呈现文档列表和添加形式和 jdbc.properties 文件,其中包含数据库连接配置。 此外,它包含 The Spring - servlet.xml 中, 将定义所有的控制器类和 web.xml 包含 Spring 配置。 实体类 - Hibernate 的模型类 53 让我们先从文件管理器应用程序的编码。 首先,我们将创建一个模型对象或 Hibernate 的 POJO 类来 存储文件中的信息。 这个类将是一个实体类,将文件,数据库表链接。 创建一个 Java 类 Document.java net.viralpatel.docmanager.model 包和复制下面的代码下。 文件:/ src /主/ JAVA / NET / viralpatel / docmanager /模型/ Document.java package net.viralpatel.docmanager.model; import java.sql.Blob; import java.sql.Date; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.Id; import javax.persistence.Lob; import javax.persistence.Table; @Entity @Table(name="documents") public class Document { @Id @GeneratedValue @Column(name="id") private Integer id; @Column(name="name") private String name; @Column(name="description") private String description; @Column(name="filename") private String filename; @Column(name="content") @Lob private Blob content; @Column(name="content_type") private String contentType; @Column(name="created") private Date created; 54 //Getter and Setter methods } 你会注意到的第一件事情是,import 语句导入 javax.persistence,而不是一个 Hibernate 或者 Spring 包。 与 Spring 中使用 Hibernate,标准的 JPA 注解很好的工作,这就是我这里使用。 • 首先,我们已经注明@Entity 实体,它告诉 Hibernate 这个类表示一个对象,我们可以坚持。 • @Table(name = “documents”)注解告诉 Hibernate 的表映射在这个类的属性文件表。 在这一 类在第 20 行的第一个属性是我们的对象 ID 将是独一无二的,持续的所有事件。 这是为什么我 们带有@Id 。 • @GeneratedValue 批注说,这个值将确定源代码。 • @Column(name = “filename”)注释是使用这个属性映射到 DOCUMENTS 表中的文件名 列。 数据访问(DAO)层 文件管理器应用程序的 DAO 层组成的一类 DocumentDAO。 理想的解决方案将创建一个接口 (DocumentDAO)和其相应的实现类 DocumentDAOImpl。 但为简单起见,我们将创建只是正常的 DAO 类 DocumentDAO.java。 文件:src /主/ JAVA / NET / viralpatel / docmanager / DAO / DocumentDAO.java package net.viralpatel.docmanager.dao; import java.util.List; import net.viralpatel.docmanager.model.Document; import org.hibernate.HibernateException; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Repository; import org.springframework.transaction.annotation.Transactional; @Repository public class DocumentDAO { @Autowired private SessionFactory sessionFactory; @Transactional public void save(Document document) { Session session = sessionFactory.getCurrentSession(); session.save(document); 55 } @Transactional public List list() { Session session = sessionFactory.getCurrentSession(); List documents = null; try { documents = (List)session.createQuery(“from Document”).list(); } catch (HibernateException e) { e.printStackTrace(); } return documents; } @Transactional public Document get(Integer id) { Session session = sessionFactory.getCurrentSession(); return (Document)session.get(Document.class, id); } @Transactional public void remove(Integer id) { Session session = sessionFactory.getCurrentSession(); Document document = (Document)session.get(Document.class, id); session.delete(document); } } 方法: • list()方法-该方法获取存储在文件表中的所有文件的列表,并返回一个 Document 对象名单。 • save()方法-该方法是使用数据库存储到一个新的文档(包括 BLOB)。 • get()方法-该方法返回一个给定的 ID 从数据库文档的条目。 下载功能,用于从数据库中存储 的文件下载。 • remove()方法-该方法是使用一个特定的 ID 从数据库中删除的文件。 请注意,我们已经使用了两个@Repository @ @Autowired Autowired 进行。 带注释的标记类是由 Spring 使用基于注解的配置和 Classpath 扫描时,自动检测的候选人。 @Component 注解是主要的 刻板印象,表明一个被注解的类是一个”组件”。 56 @Repository 注解,另一个是在 Spring 2.0 中引入的刻板印象。 这个注解是用来表明,作为一个仓库 一类的功能和需要有异常转换应用透明就可以了。 异常翻译的好处是,服务层只有从 Spring 的 DataAccessException 体系的例外处理,即使使用纯 JPA 的 DAO 类。 在 DocumentDAO 使用的另一种注解@Autowired 。 这是用来自动装配 DocumentDAO SessionFactory 的依赖。 另外请注意,我们每个方法使用@ Transactional 注解。 理想情况下,DAO 层是从一个服务层和事务 管理的需要,在服务层指定的访问。 但同样为简单起见,我们将不包括在我们的例子中的服务层,直 接调用 DAO 层从 Spring 控制器。 再次,随意改变的执行情况,并添加您自己的服务层之间。 在 Spring MVC 和 Hibernate 的分层应用与服务的更多信息,阅读本教程。 Spring MVC 的休眠 Maven 的例子 Spring MVC 的支持添加到 WebApplication 的 让我们添加到我们的 Web 应用程序的 Spring MVC 的支持。 更新 web.xml 文件,并添加 org.springframework.web.servlet.DispatcherServlet servlet 映射。 另外 请注意,我们已制订与 URL / springServlet,所以所有的请求处理的 Spring。 文件:/ src 目录/ webapp 的/ WEB - INF 目录/ web.xml 中 DocumentManager index.html spring org.springframework.web.servlet.DispatcherServlet 1 spring *.html 57 一旦在 web.xml 配置,让我们在/ src 目录/主/ webapp 的/ WEB - INF 文件夹中添加- servlet.xml 的 Spring 和 jdbc.properties 文件。 文件:/ SRC /主/ webapp 的/ WEB - INF 目录/ jdbc.properties jdbc.driverClassName= com.mysql.jdbc.Driver jdbc.dialect=org.hibernate.dialect.MySQLDialect jdbc.databaseurl=jdbc:mysql://localhost:3306/docdb jdbc.username=root jdbc.password=password jdbc.properties 文件包含数据库连接信息,例如数据库 URL,用户名,密码,驱动程序类。 如果你不 使用 MySQL,你可能要编辑的 DriverClass 和其他数据库的方言。 文件:/ SRC /主/ webapp 的/ WEB - INF /Spring- servlet.xml 中 classpath:hibernate.cfg.xml org.hibernate.cfg.AnnotationConfiguration ${jdbc.dialect} true true 0 Spring- servlet.xml 文件中包含不同的 The Spring ,如事务管理器,Hibernate 会话的工厂 bean,数 据源等映射 • jspViewResolver 绿 bean -这个 bean 定义的视图解析器 Spring MVC 的。 对于这个 bean,我 们也设置为”/ / WEB-INF/jsp”作为”。jsp”为后缀的前缀。 因此 The Spring 自动解析 WEB-INF/jsp 文件夹,并分配后缀 JSP。JSP 来。 • propertyConfigurer 绿 bean -这个 bean 是用来装载数据库属性文件 jdbc.properties。 这是 Hibernate 中的连接设置使用的文件存储在数据库连接的详细信息。 • 数据源 bean -这是 Java 的数据源连接到文档管理数据库。 我们提供的 JDBC 驱动程序类,用 户名,密码等配置。 • SessionFactory 的 bean -这是我们定义 Hibernate 配置不同的休眠设置。 hibernate.cfg.xml 中设置一个配置文件,其中包含实体类映射。 另外请注意,在 SessionFactory 的,我们有指 定的几个 Hibernate 的属性, hibernate.connection.SetBigStringTryClob hibernate.connection.SetBigStringTryClob hibernate.jdbc.batch_size hibernate.jdbc.batch_size 。 这些是用来在 Hibernate 配置将 BLOB / CLOB 设置。 • 的 MultipartResolver 绿 bean -我们使用 Spring MVCS CommonsMultipartResolver。 这个解 析器将请求解决多重形式的数据,如文件上传和 Spring 控制器提供的文件对象。 请注意,我们 有指定 maxUploadSize 属性 maxUploadSize,价值千万。 这是在我们的例子中可以上传最大 的文件大小限制。 • TransactionManager 的绿 bean -我们使用 Hibernate 事务管理器来管理我们的文件管理器应 用程序的交易。 文件:/ SRC /主要/资源/ hibernate.cfg.xml 中 控制器 - Spring MVC 控制器类 我们几乎完成了我们的应用程序。 只需添加下面的 Spring 控制器类 DocumentController.java net.viralpatel.docmanager.controller 包。 文件:/ src /主/ JAVA / NET / viralpatel / docmanager /控制器/ DocumentController.java 60 package net.viralpatel.docmanager.controller; import java.io.IOException; import java.io.OutputStream; import java.sql.Blob; import java.sql.SQLException; import java.util.Map; import javax.servlet.http.HttpServletResponse; import net.viralpatel.docmanager.dao.DocumentDAO; import net.viralpatel.docmanager.model.Document; import org.apache.commons.io.IOUtils; import org.hibernate.Hibernate; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.multipart.MultipartFile; @Controller public class DocumentController { @Autowired private DocumentDAO documentDao; @RequestMapping(“/index”) public String index(Map map) { try { map.put(“document”, new Document()); map.put(“documentList”, documentDao.list()); }catch(Exception e) { e.printStackTrace(); } return “documents”; } @RequestMapping(value = “/save”, method = RequestMethod.POST) public String save( 61 @ModelAttribute(“document”) Document document, @RequestParam(“file”) MultipartFile file) { System.out.println(“Name:” + document.getName()); System.out.println(“Desc:” + document.getDescription()); System.out.println(“File:” + file.getName()); System.out.println(“ContentType:” + file.getContentType()); try { Blob blob = Hibernate.createBlob(file.getInputStream()); document.setFilename(file.getOriginalFilename()); document.setContent(blob); document.setContentType(file.getContentType()); } catch (IOException e) { e.printStackTrace(); } try { documentDao.save(document); } catch(Exception e) { e.printStackTrace(); } return “redirect:/index.html”; } @RequestMapping(“/download/{documentId}”) public String download(@PathVariable(“documentId”) Integer documentId, HttpServletResponse response) { Document doc = documentDao.get(documentId); try { response.setHeader(“Content-Disposition”, “inline;filename=\”“ +doc.getFilename()+ “\”“); OutputStream out = response.getOutputStream(); response.setContentType(doc.getContentType()); IOUtils.copy(doc.getContent().getBinaryStream(), out); out.flush(); out.close(); } catch (IOException e) { e.printStackTrace(); } catch (SQLException e) { 62 e.printStackTrace(); } return null; } @RequestMapping(“/remove/{documentId}”) public String remove(@PathVariable(“documentId”) Integer documentId) { documentDao.remove(documentId); return “redirect:/index.html”; } } The Spring 控制器定义了四个方法来操作文件管理器应用程序。 • 索引方法-该方法使用列表()DocumentDAO 的方法来获取从数据库中的所有文件的列表。 请 注意,我们已经请求映射”/指数”,以这种方法。 因此,Spring 会自动调用此方法,每当遇到这 个 URL 请求中。 • 保存方法-这种方法增加了一个新的文件,文件清单。 获取该文件的细节,在文档中使用 @ModelAttribute @ ModelAttribute 注解。 另外请注意,请求”/保存”,用这种方法映射。 请 求的方法也应发表。 一旦该文件是在文件列表中添加,我们重定向到/ index.html 页面,这反 过来又调用 index()方法来显示文件列表给用户。 还有一点需要注意的是@RequestParam 。 我们 MultipartFile 对象使用@ RequestParam(”文件”)注释映射。 Spring 自动检测要求”文 件”的数据和地图 MultipartFile 对象。 这个对象是后来转换为 BLOB 对象,并在文件的内容设 置。 相关: 在 Spring MVC 的表单 • 下载方法-这种方法是用来下载所选的测试用例。 请注意,我们是从数据库使用 DAO 类和 THN 设置响应的数据流中获取文件的内容。 另外请注意,我们使用 response.setHeader()方法来设 置”Content-Disposition” 。 这将提高在浏览器中的另存为对话框,当用户尝试下载文件。 • 删除的方法-这种方法从文件清单中删除的文件。 类似的 save()这个方法也重定向用户/ index.html 页面,一旦该文件被删除。 在此方法中需要注意的一点是我们所请求的 URL 映射使 用@ RequestMapping 注解的方式。 网址”/删除/ {documentId}”映射从而每当用户发送一个 请求/ remove/12.html,remove 方法将尝试删除与身份证件:12。 最后添加下面的 JSP 文件到 WEB-INF/jsp 文件夹。 文件:/ SRC /主/ webapp 的/ WEB - INF / JSP / documents.jsp <%@taglib uri="http://www.springframework.org/tags" prefix="spring"%> <%@taglib uri="http://www.springframework.org/tags/form" prefix="form"%> <%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%> 63 Document Manager - viralpatel.net

Document Manager

Add new document

Name
Description
Document

Document List

64
Name Description  
${document.name}${document.description}
下载源代码 点击这里下载完整的源代码文件管理器应用程序(16 KB) 这是所有 Folks 编译并执行文件管理器应用程序在 Eclipse。 打开网址 http://localhost:8080/DocumentManager/index.html 65 另见: • Spring3 MVC:在 Spring 3.0 MVC 的处理形式 • 教程:创建 Spring3 MVC Hibernate 3 的示例在 Eclipse 中使用 Maven 的 • Spring3 例 Spring 教程 MVC:主题 • Spring3 MVC:国际化和本地化教程示例 • Spring3 MVC:Tiles Support 与示例插件在 Eclipse 教程 • Spring3 MVC:在 Spring 3.0 MVC 创建 Hello World 应用程序 • 如何实现主/详细信息的形式,使用 Spring Roo 的 • 教程:在 Spring3 MVC 和 Hibernate 保存/ Retreving BLOB 对象 以上翻译来自: http://viralpatel.net/blogs/2010/06/tutorial-spring-3-mvc-introduction-spring-mvc-framework.html Spring Roo 的:两个数据库配置 我见过很多时候, 一个 Spring Roo 的论坛经常问题。 现在的问题是”如何配置应用程序来处理这两个 数据库”。 当然,这是一个更充裕的 Spring Roo 的问题,由于它涉及 JPA 和 Spring 的持久性堆栈。 所以,我相 信这将是所有的 Spring 开发的社会,面对这样的问题感兴趣。 我假设读者是一些与 Spring Roo 的 familarity 的 Java 开发。 我将重点讨论如何去配置只。 对于如何 使用 Roo 的帮助,请访问 http://www.springsource.org/roo 。 Hands on the problem 我创建了解释设置以下最低 Roo 的项目(如图所示)。 我将修改的方式,每个实体将来自不同的独立 的数据库配置。 project --topLevelPackage org.pragmatikroo.twodb persistence setup --provider HIBERNATE --database MYSQL --userName --password --databaseName twodbone logging setup --level DEBUG --package PERSISTENCE entity --class ~.domain.DbOne field string --fieldName name entity --class ~.domain.DbTwo field string --fieldName name perform clean perform eclipse exit Database.properties 文件的原始 database.password= database.url=jdbc\:mysql\://localhost\:3306/twodb 66 database.username= database.driverClassName=com.mysql.jdbc.Driver Database.properties 文件的修改 database.password1= database.url1=jdbc\:mysql\://localhost\:3306/twodbone database.username1= database.password2= database.url2=jdbc\:mysql\://localhost\:3306/twodbtwo database.username2= database.driverClassName=com.mysql.jdbc.Driver 基本上,我有重复的代码,从袋鼠交付定义第二个数据库的原始文件。 这种模式将重复以及其他文件。 修改 persistence.xml 文件 org.hibernate.ejb.HibernatePersistence org.josean.twodb.domain.DbOne true org.hibernate.ejb.HibernatePersistence org.josean.twodb.domain.DbTwo true 67 我第二个数据库的持久化单元的代码复制并定义唯一的 ID 重要:添加在上面的代码所示。 暗示这个持久化单元处理的每个实体都包括在内。 applicationContext.xml 文件修改 68 同一进程的其他文件。 重复的,如图所示。 添加属性的 entityManagerFactory 的 bean 。 修改 web.xml 文件 Spring OpenEntityManagerInViewFilter1 org.springframework.orm.jpa.support.OpenEntityManagerInViewFilter entityManagerFactoryBeanName entityManagerFactory1 Spring OpenEntityManagerInViewFilter2 org.springframework.orm.jpa.support.OpenEntityManagerInViewFilter entityManagerFactoryBeanName entityManagerFactory2 这就是它!。 部署和测试应用就绪。 结论 我比较有兴趣的读者,特别是 Spring Roo 的开发人员,如何设置一个 Spring 的 web 应用程序来访问 第二个数据库的应用程序上下文。 Spring Roo 的自定义 Web MVC 用户界面的形式 还有,我喜欢从 Spring Roo 的许多功能: • 外壳是非常有效的一个有用的标签完成建设项目 • 往返是必不可少的,以保持同步代码 • 没有”不必要的抽象”代码生成令人耳目一新,虽然 1.1.2 版本可能会带来一些他们只是仅举几 例。 69 在列表的顶部,我把,我考虑的宝石冠:Tagx 库 JSP(X)的意见。 本文假定读者熟悉 Spring Roo 的 一些。 对于 Spring Roo 的更多信息,请访问其网站 http://www.springsource.org/roo。 简而言之 Tagx 图书馆 tagx 库是由 Web MVC 安装附加。 Spring Roo 的支架控制器和实体类的意见。 点击创建从 tagx 库的 组件。 请阅读参考文件 http://static.springsource.org/spring-roo/reference/html/base-web.html 一个完整的描述。 事不宜迟。 迷你型业务。 本文指的是在世界年鉴实施 JD 网站的形式。 世界年鉴是一个创建 Web 应用程序与 Spring Roo 的发展 实验组的成员。 展示网站的链接 https://pragmatikroo.org/showcases 。 的目的,是落实典型的 Web 的 CRUD 范围以外的发展要求。 这是工作的问题:我需要自定义 list.tagx 的组件来呈现国家的国旗图像。 通常,此组件呈现一个网格 内的字符串和数字。 轻松导航的形式将分页,如下图所示。 此功能提供了一个世界年鉴广场查看,此 外,我要附加导航到一个国家的详细信息页面的点击事件。 的形式提供了两种选择控制,使县过滤。 分页的形式和导航一个典型的 list.jspx 形式是相同的方式。 通 常情况下,Roo 的选择按钮与动作按钮。 在这种情况下,我删除和过滤作用是触发选择选择。 我没有 从头开始。 我只是调整 Roo 的生成的源代码。 袋鼠是伟大的!。 分页画廊表 70 下面是呈现标志国家画廊查看源代码。 这里有很多的定制。 但是你仍然可以看到原支架 Roo 的创建形 式的骨架。 画廊 JSPX 分页代码
接下来,我将向国家详细表格后,点击其国旗航行。 WorldAlmanac 集成以及容易谷歌地图。 这使得 国家的地图,使用其存储在数据库中的纬度/经度。 所有元素,共同创造一个很好的组合。 详细的国家表 73 详细的国家 JSPX 代码
这就是它! 结论 本文展示了一个定制的例子,使用最初创建由 Spring Roo 的 Web MVC 的附加脚手架开始的代码。 我 发现极具表现力和直观的 JSPX 符号。 tagx 库充裕,很容易扩展如果需要的话。 JSPX XML 文档,因 此,他们对健康验证。 我不得不说这开始感到厌烦我,而是很短的时间后,我习惯了,并开始喜欢它。 且不说形式错误检查的好处。 Spring Roo 的 Web MVC 的意见和他们的禁忌部分大量基于 JavaScript 和 Ajax 的交互式少。 不过, 我相信他们是在不同的 Web 开发项目和大量的市场,他们非常有用。 读者可以看到,外观和感觉一个 Roo 的创建应用程序可以完全改变,以满足任何 UI /网页设计要求。 此代码示例创建 Spring Roo 的 1.1.0.M1。 以上翻译: http://viralpatel.net/blogs/2011/02/spring-roo-customizing-web-mvc-ui-forms.html 其他参考: http://viralpatel.net/blogs/2011/02/spring-roo-save-read-blob-object-spring-roo-tutorial.html http://viralpatel.net/blogs/2011/01/spring-roo-implement-masterdetail-forms.html 77 Spring 3.0 新增特性与功能前瞻(1) Java SE 与 Java EE 支持 现在的 Spring Framework 基于 Java 5,并且完全支持 Java 6。而且,它兼容 J2EE 1.4 及 Java EE 5,同时还引入了一些对 Java EE 6 的早期支持。 1、Java 5 为了利用 Java 5 特性,例如泛型、可变参数和其他语言改进,整个框架的代码都被修改过 了。我们尽可能地保证代码能够向后兼容。我们现在一致使用的泛型 Collection 和 Map, 一致使用泛型 FactoryBean,并且在 Spring AOP API 中有一致的桥接方法解析。泛型 ApplicationListener 只会自动接收特定的事件类型。所有的回调接口,例如 TransactionCallback 和 HibernateCallback,可以声明泛型结果值了。总而言之,Spring 的核心代码经过了彻底的修 改,并为 Java 5 做了优化。 为了与 Java 5 的 java.util.concurrent 机制紧密结合,Spring 的 TaskExecutor 抽象也被 修改过了。我们为 Callable 和 Future 提供了一流的支持,还有 ExecutorService 适配器、 ThreadFactory 集成等等。这些特性都尽可能与 JSR- 236(Concurrency Utilities for Java EE 6)保持一致。此外,针对通过新的@Async 注解(或者 EJB 3.1 的@Asynchronous 注解) 进行异步方法调用,我们也提供了相应的支持。 2、改进的文档 Spring 的参考文档也不断被更新着,这样它才能完整地反映 Spring 3.0 的变化和新特性。 尽管我们进了一切努力不在文档中犯错,但还是有些漏网之鱼。如果你发现了一些拼写错 误或者更严重的错误,并能在午餐时挤出点时间的 话,请将这些错误告诉 Spring 团队, 提个事件 就可以了。 3、新的入门教程 现在有了一份新的开发基础 Spring 3.0 MVC Web 应用程序的教程。这个教程是一份独立的 文档,你能在 Spring Documentation 页面中找到它。 注意:要到 Spring 3.0 正式发布时才能获得该文档。 4、新的模块组织结构和构建系统 我们修改了框架的模块,并用每个模块 jar 一棵源码树的方式分别进行管理: • org.springframework.aop • org.springframework.beans • org.springframework.context • org.springframework.context.support 78 • org.springframework.expression • org.springframework.instrument 从 Spring Web Flow 2.0 开始,我们使用了新的 Spring 构建系统。这给了我们: ◆基于 Ivy 的“Spring Build”系统 ◆一致的部署过程 ◆一致的依赖管理方式 ◆一致的 OSGi Manifest 生成方式 5、新特性概述 以下是 Spring 3.0 新特性的列表,我们稍后会更详细地介绍它们。 ◆Spring Expression Language ◆IoC 增强 / 基于 Java 的 Bean 元数据 ◆从 Spring Web Services 迁移过来的对象 / XML 映射功能(OXM) ◆全面的 REST 支持 ◆更多@MVC 注解 ◆声明式模型验证 ◆Java EE 6 早期支持 ◆嵌入式数据库支持 针对 Java 5 的核心 API 更新 BeanFactory 接口会尽可能地返回确定类型的 Bean 实例: ◆T getBean(String name, Class requiredType) ◆Map getBeansOfType(Class type) Spring 的 TaskExecutor 接口现在扩展了 java.util.concurrent.Executor 接口: 扩展了的 AsyncTaskExecutor 支持带 Future 的标准 Callable 新的基于 Java 5 的转换器 API 和 SPI: 79 ◆无状态的 ConversionService 和 Converter ◆取代标准 JDK PropertyEditor 指定类型的 ApplicationListener Spring Expression Language Spring 引入了一种表达式语言,它在语法上很像 Unified EL,但提供了更多功能。在定义 XML 和基于 注解的 Bean 定义的时候,可以使用该表达式语言,此外,它也是 Spring Portfolio 中表达式语言支持 的基础。该功能的详细信息请参考 Spring Expression Language(SpEL)一章。 Spring Expression Language 为 Spring 社区提供了一种能在所有 Spring Portfolio 产品中使用的、有 良好支持的表达式语言。它的语言特性是由 Spring Portfolio 中项目的需求来驱动的,其中也包含工具 的需求,例如,在基于 Eclipse 的 SpringSource Tool Suite 中的代码补全支持。 下面是一个例子,演示了如何用它来配置数据库属性。 bean> 如果你更喜欢用注解来配置你的组件,该功能也同样适用: @Repository public class RewardsTestDatabase { @Value("#{systemProperties.databaseName}") public void setDatabaseName(String dbName) { … } @Value("#{strategyBean.databaseKeyGenerator}") public voidsetKeyGenerator(KeyGenerator kg) { … } } 控制反转(Inversion of Control,IoC)容器 基于 Java 的 Bean 元数据 如今,Java Config 项目中的一些核心特性已经被添加到了 Spring Framework 项目中,这意味着现在 Spring 直接支持下面的这些注解了: ◆@Configuration 80 ◆@Bean ◆@Primary ◆@Lazy ◆@Import ◆@Value 以下是一个 Java 类使用新 JavaConfig 特性提供基本配置的例子: @Configuration public class AppConfig{ private @Value("#{jdbcProperties.url}") String jdbcUrl; private @Value("#{jdbcProperties.username}") String username; private @Value("#{jdbcProperties.password}") String password; @Bean public FooService fooService() { return new FooServiceImpl(fooRepository()); } @Bean public FooRepository fooRepository() { return new HibernateFooRepository(sessionFactory()); } @Bean public SessionFactory sessionFactory() { // wire up a session factory AnnotationSessionFactoryBean asFactoryBean = new AnnotationSessionFactoryBean(); asFactoryBean.setDataSource(dataSource()); // additional config return asFactoryBean.getObject(); } @Bean public DataSource dataSource() { return new DriverManagerDataSource(jdbcUrl, username, password); } } 81 要让上面的代码运行起来,你需要将如下组件扫描配置加入应用程序上下文 XML 文件中 在组件中定义 Bean 元数据 Spring 组件中也同样支持添加了@Bean 注解的方法,它们为容器提供了一个工厂 Bean。 数据层 对象 / XML 映射功能(OXM)已经从 Spring Web Services 项目迁移到核心 Spring Framework 中了,可以在 org.springframework.oxm 包中找到它。 Web 层 Web 层中最令人兴奋的新特性莫过于对构建 RESTful Web 服务和 Web 应用程序的支持了。此 外,还有一些用于 Web 应用程序中的新注解。 全面的 RESTful 支持 通过对现有的注解驱动 MVC Web 框架的扩展,Spring Framework 提供了构建 RESTful 应用 程序的服务器端支持。客户端的支持则由 RestTemplate 类提供,它和 JdbcTemplate、 JmsTemplate 这些模板类非常类似。无论是服务器端还是客户端的 REST 功能,都使用了 HttpConverter 来简化对象与对应的 HTTP 请 求/应答中的表述的转换。 MarshallingHttpMessageConverter 用到了之前提到的 OXM 功能。 更多@MVC 注解 新增了几个注解,例如@CookieValue 和@RequestHeaders。详见“使用@CookieValue 注解 映射 Cookie 值”和“用@RequestHeader 注解映射请求头属性”。 声明式模型验证 Hibernate Validator,JSR303 进行中,未包括在 Spring 3.0 M3 中。 Java EE 6 早期支持 我们提供了对使用@Async 注解(或 EJB 3.1 的@Asynchronous 注解)进行异步方法调用的 支持,还支持 JSF 2.0、JPA 2.0 等。 82 进行中,未包括在 Spring 3.0 M3 中。 支持嵌入式数据库 目前已经提供了对嵌入式 Java 数据库引擎的支持,包括 HSQL、H2 和 Derby。 【编辑推荐】 1. Spring 3.0 即将发布 新增 Spring 表达式语言 2. Spring 3.0 M3 发布 强化对标注的支持 3. 专家 Isvy 谈 Spring 3.0 4. 企业级 Java 云 SpringSource 云工厂初探 5. Spring 实例化 Bean 的三种方式

下载文档,方便阅读与编辑

文档的实际排版效果,会与网站的显示效果略有不同!!

需要 15 金币 [ 分享文档获得金币 ] 29 人已下载

下载文档

相关文档