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
ไม่มีความคิดเห็น :
แสดงความคิดเห็น