Java EE 6 Web配置文件。 在云上。 簡單。

Java SE還可以。

Java EE是邪惡的。

這就是我一直想的。 好吧,現在不再了。 讓我分享我的經驗。

幾周前,我開始考慮將舊版spring + hibernate + tomcat應用程序移植到新平臺上:
SAP NetWeaver云 。 我知道您在極客那里的想法:這篇文章越來越糟。 它從Java EE開始,不完全是一個怪胎,而現在進入SAP ,不完全是一個怪胎公司……請再給我十分鐘!

我的遺留應用程序的spring層的配置是基于xml的(它是在注釋進入游戲之前編寫的)。 我對再次陷入我自己的xml恐怖的前景感到恐懼。

然后出現此推文:


幾天后,還有本文檔 。 我嘗試了。 而且有效。 我改變了對Java EE的想法。 “水管工比爾”(Bill the Plumber)有一篇博客文章, 準確地描述了我在經歷之后的想法 。

bla bla bla太多了。 讓我們開始編碼! 如果您趕時間,請從https://github.com/cthiebaud/adventscloud克隆完整的應用程序

在瘋狂剪切和粘貼之前,讓我們簡要描述一下下面的代碼。 我們將免費構建一個小型Web應用程序并將其部署到云中:

1.登錄用戶(對不起,您需要一個SAP Community Network帳戶,不用擔心它是免費的),

2.登錄后,代表用戶向世界其他地方問好,

3.連續登錄后,不必一遍又一遍地說“你好”,而只是在數據庫中存儲說了多少個“ hellos”,并且

4.就是這樣。

為此,我們需要一個Java接口,三個Java類,一個Java服務器頁面以及persistence.xml(用于數據庫配置)和web.xml(用于安全性約束向導)的最終版本。

為了簡潔起見,以下代碼中省略了包,導入,getter和setter。 但是,正如剛剛所說的, 完整的源代碼可以在github上找到。

編寫一個Hello.java POJO( 此處是完整的類):

public class Hello {private Long      id;private String    username;private Integer   counter;private Timestamp when;// ... getters and setters ...
}

顯而易見:對于每個username ,此POJO都會在counter存儲用戶點擊我們應用程序的index.jsp的次數,以及上次是when

使用JPA批注對此Hello.java POJO批注( 在此處完成類):

@Entity
@Table(name="T_HELLO")
@NamedQueries( {@NamedQuery(name = "allHellos", query = "select h from Hello h"),@NamedQuery(name = "helloFromUsername", query = "select h from Hello h where h.username = :username")
})
public class Hello {@Id@GeneratedValueprivate Long      id;@Column(name="A_USER", unique=true, nullable=false)private String    username;@Column(name="A_COUNTER", nullable=false)private Integer   counter;@Version@Column(name="A_TIMESTAMP", nullable=false)private Timestamp when;public Hello() {this.counter = 1;}// ... getters and setters ...
}

編寫一個訪問POJO的HelloDao.java接口( 此處為完整接口)

@Local
public interface HelloDao {List<hello> getAll();Hello fromUsername(String username);Hello save(Hello hello);
}

編寫一個用EJB注釋注釋的HelloBean.java,它實現了HelloDao接口( 此處是完整的類):

@Stateless
public class HelloBean implements HelloDao {@PersistenceContextprivate EntityManager em;@Overridepublic List<hello> getAll() {@SuppressWarnings("unchecked")List<hello> hellos = (List<hello>)em.createNamedQuery("allHellos").getResultList();Collections.sort(hellos, new Comparator<hello>() {@Overridepublic int compare(Hello o1, Hello o2) {return o2.getWhen().compareTo(o1.getWhen()); // latest first}});return hellos;}@Overridepublic Hello fromUsername(String username) {Query query = em.createNamedQuery("helloFromUsername");query.setParameter("username", username);Hello hello = null;try {hello = (Hello)query.getSingleResult();} catch (NoResultException ignored) {}return hello;}@TransactionAttribute@Overridepublic Hello save(Hello hello) {hello = em.merge(hello);return hello;}
}

編寫一個HelloFilter.java Java Servlet 3過濾器,該過濾器是1.登錄時更改計數器,并且2.在即將推出的Java Server頁面( 此處是完整類)中公開HelloBean實例:

@WebFilter("/index.jsp")
public final class HelloFilter implements Filter {@EJBHelloDao  helloDao;@Overridepublic void init(FilterConfig fConfig) throws ServletException {}@Overridepublic void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {try {request.setAttribute("helloDao", helloDao);String username = ((HttpServletRequest)request).getRemoteUser();Hello hello = helloDao.fromUsername(username);if (hello == null) {hello = new Hello();hello.setUsername(username);} else {hello.setCounter(hello.getCounter()+1);}hello = helloDao.save(hello);chain.doFilter(request, response);} finally {request.removeAttribute("helloDao");}}@Overridepublic void destroy() {}
}

注意 上面的粗體字是我們的Java EE 6 Web Profile容器在所有這些類之間完成的神奇工作:

@PersistenceContext EntityManager em;
@EJB HelloDao helloDao;
@WebFilter('/index.jsp')

編寫一個persistence.xml JPA配置( 在此處完成xml)

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"><persistence-unit name="adventscloud-persist" transaction-type="JTA"><provider>org.eclipse.persistence.jpa.PersistenceProvider</provider><jta-data-source>jdbc/DefaultDB</jta-data-source><class>net.aequologica.adventscloud.Hello</class><properties><property name="eclipselink.ddl-generation" value="create-or-extend-tables" /></properties></persistence-unit>
</persistence>

編寫一個web.xml,以在用戶訪問index.jsp時觸發登錄,并通知Web應用程序容器管理數據庫的存在( 在此處完整xml):

<?xml version="1.0" encoding="UTF-8"?>
<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_3_0.xsd"version="3.0"><login-config><auth-method>FORM</auth-method></login-config><security-constraint><web-resource-collection><web-resource-name>Protected Area</web-resource-name><url-pattern>/index.jsp</url-pattern></web-resource-collection><auth-constraint><role-name>Everyone</role-name></auth-constraint></security-constraint><security-role><description>All SAP NetWeaver Cloud users</description><role-name>Everyone</role-name></security-role><resource-ref><res-ref-name>jdbc/DefaultDB</res-ref-name><res-type>javax.sql.DataSource</res-type></resource-ref></web-app>

再次,NB。 以上以粗體顯示的進一步魔術效果:

<jta-data-source>jdbc/DefaultDB</jta-data-source>
<class>net.aequologica.adventscloud.Hello</class>
<res-ref-name>jdbc/DefaultDB</res-ref-name>

最后,編寫一個index.jsp Java服務器頁面,其中顯示所有“ hellos”( 此處完整頁面):

<%@ taglib prefix="c"   uri="http://java.sun.com/jstl/core_rt" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jstl/fmt_rt" %>
<!DOCTYPE html>
<html><head><title>adventscloud</title></head><body><table><tbody><c:forEach var="hello" items="${requestScope.helloDao.all}" varStatus="status"><tr><td><fmt:formatDate type="both" value="${hello.when}" /></td><td>${hello.counter}</td><td>hello<c:if test = "${hello.counter > 1}">(s)</c:if> from</td><td>${hello.username}</td></tr></c:forEach></tbody></table>  </body></html>

我們幾乎完成了……最后兩件事:1.類路徑地獄,以及2.使用javac -processor生成JPA 2.0元模型。

1.類路徑地獄。

為了編譯所有這些東西,您需要某種方式在類路徑上具有以下jar:

group | artifact | version
javax.persistence : persistence-api   : >= 1.0 
javax.ejb         : ejb-api           : >= 3.0 
javax.servlet     : javax.servlet-api : >= 3.0 
javax.servlet     : jstl  : >= 1.2

當然,最簡單的方法是在像我的maven項目中聲明這些依賴關系,但是如果您是厭惡Maven的人,我會花一些時間超鏈接到上面的jars,以便在maven Central中節省一些時間來追逐jars。

2.使用javac -processor生成JPA 2.0元模型。

最后,該構建必須能夠生成JPA 2.0元模型類 。 在這里,我選擇eclipselink生成器,因為eclipselink最終是SAP NetWeaver Cloud使用的JPA實現。 我相信,任何符合JPA 2.0的生成器也應完成此工作。 同樣,maven在pom.xml的<build> <plugins>部分中提供了以下xml片段,可以為您提供幫助:

<plugin><groupId>org.bsc.maven</groupId><artifactId>maven-processor-plugin</artifactId><version>2.1.0</version><executions><execution><id>process</id><goals><goal>process</goal></goals><phase>generate-sources</phase><configuration><processors><processor>org.eclipse.persistence.internal.jpa.modelgen.CanonicalModelProcessor</processor></processors></configuration></execution></executions>
</plugin>

Maven-averse可以參考有關JPA 2.0 matamodel生成的eclipselink文檔,以獲取生成JPA 2.0元模型類的替代方法。

至此,我們有了一個adventscloud.war文件,該文件應在所有符合Java EE 6 Web Profile的容器上逐字運行。

其中包括SAP NetWeaver Cloud。 您可以在我的SAP NetWeaver Cloud終生免費試用版實例上運行該應用程序。 它比本博客文章中顯示的代碼更豐富,并帶有Twitter引導程序的響聲。 如果您對火花感興趣,請遵循應用程序中的github功能區。

如果你想獲得的SAP NetWeaver云的免費終身試用實例,請描述的初始步驟在這里 。

參考: Java EE 6 Web配置文件。 在云上。 簡單。 在Java Advent Calendar博客上可以從我們的JCG合作伙伴 Christophe Thiebaud獲得。

翻譯自: https://www.javacodegeeks.com/2012/12/java-ee-6-web-profile-on-the-cloud-easy.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/370247.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/370247.shtml
英文地址,請注明出處:http://en.pswp.cn/news/370247.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Kubernetes核心概念總結

1、基礎架構 1.1 Master Master節點上面主要由四個模塊組成&#xff1a;APIServer、scheduler、controller manager、etcd。 APIServer。APIServer負責對外提供RESTful的Kubernetes API服務&#xff0c;它是系統管理指令的統一入口&#xff0c;任何對資源進行增刪改查的操作都要…

七、spring boot 1.5.4 集成shiro+cas,實現單點登錄和權限控制

1.安裝cas-server-3.5.2 官網&#xff1a;https://github.com/apereo/cas/releases/tag/v3.5.2 下載地址&#xff1a;cas-server-3.5.2-release.zip 安裝參考文章&#xff1a;http://blog.csdn.net/xuxuchuan/article/details/54924933 注意&#xff1a; 輸入 <tomcat_key&g…

php連接mysql數據,php連接mysql數據庫

$sql_link mysql_connect("主機名","登入用戶名","登入用戶名密碼");如果連接成功&#xff0c;就會返回一個mysql句柄,可以簡單的理解成這個$sql_link 是php跟mysql的一個橋梁&#xff0c;通過該橋梁我們可以進入到mysql。進入到mysql之后&…

CSS-自定義變量

使用背景&#xff1a; 一些常見的例子&#xff1a;為風格統一而使用顏色變量一致的組件屬性&#xff08;布局&#xff0c;定位等&#xff09;避免代碼冗余*更方便的從CSS向JS傳遞數據&#xff08;例如媒體斷點&#xff09; 為什么使用&#xff1a; 以下幾點是未來CSS屬性的簡短…

url存在寬字節跨站漏洞_利用WebSocket跨站劫持(CSWH)漏洞接管帳戶

在一次漏洞懸賞活動中&#xff0c;我發現了一個使用WebSocket連接的應用&#xff0c;所以我檢查了WebSocket URL&#xff0c;發現它很容易受到CSWH的攻擊(WebSocket跨站劫持)有關CSWH的更多詳細信息&#xff0c;可以訪問以下鏈接了解https://www.christian-schneider.net/Cross…

php 數組對比 unset,如何區分PHP中unset,array_splice的區別

1.使用的函數a.函數unset()unset ( mixed $var , mixed $... ? ) : voidunset()銷毀指定的變量。b.函數array_slice()array_splice(array,start,length,array)array表示數組。start表示刪除元素的開始位置。length表示被移除的元素個數&#xff0c;也是被返回數組的長度。(可…

MapReduce算法–二級排序

我們將繼續進行有關實現MapReduce算法的系列文章&#xff0c;該系列可在使用MapReduce進行數據密集型文本處理中找到。 本系列的其他文章&#xff1a; 使用MapReduce進行數據密集型文本處理 使用MapReduce進行數據密集型文本處理-本地聚合第二部分 使用Hadoop計算共現矩陣 …

Redis 字符串(String)

Redis 字符串(String) Redis 字符串數據類型的相關命令用于管理 redis 字符串值&#xff0c;基本語法如下&#xff1a; 語法 redis 127.0.0.1:6379> COMMAND KEY_NAME 實例 redis 127.0.0.1:6379> SET runoobkey redis OK redis 127.0.0.1:6379> GET runoobkey "…

前端基礎-CSS的各種選擇器的特點以及CSS的三大特性

一、 基本選擇器二、 后代選擇器、子元素選擇器三、 兄弟選擇器四、 交集選擇器與并集選擇器五、 序列選擇器六、 屬性選擇器七、 偽類選擇器八、 偽元素選擇器九、 CSS三大特性 一、 基本選擇器 1、id選擇器 #1、作用&#xff1a;根據指定的id名稱&#xff0c;在當前界面中找…

Php流式 大文件,如何使用PHP解析XML大文件

如果使用 PHP 解析 XML 的話&#xff0c;那么常見的選擇有如下幾種&#xff1a;DOM、SimpleXML、XMLReader。如果要解析 XML 大文件的話&#xff0c;那么首先要排除的是 DOM&#xff0c;因為使用 DOM 的話&#xff0c;需要把整個文件全部加載才能解析&#xff0c;效率堪憂&…

python 白盒測試_白盒測試教程 - 顏麗的個人空間 - OSCHINA - 中文開源技術交流社區...

總共貼了39節&#xff0c;后續還有很長&#xff0c;共122節&#xff0c;文章名為‘白盒測試教程’1、白盒測試概念2、測試覆蓋標準3、邏輯驅動測試4、基本路徑測試白盒測試概念1、白盒測試也稱結構測試或邏輯驅動測試&#xff0c;是一種測試用例設計方法&#xff0c;它從程序的…

Oracle 分析函數及常用函數

什么叫分析函數(Analytic function)&#xff1f; Oracle從8.1.6開始提供分析函數&#xff0c;分析函數用于計算基于組的某種聚合值&#xff0c;它和聚合函數的不同之處是 對于每個組返回多行&#xff0c;而聚合函數對于每個組只返回一行。 基本語法 function_name(arg1,arg2,..…

ScanTailor-ScanTailor 強大的多方位的滿足處理掃描圖片的需求

ScanTailor 強大的多方位的滿足處理掃描圖片的需求ScanTailor 能做什么&#xff1f;批量或單張或選擇區間旋轉圖片自動切割頁面&#xff0c;同時提供手動選項自動識別圖像歪斜角度&#xff0c;同時提供手動選項自動識別正文內容裁剪&#xff0c;同時提供手動選項設置正文上下左…

使用JavaCV進行手和手指檢測

這篇文章是Andrew Davison博士發布的有關自然用戶界面&#xff08;NUI&#xff09;系列的一部分&#xff0c;內容涉及使用JavaCV從網絡攝像頭視頻提要中檢測手。 注意&#xff1a;可以從http://fivedots.coe.psu.ac.th/~ad/jg/nui055/下載本章的所有源代碼。 第5章的彩色斑點檢…

oracle+trace參數設置,Oracle autotrace參數詳解

SQL> set autotrace traceonly explainSP2-0613: 無法驗證 PLAN_TABLE 格式或實體cuug每周五晚8點都有免費網絡課程&#xff0c;如需了解可點擊cuug官網。SP2-0611: 啟用EXPLAIN報告時出錯解決方法&#xff1a;1. 以SYS用戶登錄CONNECT / as SYSDBA ;1. 創建PLAN_TABL…

git提交代碼到碼云

日常代碼一般提交到github比較多&#xff0c;但我還是鐘愛馬爸爸&#xff0c;沒錯就是碼云。 碼云是中文版的代碼托管的網站&#xff0c;不存在打開網速問題&#xff0c;使用也蠻方便的&#xff0c;日常自己保存托管代碼已經足夠&#xff0c;平時使用git提交代碼到碼云是非常方…

不能裝載文檔控件。請在檢查瀏覽器的選項中檢查瀏覽器的安全設置_【2020年網絡安全宣傳周】如何正確設置瀏覽器...

李夏是一個公司的職員&#xff0c;一天晚上加班趕制文檔&#xff0c;由于要向客戶匯報產品情況&#xff0c;需要獲取大量網上信息&#xff0c;然而在制作中卻發現瀏覽器的網頁打不開了。第二天原計劃向客戶展示的材料未能完整匯總&#xff0c;客戶見面對接效果也打了折扣。在當…

矩形碰撞檢測和圓形碰撞檢測。

矩形碰撞檢測&#xff1a; <!DOCTYPE html><html lang"en"><head><meta charset"UTF-8"><title>Document</title><style type"text/css">body { margin: 0;}#wrap { margin: 50px auto; position: re…

MonogoDB 查詢小結

MonogoDB是一種NoSQL數據庫 優點: 1.數據的存儲以json的文檔進行存儲(面向文檔存儲) 2.聚合框架查詢速度快 3.高效存儲二進制大對象 缺點: 1.不支持事務 2.文件存儲空間占用過大 案例學習 例1:單個變量查詢(查找出制造商字段為“Porsche”的所有汽車的查詢) {"layout"…

用裝飾器設計模式裝飾

裝飾圖案是廣泛使用的結構圖案之一。 此模式在運行時動態更改對象的功能&#xff0c;而不會影響對象的現有功能。 簡而言之&#xff0c;此模式通過包裝將附加功能添加到對象。 問題陳述&#xff1a; 想像一下我們有一個比薩餅&#xff0c;該比薩餅已經用番茄和奶酪烤制的情況。…