Java SE还可以。

Java EE是邪恶的。

这就是我一直想的。 好吧,现在不再了。 让我分享我的经验。

几周前,我开始考虑将旧版spring + hibernate + tomcat应用程序移植到新平台上:
SAP NetWeaver云 。 我知道您在极客那里的想法:这篇文章越来越糟。 它从Java EE开始,不完全是一个怪胎,而现在进入SAP ,不完全是一个怪胎公司……请再给我十分钟!

我的遗留应用程序的spring层的配置是基于xml的(它是在注释进入游戏之前编写的)。 我对再次陷入我自己的xml恐怖的前景感到恐惧。

然后出现此推文:

欢迎@ sap参加#JavaEE6聚会,NetWeaver Cloud现在已通过Java EE 6 Web Profile认证: bit.ly/Wf8VNS

— GlassFish(@glassfish) 2012年11月16日

几天后,还有本文档 。 我尝试了。 而且有效。 我改变了对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

Java EE 6 Web配置文件。 在云上。 简单。相关推荐

  1. java web ee_Java EE 6 Web配置文件。 在云上。 简单。

    java web ee Java SE还可以. Java EE是邪恶的. 这就是我一直想的. 好吧,现在不再了. 让我分享我的经验. 几周前,我开始考虑将旧版spring + hibernate + ...

  2. Java EE过去,现在和云7

    最近的JavaOne 2011的一个突出主题是下一个主要的Java EE 7版本. 正如主题发言中所述,有关工作正在进行中. 它将包含我们已经从先行者那里知道的28个规范以及一些新规范. 没人可以告诉 ...

  3. IDEA 中Java EE没有 Web Application选项

    博主在IDEA测试Java Web项目时创建项目工程没有 Web Application选项 解决: 快捷键: CTRL+alt+shift+/,选择registry 找到javaee.legacy. ...

  4. eclise配置tomcat出现服务Tomcat version 6.0 only supports J2EE 1.2, 1.3, 1.4 and Java EE 5 Web modules...

    当部署项目Tomcat version 6.0 only supports J2EE 1.2, 1.3, 1.4, 1.5 and Java EE 5 Web modules错;解决方案,如下面: 空 ...

  5. IDEA 新建项目或模块中没有Java EE和Web Application

    IDEA 新建项目或模块中没有Java EE和Web Application选项解决 含有Java EE和Web App 解决办法 直到看了官方文档,

  6. Java EE meets Web 2.0

    http://www.ibm.com/developerworks/web/library/wa-aj-web2jee/?S_CMP=cn-a-wa&S_TACT=105AGX52 Summa ...

  7. 干货 | 如何在京东云上简单实践CI流程

    如何在京东云上简单实践CI流程 在如今的互联网时代,随着软件开发复杂度的不断提高,软件开发和发布管理也越来越重要.目前已经形成一套标准的流程,最重要的组成部分就是持续集成及持续交付.部署.在此,我们在 ...

  8. Java EE 7 / JAX-RS 2.0 – REST上的CORS

    Java EE REST应用程序通常在开箱即用的开发机器上运行良好,该开发机器上所有服务器端资源和客户端UI均指向" localhost"或127.0.0.1. 但是,当涉及跨域部 ...

  9. Java EE 8 Platform SDK 和Java EE 8 Web Profile SDK的区别

    进入Java官网下载Java8的时候,看到如下界面: 看到Platform SDK和Web Profile SDK两个版本,这两个版本有什么区别呢? web profile版本与platform sd ...

最新文章

  1. 关闭Windows不必要服务,电脑更安全
  2. VUE el-input正则验证
  3. 浦发银行招聘计算机类笔试题,2019浦发银行招聘计算机模拟试题及答案
  4. 对pca降维后的手写体数字图片数据分类_【AI白身境】深度学习中的数据可视化...
  5. 小米集团2021未来星专项招聘计划!
  6. html真实雾效果图,HTML5 Canvas图片上云雾弥漫驱散特效
  7. 无法安装 Microsoft Visual Studio 2010 Service Pack 1
  8. 【linux-command not find解决方法 】
  9. java新职篇:面向对象之抽象
  10. iphone怎么换手机铃声?原来方法这么简单,只需要一招 iRingg
  11. 2020年30米二级分类北京市土地利用数据
  12. 天然气故障代码大全_美的、格力中央空调常见故障代码大全
  13. 软件工程课程项目设计 图书管理系统
  14. 泰坦尼克号乘客存活预测详细笔记
  15. linux系统小红帽和ubuntu,Thinkpad trackpoint小红帽和中间键功能的实现。
  16. 电脑图片格式怎么批量转换jpg?几个小妙招轻松转换
  17. Java中动态代理实现原理深究
  18. 工作篇 之 解决谷歌地图与 NestedScrollView 滑动冲突
  19. 机器人瓦力漫威_章节目录 86、机器人瓦力
  20. node rimraf模块 递归删除文件夹内容

热门文章

  1. synchronized原理_Java并发编程 -- synchronized保证线程安全的原理
  2. 转-《高性能mysql》并不是一本好书——SQL笔记
  3. netbeans 9_NetBeans 9抢先体验
  4. 清除java_如何在Java地毯下有效地清除问题
  5. 工厂模式理解_工厂模式
  6. 设计模式适配器模式_21世纪的设计模式:适配器模式
  7. 空字符串字符串不为空_当字符串为空但不为空时
  8. 用Java将文件读入字节数组的7个示例
  9. 反射是最重要的Java API
  10. 将Java类作为子进程运行