Struts 2 - Giá trị Stack / OGNL
Ngăn xếp giá trị
Ngăn xếp giá trị là một tập hợp một số đối tượng giữ các đối tượng sau theo thứ tự đã cho:
Sr.No | Đối tượng & Mô tả |
---|---|
1 | Temporary Objects Có nhiều đối tượng tạm thời khác nhau được tạo ra trong quá trình thực thi một trang. Ví dụ: giá trị lặp lại hiện tại cho một tập hợp đang được lặp lại trong thẻ JSP. |
2 | The Model Object Nếu bạn đang sử dụng các đối tượng mô hình trong ứng dụng thanh chống của mình, thì đối tượng mô hình hiện tại được đặt trước hành động trên ngăn xếp giá trị. |
3 | The Action Object Đây sẽ là đối tượng hành động hiện tại đang được thực thi. |
4 | Named Objects Các đối tượng này bao gồm #application, #session, #request, #attr và #parameters và tham chiếu đến các phạm vi servlet tương ứng. |
Có thể truy cập ngăn xếp giá trị thông qua các thẻ được cung cấp cho JSP, Velocity hoặc Freemarker. Có nhiều thẻ khác nhau mà chúng ta sẽ nghiên cứu trong các chương riêng biệt, được sử dụng để lấy và đặt ngăn xếp giá trị struts 2.0. Bạn có thể lấy đối tượng valueStack bên trong action của mình như sau:
ActionContext.getContext().getValueStack()
Khi bạn có đối tượng ValueStack, bạn có thể sử dụng các phương pháp sau để thao tác đối tượng đó:
Sr.No | Mô tả & Phương thức ValueStack |
---|---|
1 | Object findValue(String expr) Tìm một giá trị bằng cách đánh giá biểu thức đã cho so với ngăn xếp theo thứ tự tìm kiếm mặc định. |
2 | CompoundRoot getRoot() Lấy CompoundRoot để giữ các đối tượng được đẩy lên ngăn xếp. |
3 | Object peek() Lấy đối tượng lên trên cùng của ngăn xếp mà không làm thay đổi ngăn xếp. |
4 | Object pop() Lấy đối tượng ở trên cùng của ngăn xếp và loại bỏ nó khỏi ngăn xếp. |
5 | void push(Object o) Đặt đối tượng này lên trên cùng của ngăn xếp. |
6 | void set(String key, Object o) Đặt một đối tượng trên ngăn xếp bằng khóa đã cho để nó có thể truy xuất được bằng findValue (key, ...) |
7 | void setDefaultType(Class defaultType) Đặt loại mặc định để chuyển đổi thành nếu không có loại nào được cung cấp khi nhận giá trị. |
số 8 | void setValue(String expr, Object value) Cố gắng đặt một thuộc tính trên bean trong ngăn xếp với biểu thức đã cho bằng cách sử dụng thứ tự tìm kiếm mặc định. |
9 | int size() Lấy số đối tượng trong ngăn xếp. |
OGNL
Các Object-Graph Navigation Language(OGNL) là một ngôn ngữ biểu thức mạnh mẽ được sử dụng để tham chiếu và thao tác dữ liệu trên ValueStack. OGNL cũng giúp truyền dữ liệu và chuyển đổi kiểu.
OGNL rất giống với Ngôn ngữ biểu thức JSP. OGNL dựa trên ý tưởng có đối tượng gốc hoặc đối tượng mặc định trong ngữ cảnh. Các thuộc tính của đối tượng mặc định hoặc gốc có thể được tham chiếu bằng cách sử dụng ký hiệu đánh dấu, là ký hiệu bảng Anh.
Như đã đề cập trước đó, OGNL dựa trên một ngữ cảnh và Struts xây dựng một bản đồ ActionContext để sử dụng với OGNL. Bản đồ ActionContext bao gồm:
Application - Các biến phạm vi ứng dụng
Session - Các biến phạm vi phiên
Root / value stack - Tất cả các biến hành động của bạn được lưu trữ tại đây
Request - Yêu cầu các biến phạm vi
Parameters - Yêu cầu tham số
Atributes - Các thuộc tính được lưu trữ trong phạm vi trang, yêu cầu, phiên và ứng dụng
Điều quan trọng là phải hiểu rằng đối tượng Action luôn có sẵn trong ngăn xếp giá trị. Vì vậy, nếu đối tượng Action của bạn có thuộc tính“x” và “y” có sẵn cho bạn sử dụng.
Các đối tượng trong ActionContext được tham chiếu bằng ký hiệu pound, tuy nhiên, các đối tượng trong ngăn xếp giá trị có thể được tham chiếu trực tiếp.
Ví dụ, nếu employee là một thuộc tính của một lớp hành động, sau đó nó có thể được tham chiếu như sau:
<s:property value = "name"/>
thay vì
<s:property value = "#name"/>
Nếu bạn có một thuộc tính trong phiên gọi là "đăng nhập", bạn có thể truy xuất thuộc tính đó như sau:
<s:property value = "#session.login"/>
OGNL cũng hỗ trợ xử lý các tập hợp - cụ thể là Bản đồ, Danh sách và Tập hợp. Ví dụ: để hiển thị danh sách màu thả xuống, bạn có thể làm:
<s:select name = "color" list = "{'red','yellow','green'}" />
Biểu thức OGNL rất thông minh khi diễn giải "đỏ", "vàng", "xanh lá cây" là các màu và xây dựng danh sách dựa trên đó.
Các biểu thức OGNL sẽ được sử dụng nhiều trong các chương tiếp theo khi chúng ta sẽ nghiên cứu các thẻ khác nhau. Vì vậy, thay vì xem xét chúng một cách riêng lẻ, chúng ta hãy xem xét nó bằng cách sử dụng một số ví dụ trong phần Thẻ biểu mẫu / Thẻ điều khiển / Thẻ dữ liệu và Thẻ Ajax.
Ví dụ về ValueStack / OGNL
Tạo hành động
Chúng ta hãy xem xét lớp hành động sau đây, nơi chúng ta đang truy cập valueStack và sau đó thiết lập một số khóa mà chúng ta sẽ truy cập bằng OGNL trong chế độ xem của chúng ta, tức là trang JSP.
package com.tutorialspoint.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("Size of the valueStack: " + stack.size());
return "success";
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
Trên thực tế, Struts 2 thêm hành động của bạn lên đầu valueStack khi được thực thi. Vì vậy, cách thông thường để đặt nội dung trên Value Stack là thêm getters / setters cho các giá trị vào lớp Hành động của bạn và sau đó sử dụng thẻ <s: property> để truy cập các giá trị. Nhưng tôi đang chỉ cho bạn cách ActionContext và ValueStack hoạt động chính xác trong thanh chống.
Tạo chế độ xem
Hãy để chúng tôi tạo tệp jsp dưới đây HelloWorld.jsptrong thư mục WebContent trong dự án nhật thực của bạn. Chế độ xem này sẽ được hiển thị trong trường hợp hành động trả về thành công -
<%@ 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 tôi cũng cần tạo index.jsp trong thư mục WebContent có nội dung như sau:
<%@ 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">Please enter your name</label><br/>
<input type = "text" name = "name"/>
<input type = "submit" value = "Say Hello"/>
</form>
</body>
</html>
Tệp cấu hình
Sau đây là nội dung của struts.xml tập tin -
<?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.tutorialspoint.struts2.HelloWorldAction"
method = "execute">
<result name = "success">/HelloWorld.jsp</result>
</action>
</package>
</struts>
Sau đây là nội dung của web.xml tập tin -
<?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>
Nhấp chuột phải vào tên dự án và nhấp vào Export > WAR Fileđể tạo tệp Chiến tranh. Sau đó, triển khai WAR này trong thư mục ứng dụng web của Tomcat.
Cuối cùng, khởi động máy chủ Tomcat và cố gắng truy cập URL http://localhost:8080/HelloWorldStruts2/index.jsp. Điều này sẽ tạo ra màn hình sau
Bây giờ nhập bất kỳ từ nào vào hộp văn bản đã cho và nhấp vào nút "Say Hello" để thực hiện hành động đã xác định. Bây giờ, nếu bạn kiểm tra nhật ký đã tạo, bạn sẽ tìm thấy văn bản sau ở dưới cùng:
Size of the valueStack: 3
Thao tác này sẽ hiển thị màn hình sau, màn hình này sẽ hiển thị bất kỳ giá trị nào bạn sẽ nhập và giá trị của key1 và key2 mà chúng ta đã đặt trên ValueStack.