Java EE开发系列教程 - 使用EJB组件与JPA层交互,邮储银行测试岗面试

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

EJB Service 模块


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

<?xml version="1.0" encoding="UTF-8"?>

<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 文件内容,其实只是一个空的定义文件:

<?xml version="1.0" encoding="UTF-8"?>

<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 对象。

  • usernotebookDomain 模块中的 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>

Qiantu - A simple Notebook

</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.8

      1.8

      maven-war-plugin

      2.3

      maven-ejb-plugin

      2.3

      3.2

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

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

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

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

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

      如果你觉得这些内容对你有帮助,可以添加V获取:vip1024b (备注Java)
      img

      最后

      由于篇幅有限,这里就不一一罗列了,20道常见面试题(含答案)+21条MySQL性能调优经验小编已整理成Word文档或PDF文档

      MySQL全家桶笔记

      还有更多面试复习笔记分享如下

      Java架构专题面试复习

      一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
      img

      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)]

    • 16
      点赞
    • 17
      收藏
      觉得还不错? 一键收藏
    • 0
      评论
    评论
    添加红包

    请填写红包祝福语或标题

    红包个数最小为10个

    红包金额最低5元

    当前余额3.43前往充值 >
    需支付:10.00
    成就一亿技术人!
    领取后你会自动成为博主和红包主的粉丝 规则
    hope_wisdom
    发出的红包
    实付
    使用余额支付
    点击重新获取
    扫码支付
    钱包余额 0

    抵扣说明:

    1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
    2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

    余额充值