这两个接口都使用父接口的方法,所以类体留空即可。
EJB Service 模块
创建Maven模块 notebookService。 此模块是 notebookServiceClient 的具体实现。 pom.xml
文件内容为:
<project xmlns=“http://maven.apache.org/POM/4.0.0”
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
这里的不同之处是 <packaging>
的值为 ejb, 意为此模块将被打包成 EJB 格式。 如果EJB版本小于3.0,则需要在模块的 src/META-INF 文件夹下添加 ejb-jar.xml
文件,如果EJB版本大于3.0,则可以省略。这里提供 ejb-jar.xml
文件内容,其实只是一个空的定义文件:
<ejb-jar xmlns=“http://java.sun.com/xml/ns/javaee”
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 目录下:
<?xml version="1.0" encoding="UTF-8"?>xmlns:h=“http://xmlns.jcp.org/jsf/html”
xmlns:jsf=“http://xmlns.jcp.org/jsf”
xmlns:f=“http://xmlns.jcp.org/jsf/core”>
<h:form>
<h:inputText id=“usernmae” value=“#{userBackBean.user.username}” />
<h:inputSecret id=“password” value=“#{userBackBean.user.password}” />
<f:convertDateTime pattern=“yyyy-MM-dd”/>
<h:inputText value=“#{userBackBean.user.phone}” />
<h:commandButton value=“Submit” action=“#{userBackBean.register}” />
</h:form>
这里使用EL表达式引用后端bean的属性和方法。<h:commandButton>
标签中的action
属性调用了 UserBackBean
中的 register()
方法。
再创建页面 user_list.xhtml
:
xmlns:h=“http://xmlns.jcp.org/jsf/html”
xmlns:c=“http://xmlns.jcp.org/jsp/jstl/core”>
<h:head>
</h:head>
<h:body>
<c:forEach items=“#{userBackBean.users}” var=“user”>
- #{user.username}
</c:forEach>
</h:body>
这里使用了 JSTL 标签库,提供了一系列的标签方法对数据进行迭代,访问和保存。
<c:forEach>
用来循环访问一个集合或数组中的元素。items
属性指定要循环的集合或数组的变量名,var
属性可自定义每个元素的变量名。在<c:forEach>
标签体里,定义<li>
标签显示每个用户的用户名。在
index.xhtml
页面, 在</h:body>
标签之前添加如下标签:Register
<h:form>
List All Users
</h:form>
<h:outputLink>
会生成对应的html<a>
标签,并跳转到value
属性定义的页面。<h:commandLink>
必须定义在<h:form>
标签里。<h:outputLink>
和<h:commandLink>
的不同之处在于<h:commandLink>
可以在页面跳转前,在后端bean中做一些操作,这里调用了UserBackBean
类中的getAllUsers()
来从数据库中查询所有用户并初始化users
变量, 以供user_list.xhtml
页面使用。配置 Maven
========
因为新增了两个模块,所以需要修改 notebookRoot 模块的
pom.xml
文件。这里添加了新的
<pluginManagement>
标签,可以提供统一管理插件的版本和通用配置的功能,这样可以在子模块中省略插件的版本号,并且继承一些插件的配置。maven-compiler-plugin
3.1
1.81.8
maven-war-plugin
2.3
maven-ejb-plugin
2.3
3.2
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新
如果你觉得这些内容对你有帮助,可以添加V获取:vip1024b (备注Java)
最后
由于篇幅有限,这里就不一一罗列了,20道常见面试题(含答案)+21条MySQL性能调优经验小编已整理成Word文档或PDF文档
还有更多面试复习笔记分享如下
一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
FKGB-1712639733520)]
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新
如果你觉得这些内容对你有帮助,可以添加V获取:vip1024b (备注Java)
[外链图片转存中…(img-bN3Ki5zy-1712639733521)]最后
由于篇幅有限,这里就不一一罗列了,20道常见面试题(含答案)+21条MySQL性能调优经验小编已整理成Word文档或PDF文档
[外链图片转存中…(img-SalVGo7Z-1712639733521)]
还有更多面试复习笔记分享如下
[外链图片转存中…(img-gsh3lrO1-1712639733521)]
一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
[外链图片转存中…(img-rWUYdo4N-1712639733522)]