教程:Hibernate,JPA和Spring MVC –第2部分

本教程将向您展示如何使用基本的Hibernate / JPA应用程序,如何将其转换为Spring MVC Web项目,以便能够在Web浏览器中查看数据库,以及最后使用Spring的@Transactional注释来减少样板代码。

本教程假定您熟悉Java和Maven,并且已经完成了本教程的第一部分 。 您还需要下载并安装Tomcat。

您可能希望从Github全新签出代码。

容器管理的数据源

我们需要修改或创建许多密钥文件,才能将第1部分中的代码转换为Web项目。 我们需要做的第一件事(假设您已经安装了Tomcat并在计算机环境中设置了CATALINA_HOME)是将JDBC配置移至Tomcat的配置,以便数据源由Tomcat管理,而不是通过编程方式进行管理,并且可以使用JNDI访问。

为此,请在$ CATALINA_HOME / conf / server.xml的GlobalNamingResources元素内添加以下行:

<Resource auth='Container' driverClassName='org.apache.derby.jdbc.EmbeddedDriver' maxActive='8' maxIdle='4' name='jdbc/tutorialDS' type='javax.sql.DataSource' url='jdbc:derby:tutorialDB;create=true' username='' password='' />

包含org.apache.derby.jdbc.EmbeddedDriver的jar必须可用于Tomcat。 获取jar的一种快速方法是从您的Maven本地存储库,例如〜/ .m2 / repository / org / apache / derby / derby / 10.4.1.3 / derby-10.4.1.3.jar。 将该文件复制到$ CATALINA_HOME / lib中,然后重新启动Tomcat,以确保没有错误。

这些更改将创建已部署的应用程序可以访问的数据源。 在Tomcat 7中,您可以在http:// localhost:8080 / manager / text / resources上查看托管资源 ; 您应该看到类似以下内容:

OK - Listed global resources of all types
jdbc/tutorialDS:org.apache.tomcat.dbcp.dbcp.BasicDataSource
UserDatabase:org.apache.catalina.users.MemoryUserDatabase

转换为Web项目

使用第1部分中的some项目,我们需要进行以下更改:

我们需要更改项目以生成Web存档,因此在pom.xml中添加以下内容:

<packaging>war</packaging>

您将想要(为了方便)在build部分中添加一行,以创建一个没有项目版本的.war:

<finalName>${project.artifactId}</finalName>

我们还需要Servlet API库:
<依赖性>

<groupId>javax.servlet</groupId><artifactId>servlet-api</artifactId><version>2.5</version><scope>provided</scope></dependency>

注意:“范围”是“提供的”,因为Tomcat已经具有内置的servlet库。

为了使数据源可用于应用程序,请使用以下几行创建src / main / webapp / META-INF / context.xml:

<Context><ResourceLink global='jdbc/tutorialDS' name='jdbc/tutorialDS' type='javax.sql.DataSource'/>
</Context>

这使得由Tomcat管理的数据源可用于我们的应用程序。 我们还需要src / main / webapp / WEB-INF / web.xml的存根:

<web-appxmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'xmlns='http://java.sun.com/xml/ns/javaee'xsi:schemaLocation='http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd'version='2.5'>
</web-app>

编译应用程序并将其部署到Tomcat。 此时您将看不到任何内容,因为没有servlet或页面。

可以让Maven为您构建并部署到Maven,或者您可以在大多数IDE中运行Tomcat。 在其他地方有很多关于此的文章,因此在此不做介绍。

添加Spring MVC

我们将为此使用Spring MVC,因此我们需要一些其他更改来支持这一点:

将以下依赖项添加到pom.xml中:

<dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>3.0.6.RELEASE</version></dependency>

我们要告诉Tomcat使用Spring来调度请求,因此我们需要在web.xml中添加以下几行:
<context-param>

<param-name>contextConfigLocation</param-name><param-value>/WEB-INF/mvc-dispatcher-servlet.xml</param-value></context-param><listener><listener-class>org.springframework.web.context.ContextLoaderListener</listener-class></listener><servlet><servlet-name>mvc-dispatcher</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><load-on-startup>1</load-on-startup></servlet><servlet-mapping><servlet-name>mvc-dispatcher</servlet-name><url-pattern>*.html</url-pattern></servlet-mapping>

这会将所有以'.html'结尾的页面的请求转发给Spring,Spring将选择适当的控制器来服务每个请求。 我们还需要为Spring Servlet创建一个应用程序上下文,并且必须存在于src / main / webapp / WEB-INF / mvc-dispatcher-servlet.xml中:

<?xml version='1.0' encoding='UTF-8'?>
<beans xmlns='http://www.springframework.org/schema/beans'xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'xmlns:context='http://www.springframework.org/schema/context'xsi:schemaLocation='http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsdhttp://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd'><context:component-scan base-package='tutorial'/><context:annotation-config/><bean class='org.springframework.web.servlet.view.InternalResourceViewResolver'><property name='prefix'><value>/WEB-INF/pages/</value></property><property name='suffix'><value>.jsp</value></property></bean></beans>

该XML有两件事:

  1. 它告诉Spring扫描软件包“ tutorial”中和其下的类,以查找标注为bean的类。
  2. 如何将视图名称转换为资源。 本质上,它说“使用名称,在名称前加上'/ WEB-INF / pages”,然后在结果后加上“ .jsp”。

您可能需要重新部署此产品以进行烟雾测试。

要对此进行测试,我们需要显示一个页面。 第一页将显示所有用户的列表。 我们需要两个文件; 第一个是服务请求的控制器:

package tutorial;import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;@Controller
public class UsersController {@RequestMapping('/users')public String users(Model model) {return 'users';}
}

第二项是要显示的页面。 这基于UsersController.users()返回的字符串,并使用资源解析器的规则,我们知道此文件必须为WEB-INF / pages / users.jsp。 创建页面的存根,如下所示:

<html>
<body>
<h1>Users</h1>
</body>
</html>

最后,您可以通过重新部署到Tomcat并使用浏览器查看http:// localhost:8080 / tutorial-hibernate-jpa / users.html进行测试 。

添加Spring ORM

Spring包含了将实体管理器注入bean的支持,这仅需要将几行代码添加到pom.xml和mvc-dispatcher-context.xml中:

<dependency><groupId>org.springframework</groupId><artifactId>spring-orm</artifactId><version>3.0.6.RELEASE</version></dependency>
<jee:jndi-lookup id='tutorialDS' jndi-name='java:/comp/env/jdbc/tutorialDS' expected-type='javax.sql.DataSource'/><bean id='entityManagerFactory' class='org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean'><property name='dataSource' ref='tutorialDS'/></bean>

“ jndi-lookup”元素从JNDI资源创建一个bean,并且由实体管理器工厂使用它来创建实体管理器。 其他JNDI对象也可以以此方式进行查找。

注意:您需要将XML名称空间和XSD添加到根元素:xmlns:jee ='http://www.springframework.org/schema/jee'。

最后,我们可以添加代码以将实体管理器注入到控制器中并从数据库中获取用户。

public class UsersController {@PersistenceContextprivate EntityManager entityManager;@RequestMapping('/users')public String users(Model model) {model.addAttribute('users', entityManager.createQuery('select u from User u').getResultList());return 'users';}
}

此代码使用实体管理器来获取所有用户,并将其绑定到一个名为“用户”的属性,该属性对于我们的JSP而言是可见的。

我们将要在页面上显示用户。 为此,我将使用JSTL。 您可以根据需要使用其他技术,如果没有,我会尽快为您提供所需的信息。 同样,如果您不熟悉的话,还有很多关于JSTL的优秀教程。 首先,向您添加另一个依赖项pom.xml:

<dependency><groupId>javax.servlet</groupId><artifactId>jstl</artifactId><version>1.2</version></dependency>

并更新users.html显示用户:

<%@ taglib prefix='c' uri='http://java.sun.com/jsp/jstl/core' %>
<html>
<body>
<h1>Users</h1>
<table><thead><tr><td>ID</td><td>Name</td></tr></thead><tbody><c:forEach var='user' items='${users}'><tr><td>${user.id}</td><td>${user.name}</td></tr></c:forEach></tbody>
</table>
</body>
</html>

最后,您可以在浏览器中进行抽烟测试。

@交易

难题的最后一步是创建用户。 为此,我们需要一种基本形式,例如,我已经创建了pages / create-user.jsp:

<html>
<body>
<h1>Create User</h1>
<form method='post'>
Name: <input name='name'/>
<input type='submit'/>
</form>
</body>
</html>

我们需要一个控制器来访问它,因此将其添加到UsersController中:

@RequestMapping(value = '/create-user', method = RequestMethod.GET)publicString createUser(Model model) {return 'create-user';}

注意:此方法仅接受GET请求。 发布表单时,我们需要其他方法。 您可以通过重新部署到Tomcat并浏览到http:// localhost:8080 / tutorial-hibernate-jpa / create-user.html来进行抽烟测试。 您会注意到,提交页面会导致HTTP 405错误。 我们可以使用以下(重载)方法处理POST请求:

@RequestMapping(value = '/create-user', method = RequestMethod.POST)@Transactionalpublic String createUser(Model model, String name) {User user = new User();user.setName(name);entityManager.persist(user);return 'redirect:/users.html';}

我们在这里使用了@Transactional批注。 当我们这样做时,Spring将为我们的bean创建一个代理对象并为我们管理事务,在发生错误时开始,提交和回滚。 与我们自己打开和关闭交易相比,这要少得多的代码(一行而不是一打),更安全(出现印刷错误的机会更少)。 您可以在这篇文章中看到详细版本代码的示例。 我们需要通过在Spring上下文中添加以下几行来告诉Spring支持这一点:告诉它使用基于注释的事务,以及应该由哪个bean管理事务:

<tx:annotation-driven/><bean id='transactionManager' class='org.springframework.orm.jpa.JpaTransactionManager'><property name='entityManagerFactory' ref='entityManagerFactory' /></bean>

注意:您还需要在文档中添加正确的架构:

xmlns:tx='http://www.springframework.org/schema/tx'
...http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd

您可以通过转到页面并提交新用户来进行测试。 之后,您将被重定向到用户页面,在那里您应该能够看到您的新用户。

结论

在此示例中,XML的行比Java多,但是大多数XML是一次性设置,您会发现,随着应用程序变大,比率会下降。 您可以使用Spring支持JPA实体,从而使到JEE的迁移更加容易。

我在这里只介绍了CRUD的“ C”和“ R”部分,您应该在这里拥有足够的信息,以便能够自己尝试其余的部分。

此代码在Github上 。 Hibernate Java Maven ORM Spring框架

参考: 教程:Hibernate,JPA和Spring MVC –来自我们的JCG合作伙伴 Alex Collins的第二部分 ,位于Alex Collins的博客博客中。


翻译自: https://www.javacodegeeks.com/2012/05/tutorial-hibernate-jpa-spring-mvc-part.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/373131.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

算法转换c语言程序,(转)C语言实现卡尔曼滤波算法程序

非常感谢原作者&#xff0c;我在这个的基础上转换成纯整形运算。STM32F103 12位ADC先放大1000倍再运算&#xff0c;理论上可以保留小数点后三位的结果。效果非常不错&#xff0c;运算速度也快&#xff0c;72M时钟 1-2uS左右(根据MDK周期数)。]uint32_t KalmanFilter(int32_t Re…

Java 8的烹调方式–拼图项目

什么是Project Jigsaw&#xff1a;Project Jigsaw是使Java编译器模块知道的项目。 多年以来&#xff0c;Java API一直是整体的&#xff0c;即从代码的任何部分都可以平等地看到整个API。 还没有任何方法可以声明代码对任何其他用户库的依赖关系。 拼图项目试图以非常有效的方式…

python之路-SQLAlchemy

SQLAchemy SQLAlchemy是Python编程语言下的一款ORM框架&#xff0c;该框架建立在数据库API之上&#xff0c;使用关系对象映射进行数据库操作&#xff0c;简言之便是&#xff1a;将对象转换成SQL&#xff0c;然后使用数据API执行SQL并获取执行结果。 安装&#xff1a; pip3 inst…

POJ 1751 Highways

题意&#xff1a;n个城市&#xff0c;然后把n个城市的坐标都给你&#xff0c;然后给你m条已经修好的道路&#xff0c;然后给出m个已经修好道路的城市a&#xff0c;b&#xff0c; However, they want to guarantee that every town is highway-reachable from every other town.…

C语言编程中void什么意思,程序设计中遇到的void到底是什么意思

部分编程的初学者都会问"void是什么意思","为什么很多函数前都要加个void".实际上,void最简单的解释就是把0转换成空类型的意思。下面用各个开发语言来详解void1.C语言中的void表示空类型&#xff0c;它跟int&#xff0c;float是同地位的&#xff0c;一般用…

Linux中vim编辑器的缩进的功能键

vim编程时,经常需要对代码进行缩进处理,以增加程序的可读性和后期的代码维护. 可以采用多种方式达到缩进的目的: 1) 命令模式(command mode) 2) Visual模式&#xff08;visual mode&#xff09; 2) 输入模式(entry mode) 3) 末行模式(last-line mode) 4) 在/etc/vimrc有给予vim…

JSF 2,PrimeFaces 3,Spring 3和Hibernate 4集成项目

本文展示了如何集成JSF2&#xff0c;PrimeFaces3&#xff0c;Spring3和Hibernate4技术。 它为Java开发人员提供了一个通用的项目模板。 另外&#xff0c;如果Spring不用于业务和数据访问层&#xff0c;则可以提供JSF – PrimeFaces和Hibernate集成项目。 二手技术&#xff1a…

c语言编程文件中删除数据结构,C语言数据结构实战(一)顺序表的插入与删除

今天学习了思成老师的数据结构实战教程 写了一个顺序表 插入和删除的操作 把源码共享给大家 一共包括list.c stu.h main.c list.h .h文件是头文件 需要引入 具体的功能我都已经在代码中写明了list.h代码如下&#xff1a;//线性表的定义在头文件中实现#ifndef _LIST_H#define …

内存使用分析工具Valgrind简单用法

转载自 http://www.cnblogs.com/sunyubo/archive/2010/05/05/2282170.html 暂时还未使用过&#xff0c;记录下&#xff0c;记录下&#xff0c;记录下 Valgrind的主要作者Julian Seward刚获得了今年的Google-OReilly开源大奖之一──Best Tool Maker。让我们一起来看一下他的作品…

Lucene概述第一部分:创建索引

介绍 我最近一直在与开源搜索引擎Lucene合作 。 我不是专家&#xff0c;但是由于我只是浏览了一些相当稀疏的文档并将应用程序从Lucene的很旧的版本迁移到了最新版本的2.4&#xff0c;所以我在总体上很清楚。 Lucene的文档有点让人难以想象&#xff0c;因此我想趁此机会在我脑海…

初识openstack

一、 什么是openstack&#xff1f; OpenStack是一个由NASA&#xff08;美国国家航空航天局&#xff09;和Rackspace合作研发并发起的&#xff0c;以Apache许可证授权的自由软件和开放源代码项目。 二、openstack前世今身 openstack是一个跟Eucalyptus,AWS(Amazon web Service)类…

c语言case多语句的取值,Switch Case语句中多个值匹配同一个代码块的写法

C&num;&plus;JQuery&plus;&period;Ashx&plus;百度Echarts实现全国省市地图和饼状图动态数据图形报表的统计在目前的一个项目中,需要用到报表表现数据,这些数据有多个维度,需要同时表现出来,同时可能会有大量数据呈现的需求,经过几轮挑选,最终选择了百度的e…

php解决下单、抽奖并发导致的库存负数的问题

我们知道数据库处理sql是一条条处理的&#xff0c;假设购买商品的流程是这样的&#xff1a; sql1:查询商品库存 if(库存数量 > 0) { //生成订单... sql2:库存-1 } 当没有并发时&#xff0c;上面的流程看起来是如此完美&#xff0c;假设同时两个人下单&#xff0c;而…

在Spring中使用JDBCJobStore配置Quartz

我将开始一些有关Quartz Scheduler内部&#xff0c;提示和技巧的系列文章&#xff0c;这是第0章-如何配置持久性作业存储。 在Quartz中&#xff0c;您基本上可以在将作业和触发器存储在内存中以及在关系数据库中进行选择&#xff08; Terracotta是最近添加的混合功能&#xff0…

rlwrap插件,实现sqlplus上下翻页

oracle在Linux下&#xff0c;sqlplus中不能上下翻&#xff0c;最主要我经常打错字&#xff01;嘿嘿 01、下载 RPM &#xff1a;http://rpmfind.net/linux/rpm2html/search.php?queryrlwrap tar.gz:https://fossies.org/linux/privat/rlwrap-0.42.tar.gz/ 百度云&#xff1a;h…

ice库c语言例子,很不多的ICE架构入门学习例子

虽然使用传统的SOCKET编程&#xff0c;我们可以更为清楚程序的性能&#xff0c;能够更直接的操控SOCKET的设置&#xff0c;比如发送超时时间&#xff0c;接受BUFFER的大小&#xff0c;以及进行自己的协议加密。但是由于其调试成本较高&#xff0c;且不易于分布式部署ICE 作为一…

程序员的十个层次,你属于哪一层?(转)

自西方文艺复兴以来&#xff0c;中国在自然科学方面落后西方很多&#xff0c;软件领域也不例外。当然现在中国的许多程序员们对此可能有许多不同的意见&#xff0c;有些人认为中国的程序员水平远落后于西方&#xff0c;有些则认为中国的程序员个人能力并不比西方的程序员差&…

操作系统基础篇

程序运行的4个因素 (1).程序设计语言 (2).编译系统 (3).操作系统 (4).指令集结构&#xff08;硬件系统&#xff09; 操作系统的定义&#xff1a;操作系统是掌控计算机上所有事情的软件系统(硬件资源&#xff0c;软件资源) 操作系统对内存&#xff0c;i/o&#xff0c;cpu&#x…

高效快速中值滤波算法c语言,快速中值滤波及c语言实现.docx

...快速中值滤波及c语言实现学生姓名&#xff1a; 刘 勇 学 号&#xff1a; 6100410218 专业班级&#xff1a; 数媒101【摘要】本文讨论了用c语言在微机上实现中值滤波及快速算法&#xff0c;在程序设计的过程中充分考虑到程序运行的时间复杂度和空间复杂度的问题&#xff0e;解…

Arquillian 1.0.0.Final正式发布! 准备使用GlassFish和WebLogic! 杀死所有虫子!

红帽公司和JBoss社区今天宣布的1.0.0.Final发布的Arquillian &#xff0c;其屡获殊荣的建在Java虚拟机&#xff08;JVM&#xff09;运行测试平台。 Arquillian大大减少了编写和执行Java中间件集成和功能测试所需的工作。 它甚至使测试工程师能够解决以前认为无法测试或测试成本…