Почему JSP (и JSTL / EL) используют другой способ выполнения внедрения ресурса, чем тот, который используется сервлетом или JSF? - PullRequest
0 голосов
/ 06 ноября 2011

Чтобы позволить сервлету, JSP, JSF и т. Д. Использовать удаленный EJB , необходимо выполнить внедрение ресурсов.JSP, однако, использует для вставки EJB-компонент другой способ, чем остальные.давайте рассмотрим их все на примере.


В JSF удаленный EJB-компонент может быть внедрен очень простым способом, как это можно увидеть в следующем ManagedBean.EJB может быть с состоянием, без состояния или синглтоном.

Предположим, что интерфейс, который реализуется сессионным компонентом, а именно: CustomerBeanRemote

@ManagedBean
@RequestScoped

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

    //Getters and setters.
}

Здесь удаленный EJBможет быть введен только с одной аннотацией @ EJB непосредственно перед объявлением интерфейса.Поскольку EJB внедряется здесь, интерфейс может вызывать методы в сессионном компоненте, даже если ему явно присвоено значение null.здесь значение null не имеет никакого смысла.


Сервлет принимает то же представление, что и показано ниже.

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) для выполненияВнедрение ресурсов в Servlet и JSF может быть выполнено только с одной аннотацией @ EJB ?

1 Ответ

3 голосов
/ 06 ноября 2011

JSP - это сервлет, поэтому вы, безусловно, сможете использовать аннотацию в JSP:

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

(хотя и не проверено).

Но даже если это не такЭто не проблема, потому что JSP не должны содержать Java-код .JSP должны использоваться для генерации разметки из bean-компонентов, подготовленных контроллером (сервлетом или действием предпочитаемой вами среды), написанным на Java.

См. Как избежать использования кода Java в файлах JSP?

Кроме того, ваши фрагменты кода неверны: они используют переменную obj, хотя при их инициализации произошло исключение именования.Это, очевидно, приведет к исключению NullPointerException.

...