教程: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.pswp.cn/news/373131.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/373131.shtml
英文地址,請注明出處:http://en.pswp.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中間件集成和功能測試所需的工作。 它甚至使測試工程師能夠解決以前認為無法測試或測試成本…