วันเสาร์ที่ 7 พฤษภาคม พ.ศ. 2559

Expression Language in Java EE 7


Expression Language 3



Overview

-EL ครั้งแรกใน JSTL 1
-ย้ายไป JSP 2
-แบบครบวงจรกับ JSF 1.2 ใน JSP 2.1
-สเปคตอนนี้เป็นอิสระ
-ใช้ใน JSF, JSP, CDI, BV และอื่น ๆ

New Feature Summary

-Stand-alone API
-New operators
-Static field และ method references
-Custom type converters
-Lambda expressions
-Collection construction
-Collection/lambda operations

Support for stand-alone environments

-ให้มาตรฐาน ELResolver และ ELContext
-การประเมินผลการแสดงออกโดยตรง

ELProcessor elp = new ELProcessor();
Object message = elp.eval(“’Welcome ‘ += user.name”);

Defining functions and variables

ELProcessor elp = new ELProcessor();
elp.defineFunction(“func”, “ns”, “test.MyClass”, “funcname”);
elp.setVariable(“var”, “user.name”);

Defining beans

ELProcessor elp = new ELProcessor();
ELManager elm = elp.getELManager();
// Define a bean on the fly, into local bean repository
elm.definBean(“name”, new Name(“Peter”));
// Add a map to bean look-up
elm.addBeanNameResolver(new BeanNameResolver() {
  @Override
  public Object getBean(String name) {
     return myDB.get(name);
  }
});

String concatenation operator +=
ไม่สามารถใช้ + เพราะถูกใช้ไปแล้วสำหรับการดำเนินการทางคณิตศาสตร์

ELProcessor elp = new ELProcessor();
elp.eval(“’Welcome ‘ += user.name”);

Assignment operator =

สามารถกำหนดให้กับ Bean ที่มีอยู่ หรือสร้างแบบ Dynamic Bean ใหม่สำหรับค่า จากการจัดการโดย ELResolver.setValue

ELProcessor elp = new ELProcessor();
elp.eval(“xx = user.name);
elp.eval(“’Welcome ‘ += xx”);

Semicolon operator ;

เป็นประโยชน์สำหรับการแสดงผลข้างเคียงในการแสดงออกที่มีความซับซ้อน
ELProcessor elp = new ELProcessor();
elp.eval(“xx = user.name; ‘Welcome ‘ += xx”);

Custom type converters
-อนุญาตให้สร้างปลั๊กอินในรูปแบบที่กำหนดการแปลงเอง

elp.getELManager().addELResolver(new TypeConverter() {
  @Override
  public Object convertToType(ELContext context, Object obj, Class<?> type) {
    if (obj instanceof String && type == MyBean.class) {
      context.setPropertyResolved(true);
      return new MyBean((String) obj);
    }
    return null;
  }
});
       
Object val = elp.getValue("'John Doe'", MyBean.class);

Static field and method references

-รวมถึงค่าคงที่ enum
-Class จะต้องนำเข้ามาก่อนที่สมาชิกคงที่สามารถอ้างอิงได้

ELProcessor elp = new ELProcessor();
ELManager elm = elp.getELManager();
Elm.importClass(“com.acme.MyClass”);
elp.eval(“MyClass.staticName”);

Static field and method references
-java.lang package is pre-imported

ELProcessor elp = new ELProcessor();
elp.eval("Boolean.TRUE");
elp.eval("Integer.numberOfTrailingZeros(16)");

Lambda expressions

-syntax เหมือน Java SE 8
-มีพฤติกรรม anonymous function
-โครงสร้างประกอบด้วย EL expression
-การเข้าถึงไปยังสภาพแวดล้อมของ EL

x -> x+1
(x,y) -> x+y
() -> 64

Lambda expression: immediate evaluation

(x -> x+1)(10)-> 11
((x,y)->x+y)(3,4)-> 7
(()->64)()-> 64

Lambda expression: indirect evaluation

-lambda สามารถตั้งชื่อและประเมินผลทางอ้อม
-recursive invocation

incr = x -> x+1; incr(10)-> 11
fact = n->n==0? 1: n*fact(n-1); fact(5)-> 120

Lambda expression: as javax.el.LambdaExpression

-lambda จะห่อหุ้มด้วย javax.el.LambdaExpression

LambdaExpression lamb = (LambdaExpression)elp.eval(“x->x+1”);
lamb.invoke(10);
elp.eval(“[1,2,3].stream().map(x->x+1).toList()”);

Collection constructions

Sets, lists และ maps ในโครงสร้างได้

Set: {1,2,3}
List: [“eenie”, “meenie”, “miney”, “mo”]
Map: {‘one’:1, ‘two’:2}
Composite: {‘joe’: [‘m’,25], ‘amy’: [‘f’,18]}

Collection operations: overview

-มีอิทธิพลจาก JDK 8
-Implemented ด้วย lambda และจากการเรียก method
-ช่วยสร้าง syntax/pattern ที่ง่ายขึ้น
-มีประมาณ 20 operations

Collection operations: stream and pipeline

-stream ของ collection objects
-การดำเนินงานจะถูกผูกมัดกันในรูปแบบ Pipeline
-Pipeline: source stream, intermediate operations, terminal operation

To list history book titles:
books.stream().filter(b->b.category == ‘history’)
              .map(b->b.title)
              .toList()

Collection operations: examples

customers.stream().filter(c->c.country=='USA’)
                  .flatMap(c->c.orders.stream())
                  .toList()

[1,3,5,2].stream().sorted().toList() people.stream().sorted((p,q)->p.name.compareTo(q.name))                .toList()
[1,2,3,4].stream().reduce(0, (a,i)->a+i)) [1,2,3,4].stream().sum()

Summary

-EL 3 นำการเปลี่ยนแปลงที่สำคัญ
-นำทรัพยากรจาก Java EE 7 และมุมมองของระบบนิเวศของทรัพยากรมาพัฒนา

Resources
-EL project page
https://java.net/projects/el-spec/
-Glassfish 4
https://glassfish.java.net/

Reference : เอกสาร What’s New with Expression Language in Java EE 7 โดย Reza Rahman (Java EE/GlassFish Evangelist) จาก Oracle ในงาน JavaOne
top.sk Web Developer

I can design web applications by using Java Server Faces (JSF), Primefaces, EJB3, SQL, DB2 (IBM) and designing report (Word, Excel and PDF) by using XML Script and Crystal Clear Report for the organization that can be easily and no problem for used and they can use the Web to manage the customer's organization effectively. I want to learn a new culture, technology and colleagues involved in the IT profession.

ไม่มีความคิดเห็น :

แสดงความคิดเห็น