Въведение в JSF EL 2

1. Въведение

Expression Language (EL) е скриптов език, който се приема в много рамки на Java, като Spring с SpEL и JBoss с JBoss EL.

В тази статия ще се съсредоточим върху внедряването на JSF на този скриптов език - Unified EL.

Понастоящем EL е във версия 3.0, голямо надграждане, което позволява механизмът за обработка да се използва в самостоятелен режим - например на платформата Java SE. Предишните версии зависеха от сървър или уеб контейнер, съвместим с Джакарта EE. Тази статия разглежда EL версия 2.2.

2. Незабавна и отложена оценка

Основната функция на EL в JSF е да свързва JSF изгледа (обикновено XHTML маркиране) и базирания на Java back-end. Бек-ендът може да бъде създаден от потребителя управляван боб или управлявани от контейнери обекти като HTTP сесията.

Ще разгледаме EL 2.2. EL в JSF се предлага в две общи форми, непосредствен синтаксис EL и отложен синтаксис EL.

2.1. Непосредствен синтаксис EL

Иначе известен като JSP EL, това е скриптов формат, който е задържане от JSP дните на разработване на уеб приложения на Java.

Изразите на JSP EL започват със знака за долар ( $ ), след това последвани от лявата къдрава скоба ( { ), след това от действителния израз и накрая затворени с дясната къдрава скоба ( } ):

${ELBean.value > 0}

Този синтаксис:

  1. Оценява се само веднъж (в началото) в жизнения цикъл на дадена страница. Това означава, че стойността, която е. Четенето от израза в примера по-горе трябва да бъде настроено преди зареждането на страницата.
  2. Осигурява достъп само за четене до стойности на компоненти.
  3. В резултат на това се изисква спазване на конвенцията за именуване JavaBean.

За повечето приложения тази форма на EL не е много гъвкава.

2.2. Отложено изпълнение EL

EL отложено изпълнение е EL, предназначен за JSF. Основната синтактична разлика с JSP EL е, че е маркирана с „ #“ вместо с „ $ “.

#{ELBean.value > 0}

Отложено EL:

  1. Синхронизира се с жизнения цикъл на JSF. Това означава, че EL израз в отложен EL се оценява в различни точки при изобразяването на JSF страница (в началото и в края).
  2. Осигурява достъп за четене и запис до стойности на компоненти. Това позволява на човек да зададе стойност в JSF backing-bean (или някъде другаде), използвайки EL.
  3. Позволява на програмист да извиква произволни методи за обект и в зависимост от версията на EL, предава аргументи на такива методи.

Unified EL е спецификацията, която обединява както отложените EL, така и JSP EL, позволявайки и двата синтаксиса в една и съща страница.

3. Унифициран EL

Унифицираният EL позволява два основни варианта на изрази, изрази на стойност и изрази на методи.

И бърза бележка - следващите раздели ще покажат някои примери, които всички са налични в приложението (вижте връзката Github в края), като навигирате до:

//localhost:8080/jsf/el_intro.jsf

3.1. Стойни изрази

Изразът на стойност ни позволява или да четем, или да задаваме управлявано свойство на боб, в зависимост от това къде е поставено.

Следният израз чете свойство управляван боб на страницата:

Hello, #{ELBean.firstName}

Следващият израз обаче ни позволява да зададем стойност на потребителския обект:

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

3.2. Изрази на методите

Унифицираният EL предоставя изрази на методи за изпълнение на публични, нестатични методи от JSF страница. Методите могат да имат или не да имат върнати стойности.

Ето бърз пример:

Методът save (), за който се говори, е дефиниран в защитен бин с име ELBean.

Започвайки от EL 2.2, можете също да предавате аргументи на метода, който е достъпен с помощта на EL. Това може да ни позволи да пренапишем нашия пример по следния начин:

Това, което направихме тук, е да създадем обвързващ израз с обхват на страница за компонента inputText и директно да предадем атрибута стойност на израза на метода.

Обърнете внимание, че променливата се предава на метода без специални нотации, фигурни скоби или символи за излизане.

3.3. Неявни EL обекти

Двигателят JSF EL осигурява достъп до няколко обекта, управлявани от контейнери. Някои от тях са:

  • # {Application} : Предлага се също като # {servletContext} , това е обектът, представляващ екземпляра на уеб приложението
  • # {applicationScope} : карта на променливи, достъпна за цялото уеб приложение
  • # {Cookie} : карта на променливите HTTP Cookie
  • # {facesContext} : текущият екземпляр на FacesContext
  • # {flash} : обхватът на JSF Flash
  • # {header} : карта на HTTP заглавията в текущата заявка
  • # {initParam} : карта на променливите за инициализация на контекста на уеб приложението
  • # {param} : карта на параметрите на заявката за HTTP заявка
  • #{request}: the HTTPServletRequest object
  • #{requestScope}: a request-scoped map of variables
  • #{sessionScope}: a session-scoped map of variables
  • #{session}: the HTTPSession object
  • #{viewScope}: a view (page-) scoped map of variables

The following simple example lists all the request headers and values by accessing the headers implicit object:

#{header.key}#{header.value}

4. What You Can Do in EL

In its versatility, EL can be featured in Java code, XHTML markup, Javascript and even in JSF configuration files like the faces-config.xml file. Let's examine some concrete use-cases.

4.1. Use EL in Page Markup

EL can be featured in standard HTML tags:

4.2. Use EL in JavaScript

EL will be interpreted when encountered in Javascript or tags:

 var theVar = #{ELBean.firstName};

A backing bean variable will be set as a javascript variable here.

4.3. Evaluate Boolean Logic in EL Using Operators

EL supports fairly advanced comparison operators:

  • eq equality operator, equivalent to “==.”
  • lt less than operator, equivalent to “<.”
  • le less than or equal to operator, equivalent to “<=.”
  • gt greater than operator, equivalent to “>.”
  • ge greater than or equal, equivalent to “>=.

4.4. Evaluate EL in a Backing Bean

From within the backing bean code, one can evaluate an EL expression using the JSF Application. This opens up a world of possibilities, in connecting the JSF page with the backing bean. You could retrieve implicit EL objects, or retrieve actual HTML page components or their value easily from the backing bean:

FacesContext ctx = FacesContext.getCurrentInstance(); Application app = ctx.getApplication(); String firstName = app.evaluateExpressionGet(ctx, "#{firstName.value}", String.class); HtmlInputText firstNameTextBox = app.evaluateExpressionGet(ctx, "#{firstName}", HtmlInputText.class);

This allows the developer a great deal of flexibility in interacting with a JSF page.

5. What You Can Not Do in EL

EL < 3.0 does have some limitations. The following sections discuss some of them.

5.1. No Overloading

EL doesn’t support the use of overloading. So in a backing bean with the following methods:

public void save(User theUser); public void save(String username); public void save(Integer uid);

JSF EL will not be able to properly evaluate the following expression

The JSF ELResolver will introspect the class definition of bean, and pick the first method returned by java.lang.Class#getMethods (a method that returns the methods available in a class). The order of the methods returned is not guaranteed and this will inevitably result in undefined behaviour.

5.2. No Enums or Constant Values

JSF EL < 3.0, doesn’t support the use of constant values or Enums in the script. So, having any of the following

public static final String USER_ERROR_MESS = "No, you can’t do that"; enum Days { Sat, Sun, Mon, Tue, Wed, Thu, Fri };

means that you won’t be able to do the following

5.3. No Built-in Null Safety

JSF EL < v3.0 doesn’t provide implicit null safe access, which some may find odd about a modern scripting engine.

So if person in the expression below is null, the entire expression fails with an unsightly NPE

Hello Mr, #{ELBean.person.surname}"

6. Conclusion

Разгледахме някои от основите на JSF EL, силни страни и ограничения.

Това е до голяма степен универсален скриптов език с малко възможности за подобрение; това е и лепилото, което свързва JSF изгледа с JSF модела и контролера.

Изходният код, придружаващ тази статия, е достъпен на GitHub.