因为之前JPA原生 属性在Wildfly实现中并不总是生效,所以这里换成了Wildfly默认的JPA实现,即Hibernate。把属性改成了Hibernate专有的。hibernate.hbm2ddl.auto 定义是否自动生成表,create-and-drop 意为如果表存在,则删除后再创建。hibernate.dialect 用来指定数据库厂商,以根据不同的数据库生成厂商相关的SQL语句。

创建EJB模块

=======

EJB Service client 模块

EJB可以用接口来定义此Bean是本地还是远程的。本地bean只能在部署应用的同一容器中访问,而远程bean可以被集群中的服务器所访问。

现在,创建一个maven模块,名为 notebookServiceClient。

pom.xml 文件内容为:

xmlns:xsi=“http://www.w3.org/2001/XMLSchema-instance”

xsi:schemaLocation=“http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd”>

notebookRoot

com.zxuqian

0.0.2

…/notebookRoot/pom.xml

4.0.0

notebookServiceClient

src

**/*.java

maven-compiler-plugin

com.zxuqian

notebookDomain

org.jboss.spec.javax.ejb

jboss-ejb-api_3.2_spec

provided

此模块也继承自 notebookRoot 模块, 并且依赖于 notebookDomain 模块和jboss ejb模块.

创建名为 IUserService 的接口,并写入如下代码:

public interface IUserService {

User getUserById(Long id);

List getAllUsers();

Long addUser(User user);

void deleteUser(User user);

}

这些方法定义了数据库CRUD操作,根据用户ID查询用户,查询所有用户,添加一个用户,删除一个用户。

再创建另一个名为 IUserServiceLocal 的接口,继承自 IUserService, 并添加 @Local 注解,表明它为本地bean接口。

@Local

public interface IUserServiceLocal extends IUserService {

}

创建一个远程bean接口, IUserServiceRemote:

@Remote

public interface IUserServiceRemote extends IUserService {

}

这两个接口都使用父接口的方法,所以类体留空即可。

EJB Service 模块

创建Maven模块 notebookService。 此模块是 notebookServiceClient 的具体实现。 pom.xml文件内容为:

xmlns:xsi=“http://www.w3.org/2001/XMLSchema-instance”

xsi:schemaLocation=“http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd”>

notebookRoot

com.zxuqian

0.0.2

…/notebookRoot/pom.xml

4.0.0

ejb

notebookService

src

**/*.java

maven-compiler-plugin

maven-ejb-plugin

org.jboss.spec.javax.ejb

jboss-ejb-api_3.2_spec

provided

org.hibernate.javax.persistence

hibernate-jpa-2.1-api

provided

com.zxuqian

notebookDomain

com.zxuqian

notebookServiceClient

这里的不同之处是 的值为 ejb, 意为此模块将被打包成 EJB 格式。 如果EJB版本小于3.0,则需要在模块的 src/META-INF 文件夹下添加 ejb-jar.xml 文件,如果EJB版本大于3.0,则可以省略。这里提供 ejb-jar.xml 文件内容,其实只是一个空的定义文件:

xmlns:xsi=“http://www.w3.org/2001/XMLSchema-instance”

xsi:schemaLocation="http://java.sun.com/xml/ns/javaee

http://java.sun.com/xml/ns/javaee/ejb-jar_3_1.xsd"

version=“3.1”>

在此模块下创建名为 UserServiceBean 的Java类,实现 IUserServiceLocal 接口并添加 @Stateful 注解。@Stataful 意思为此EJB在客户端与其交互中,保存所有状态。另一种EJB类型为@Stateless,即在每次客户端请求时,从bean池里取出一个新的bean,状态不会保存。此类使用 @PersistenceContext 注解注入了一个EntityManager 对象,注入即是让容器管理此对象的创建与销毁。@PostConstruct 是生命周期注解,意思是在对象创建之后调用此方法,即 init() 方法,此方法初始化 UserDao 类,并传递 EntityManager 对象。

@Stateful

public class UserServiceBean implements IUserServiceLocal {

@PersistenceContext

private EntityManager entityManager;

private IUserDao userDao;

@PostConstruct

private void init() {

this.userDao = new UserDao(entityManager);

}

public User getUserById(Long id) {

return this.userDao.getUserById(id);

}

public List getAllUsers() {

return this.userDao.getAllUsers();

}

public Long addUser(User user) {

return this.userDao.addUser(user);

}

public void deleteUser(User user) {

this.userDao.deleteUser(user);

}

}

JSF调用EJB服务

==========

现在可以使用JSF来调用EJB服务了。在之前的 notebook 模块中,创建一个名为 UserBackBean 的Java类:

public class UserBackBean implements Serializable {

private Logger logger = Logger.getLogger(UserBackBean.class.getCanonicalName());

@EJB

private IUserServiceLocal userService;

private List users;

private User user;

public UserBackBean() {

this.user = new User();

}

public User getUser() {

return user;

}

public void setUser(User user) {

this.user = user;

}

public List getUsers() {

return users;

}

public void setUsers(User user) {

this.users.add(user);

}

public String register() {

this.userService.addUser(this.user);

return this.getAllUsers();

}

public String getAllUsers() {

this.users = this.userService.getAllUsers();

return “user_list”;

}

}

此类作为JSF页面的后端bean,提供属性和方法供页面使用,利用EL表达式。

IUserServiceLocal 使用 @EJB 注解,不但声明了它是EJB组件,而且它的生命周期由容器管理,所以不用手动初始化它。 users 成员变量保存从数据库查询出来的所有 User 对象。 user 即 notebookDomain 模块中的 User 实体,用来接收用户从页面中输入的数据。 register() 方法保存用户数据到数据库中,并调用 getAllUsers() 方法跳转到 user_list 页面来显示所有用户的用户名。 getAllUsers() 用来查询所有用户,并跳转到 user_list 页面来显示所有用户的用户名。

再创建一些JSF页面。首先创建 register.xhtml 页面,位于 WebContent 目录下:

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)

最后总结

ActiveMQ+Kafka+RabbitMQ学习笔记PDF

RabbitMQ实战指南

手写RocketMQ笔记

手写“Kafka笔记”

关于分布式,限流+缓存+缓存,这三大技术(包含:ZooKeeper+Nginx+MongoDB+memcached+Redis+ActiveMQ+Kafka+RabbitMQ)等等。这些相关的面试也好,还有手写以及学习的笔记PDF,都是啃透分布式技术必不可少的宝藏。以上的每一个专题每一个小分类都有相关的介绍,并且小编也已经将其整理成PDF啦 《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取! g" style=“zoom: 33%;” />

最后总结

ActiveMQ+Kafka+RabbitMQ学习笔记PDF

[外链图片转存中…(img-MJIIBVCo-1712579666381)]

RabbitMQ实战指南

[外链图片转存中…(img-LzaAPjpg-1712579666381)]

手写RocketMQ笔记

[外链图片转存中…(img-BtxwIT2Y-1712579666381)]

手写“Kafka笔记”

[外链图片转存中…(img-x3L642hb-1712579666382)]

关于分布式,限流+缓存+缓存,这三大技术(包含:ZooKeeper+Nginx+MongoDB+memcached+Redis+ActiveMQ+Kafka+RabbitMQ)等等。这些相关的面试也好,还有手写以及学习的笔记PDF,都是啃透分布式技术必不可少的宝藏。以上的每一个专题每一个小分类都有相关的介绍,并且小编也已经将其整理成PDF啦 《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

推荐文章

评论可见,请评论后查看内容,谢谢!!!
 您阅读本篇文章共花了: