Value Stack/OGNL trong Struts 2




Mục đích của chương này là giới thiệu sơ qua về ValueStack và OGNL trong Struts 2.

ValueStack trong Struts 2

Một ValueStack, nói đơn giản là một stack mà chứa các đối tượng cụ thể của ứng dụng như đối tượng action, đối tượng model, đối tượng tạm thời, đối tượng đã được đặt tên như #application, #request, #session, #attr, và #parameters khác.

Tại thời điểm thực thi, action được đặt ở trên cùng của stack. Chúng ta có thể đặt các đối tượng trong ValueStack, truy vấn nó và xóa nó. Value Stack có thể được truy cập thông qua các tag được cung cấp cho JSP, Velocity hoặc Freemarker. Bạn có thể lấy đối tượng valueStack bên trong action của bạn, như sau:

ActionContext.getContext().getValueStack()

Khi bạn đã có đối tượng ValueStack, bạn có thể sử dụng các phương thức sau để thao tác đối tượng đó. Dưới đây là một số phương thức được sử dụng phổ biến trong ValueStack Interface:

public String findString(String expr): Tìm chuỗi bởi ước lượng biểu thức expr đã cho.

public Object findValue(String expr): Tìm giá trị bởi ước lượng biểu thức expr đã cho.

public Object findValue(String expr, Class c): Tìm giá trị bởi ước lượng biểu thức expr đã cho.

public Object peek(): Trả về đối tượng được đặt ở trên cùng của stack.

public Object pop(): Trả về đối tượng được đặt ở trên cùng của stack và xóa nó.

public void push(Object o): Đặt đối tượng vào trên cùng của stack.

public void set(String key, Object value): Thiết lập đối tượng trên stack với key đã cho. Nó có thể được lấy bằng cách gọi phương thức findValue(key).

public int size(): Trả về số đối tượng từ stack.

OGNL trong Struts 2

OGNL, là viết tắt của Object Graph Navigation Language, là một ngôn ngữ diễn đạt mạnh mẽ được sử dụng để tham chiếu và thao tác dữ liệu trên ValueStack. Nó làm đơn giản hóa khả năng truy cập của dữ liệu được lưu trữ trong ActionContext. Ngoài ra, OGNL cũng giúp truyền tải và chuyển đổi kiểu của dữ liệu.

Struts Framework thiết lập ValueStack như là đối tượng root của OGNL. Bạn chú ý rằng đối tượng action được đẩy vào trong ValueStack. Ví dụ, chúng ta có thể trực tiếp truy cập thuộc tính của lớp action như sau:

 <s:property value="username"/>

Struts Framework cũng đặt các đối tượng khác trong ActionContext, biểu diễn các ánh xạ request, session, application. Để lấy các giá trị này, chúng ta cần sử dụng ký hiệu #. Ví dụ, để lấy dữ liệu từ phạm vi session, bạn cần sử dụng #session như trong ví dụ sau:

<s:property name="#session.username"/>

hoặc

<s:property name="#session['username']"/>

Ví dụ ValueStack/OGNL trong Struts 2

Tạo action

Trong lớp action sau, chúng ta truy cập valueStack và sau đó thiết lập một số key mà chúng ta sẽ truy cập bởi sử dụng OGNL trong JSP page.

package com.vietjack.struts2;

import java.util.*; 

import com.opensymphony.xwork2.util.ValueStack;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;

public class HelloWorldAction extends ActionSupport{
   private String name;

   public String execute() throws Exception {
      ValueStack stack = ActionContext.getContext().getValueStack();
      Map<String, Object> context = new HashMap<String, Object>();

      context.put("key1", new String("This is key1")); 
      context.put("key2", new String("This is key2"));
      stack.push(context);

      System.out.println("Kich co cua valueStack la: " + stack.size());
      return "success";
   }  

   public String getName() {
      return name;
   }

   public void setName(String name) {
      this.name = name;
   }
}

Tạo các View

Tạo HelloWorld.jsp trong WebContent. View này sẽ được hiển thị trong trường hợp action trả về success:

<%@ page contentType="text/html; charset=UTF-8" %>
<%@ taglib prefix="s" uri="/struts-tags" %>
<html>
<head>
<title>Hello World</title>
</head>
<body>
   Entered value : <s:property value="name"/><br/>
   Value of key 1 : <s:property value="key1" /><br/>
   Value of key 2 : <s:property value="key2" /> <br/>
</body>
</html>

Chúng ta cũng cần tạo index.jsp trong WebContent. Nội dung của nó là:

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
   pageEncoding="ISO-8859-1"%>
<%@ taglib prefix="s" uri="/struts-tags"%>
   <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" 
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>Hello World</title>
</head>
<body>
   <h1>Hello World From Struts2</h1>
   <form action="hello">
      <label for="name">Nhap ten cua ban</label><br/>
      <input type="text" name="name"/>
      <input type="submit" value="Xin chao!"/>
   </form>
</body>
</html>

Các file cấu hình

struts.xml

 
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
    "http://struts.apache.org/dtds/struts-2.0.dtd">

<struts>
   <constant name="struts.devMode" value="true" />
   <package name="helloworld" extends="struts-default">

      <action name="hello" 
         class="com.vietjack.struts2.HelloWorldAction" 
         method="execute">
         <result name="success">/HelloWorld.jsp</result>
      </action>

   </package>
</struts>

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xmlns="http://java.sun.com/xml/ns/javaee" 
   xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
   xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
   http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
   id="WebApp_ID" version="3.0">
   
   <display-name>Struts 2</display-name>
   <welcome-file-list>
      <welcome-file>index.jsp</welcome-file>
   </welcome-file-list>
   <filter>
      <filter-name>struts2</filter-name>
      <filter-class>
         org.apache.struts2.dispatcher.FilterDispatcher
      </filter-class>
   </filter>

   <filter-mapping>
      <filter-name>struts2</filter-name>
      <url-pattern>/*</url-pattern>
   </filter-mapping>
</web-app>

Cuối cùng, bạn khởi động Server và kiểm tra kết quả. Nếu bạn kiểm tra log, bạn sẽ thấy dòng text sau ở cuối cùng:

 
Kich co cua valueStack la: 3