วันเสาร์ที่ 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

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

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