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.mzph.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;该比萨饼已经用番茄和奶酪烤制的情况。…