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