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

java web ee

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

当然,最简单的方法是在像mine这样的Maven项目中声明这些依赖关系,但是如果您不喜欢 Maven,那么我会花一些时间超链接到上面的jar,以便在maven Central中节省一些时间来追逐jar。

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出现日历博客中来自我们的JCG合作伙伴 Christophe Thiebaud的内容。

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

java web ee

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

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

相关文章

帆软报表(finereport) 饼图联动

饼图联动&#xff1a;点击饼图1&#xff0c;饼图2和饼图3显示饼图1的关联数据&#xff0c;接着点击饼图2&#xff0c;饼图3显示饼图2的关联数据&#xff0c;点击上方清除级联&#xff0c;饼图则恢复默认展示状态 下面以上图示例效果为例&#xff0c;说明制作过程。 1.为每个饼图…

中值滤波medianBlur

C: void medianBlur(InputArray src, OutputArray dst, int ksize) 参数解释&#xff1a; . InputArray src: 输入图像&#xff0c;图像为1、3、4通道的图像&#xff0c;当模板尺寸为3或5时&#xff0c;图像深度只能为CV_8U、CV_16U、CV_32F中的一个&#xff0c;如而对于较大…

wxpython下载缓慢_我可以在wxPython的wx.grid.Grid中加速优化GridCellAttr的使用吗?

设置单元格属性将新GridCellAttr添加到GridCellAttrProvider名单。 随着列表的增长&#xff0c;查找单元格的特定属性(通过遍历列表和比较坐标)变得越来越慢。您可以尝试通过PyGridTableBase.SetAttr和GetAttr(例如使用字典)实现自己的加快步伐&#xff1a;编辑&#xff1a;更新…

特性和混入不是面向对象的

让我立刻说&#xff0c;我们将在这里讨论的功能是那些迫切需要进行放线手术的人带给面向对象编程的纯粹的毒药 &#xff0c;就像David West在他的《 Objecting Thought》一书中所建议的那样。 这些功能具有不同的名称&#xff0c;但最常见的是traits和mixins 。 我很不明白&…

模板匹配matchTemplate

C: void matchTemplate(InputArray image, InputArray templ, OutputArray result, int method); image&#xff1a;输入图像。必须为8位或者32位的浮点型。 templ&#xff1a;用于搜索的模板图像。必须小于输入图像并且是一样的数据类型。 result&#xff1a;匹配…

pandas处理csv

import pandas as pd from pandas import Series,DataFrame 打开csv文件 deli pd.read_csv(../得力.csv) 转换为DataFrame数据类型 df DataFrame(datadeli) 更改列名 df.rename(columns{"title":"商品名称","price":"价格","pr…

php 随机在文章中添加锚文本_SEO站长布局锚文本时的7大注意事项

通过对什么是锚文本链接、锚文本作用的讲解&#xff0c;以及怎样布局网站站内锚文本的介绍。相信大家都有了比较清晰的认识&#xff0c;也会重视网站锚文本的建设。但是菜鸟菌还是不得不再啰嗦点&#xff0c;锚文本虽然好处大大的&#xff0c;在布局锚文本的时候还是注意以下几…

OpenCV rectangle

void rectangle(Mat& img, Point pt1,Point pt2,const Scalar& color, int thickness1, int lineType8, int shift0) img 图像. pt1 矩形的一个顶点。 pt2 矩形对角线上的另一个顶点 color 线条颜色 (RGB) 或亮度&#xff08;灰度图像 &#xff09;(grayscale image…

【Java】NIO中Selector的select方法源码分析

该篇博客的有些内容和在之前介绍过了&#xff0c;在这里再次涉及到的就不详细说了&#xff0c;如果有不理解请看【Java】NIO中Channel的注册源码分析&#xff0c; 【Java】NIO中Selector的创建源码分析 Selector的创建在Windows下默认生成WindowsSelectorImpl对象&#xff0c;那…

简单小程序代码_小程序该如何运营

小型程序升级有三种最重要的方法&#xff1a;1.借助微信附近小程序功能实现客户扩展大家可能都知道&#xff0c;微信平台具有附近小程序的功能。此功能使用户可以查看周围五公里范围内的所有小程序。正是由于这个原因&#xff0c;一旦商人完成了这个小程序并加入了附近的小程序…

在javafx中界面主题_最小的JavaFX演示文稿(在JavaFX中)

在javafx中界面主题如果您要进行有关JavaFX的演示&#xff0c;那么使用JavaFX本身进行演示非常方便。 这样&#xff0c;您无需离开演示文稿即可轻松显示示例。 这是一个非常简单的示例。 在NetBeans中&#xff0c;设置一个新的JavaFX项目“ New Project”->“ JavaFX”->…

OpenCV cvLine

cvLine 函数原型&#xff1a; void cvLine( CvArr* img, CvPoint pt1, CvPoint pt2, CvScalar color, int thickness1, int line_type8, int shift0 ); img 图像。pt1 线段的第一个端点。pt2 线段的第二个端点。color 线段的颜色。thickness 线段的粗细程度。line_type 线段…

lengthOfLongestSubstring

lengthOflongestSubstring 试例&#xff1a; 输入: "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 "abc"&#xff0c;所以其长度为 3。 /**** param {string} s* 无重复字符的最长子串*/ function lengthOfLongestSubstring(s) {if (typeof s ! s…

编译原理--词法分析C++

一、实验项目要求 1.实验目的 通过设计编制调试一个具体的词法分析程序&#xff0c;加深对词法分析原理的理解。并掌握在对程序设计语言源程序进行扫描过程中将其分解为各类单词的词法分析方法。 编制一个读单词过程&#xff0c;从输入的源程序中&#xff0c;识别出各个具有…

python list转map_Python 进阶之术 Map Filter Reduce

" 本文字数&#xff1a;763 字 || 阅读时间&#xff1a;3分钟"Map Map 会将⼀个函数映射到⼀个输⼊列表的所有元素上。这是它的规范&#xff1a;规范 map(function_to_apply, list_of_inputs) ⼤多数时候&#xff0c;我们要把列表中所有元素⼀个个地传递给⼀个函数&a…

JavaFX动画工具

好的&#xff0c;我想是时候让您讲一个小秘密了。 在过去的大约三个月中&#xff0c;我从事一个私有项目&#xff0c;目标是创建一个工具&#xff0c;使我可以轻松地为Java桌面应用程序创建动画。 JavaFX在API级别上提供了出色的动画制作支持&#xff0c;但对于初学者甚至中级程…

ImageWatch的使用

1.能够实时显示图像和矩阵Mat的内容&#xff0c;跟Matlab很像&#xff0c;方便程序调试&#xff0c;相当好用。 下载地址&#xff1a; https://marketplace.visualstudio.com/items?itemNameVisualCPPTeam.ImageWatch 2.下载好插件ImageWatch&#xff0c;双击ImageWatch.vs…

springboot与任务(邮件任务)

邮件发送需要引入spring-boot-starter-mailSpring Boot 自动配置MailSenderAutoConfiguration定义MailProperties内容&#xff0c;配置在application.yml中自动装配JavaMailSender 测试邮件发送 pom文件配置&#xff1a; <!--邮件发送--><dependency><groupId&g…

具有ESB,API管理和Now ..服务网格的应用程序网络功能。

我最近谈论了微服务模式的演变&#xff0c;以及来自Lyft的Envoy之类的服务代理如何帮助将弹性&#xff0c;服务发现&#xff0c;路由&#xff0c;指标收集等责任推到应用程序下一层。 否则&#xff0c;我们冒着希望并祈祷各种应用程序将正确实现这些关键功能或依赖于特定语言的…

宝塔定时任务执行php源码任务_Linux at命令详解:定时执行任务

要想使用 at 命令&#xff0c;读者需提前安装好 at 软件包&#xff0c;并开启 atd 服务。因此&#xff0c;首先来看看如何安装 at 软件包。在 Linux 系统中&#xff0c;查看 at 软件包是否已安装&#xff0c;可以使用 rpm -q 命令&#xff0c;如下所示&#xff1a;[rootlocalho…