gpt4 book ai didi

java - 为什么 JSP(和 JSTL/EL)采用与 Servlet 或 JSF 不同的方式来执行资源注入(inject)?

转载 作者:行者123 更新时间:2023-12-02 00:35:04 25 4
gpt4 key购买 nike

要使 Servlet、JSP、JSF 等能够使用远程 EJB,执行资源注入(inject)至关重要。然而,JSP 采用与其他方法不同的方式将 EJB 注入(inject)其中。让我们通过示例来了解所有这些内容。

<小时/>

在 JSF 中,可以通过非常简单的方式注入(inject)远程 EJB,如以下 ManagedBean 中所示。 EJB 可以是有状态的、无状态的或单例的。

假设 session bean实现的接口(interface)是CustomerBeanRemote

@ManagedBean
@RequestScoped

public class AddSubscription
{
@EJB
private CustomerBeanRemote obj=null;

//Getters and setters.
}

此处,远程 EJB 只能在接口(interface)声明之前注入(inject)一个注释 @EJB。由于此处注入(inject)了 EJB,因此即使显式指定为 null,接口(interface)也能够调用 session bean 中的方法。 null 这里根本没有任何意义。

<小时/>

Servlet 采用与下所示相同的 View 。

public class Add extends HttpServlet {
{
@EJB
private CustomerBeanRemote obj=null;

//Rest of the elegant Servlet code goes here.
}
<小时/>

然而,JSP(和 JSTL/EL)采取不同的观点,如下所述。

try
{
obj=(CustomerBeanRemote )new
InitialContext().lookup(CustomerBeanRemote.class.getName());
}
catch(NamingException e)
{
out.println(e.getMessage());
}

obj.someEJBMethod();

<小时/>
try
{
obj=(CustomerBeanRemote )new
InitialContext().lookup("Specific JNDI");
}
catch(NamingException e)
{
out.println(e.getMessage());
}

obj.someEJBMethod();
<小时/>

为什么 JSP(或 JSTL/EL)需要 JNDI(Java 命名和目录接口(interface))来执行资源注入(inject),而在 Servlet 和 JSF 中,只需使用一个注释即可执行资源注入(inject),即 @EJB?

最佳答案

JSP 是一个 servlet,因此您当然应该能够在 JSP 中使用注释:

<%! @EJB private CustomerBeanRemote obj=null; %>

(未经测试)。

但即使它不起作用,这也不是问题,因为 JSP 无论如何都不应该包含 Java 代码。 JSP 应该用于从由 Java 编写的 Controller (Servlet 或您首选框架的操作)准备的 bean 生成标记。

参见How to avoid Java code in JSP files?

此外,您的代码片段是错误的:尽管在初始化它们时发生了命名异常,但它们使用了 obj 变量。这显然会导致 NullPointerException。

关于java - 为什么 JSP(和 JSTL/EL)采用与 Servlet 或 JSF 不同的方式来执行资源注入(inject)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8025460/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com