Bộ sưu tập

Trả về kiểu dữ liệu JSON trong Struts 2


https://codersontrang.com/2014/10/01/tra-ve-kieu-du-lieu-json-trong-struts-2/

Bài viết này sẽ hướng dẫn bạn đọc cách để thao tác với kiểu dữ liệu JSON trong Struts 2. Bản thân Struts2 đã cung cấp sẵn một json-plugin đảm nhận nhiệm vụ chuyển một đối tượng cùng với các thuộc tính của nó về kiểu dữ liệu JSON, bản thân người lập trình viên sẽ cần biết làm sao để cấu hình và sử dụng plugin này.

Tạo một Maven project có cấu trúc thư mục như hình dưới đây:

codersontrang_strut2json_1

pom.xml

 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">  
  <modelVersion>4.0.0</modelVersion>  
  <groupId>codersontrang.example</groupId>  
  <artifactId>struts2-resulttype-json</artifactId>  
  <packaging>war</packaging>  
  <version>0.0.1-SNAPSHOT</version>  
  <name>struts2-resulttype-json Maven Webapp</name>  
  <url>http://maven.apache.org</url>  
  <dependencies>  
    <dependency>  
           <groupId>org.apache.struts</groupId>  
           <artifactId>struts2-core</artifactId>  
           <version>2.3.16</version>  
       </dependency>   
       <dependency>  
           <groupId>org.apache.struts</groupId>  
           <artifactId>struts2-json-plugin</artifactId>  
           <version>2.3.16</version>  
       </dependency>  
  </dependencies>  
  <build>  
   <finalName>struts2-resulttype-json</finalName>  
  </build>  
 </project>  

MyObject.java

 package struts2.domain;  

 public class MyObject {  
      private String myObjectProperty = "my obj property";  

      public String getMyObjectProperty() {  
           return myObjectProperty;  
      }  
      public void setMyObjectProperty(String myObjectProperty) {  
           this.myObjectProperty = myObjectProperty;  
      }  
 }  

MyEnum.java

 package struts2.enums;  
 public enum MyEnum {  
      NO_1("no1"),  
      NO_2("no2");  

      private String name;  
      private MyEnum(String name){  
           this.name = name;  
      }  
      public String getName() {  
           return name;  
      }  
      public void setName(String name) {  
           this.name = name;  
      }  
 }  

BaseModel.java

 package struts2.model;  
 public class BaseModel {  

      private String baseModelProperty = "base model property";  

      public String getBaseModelProperty() {  
           return baseModelProperty;  
      }  
      public void setBaseModelProperty(String baseModelProperty) {  
           this.baseModelProperty = baseModelProperty;  
      }  
 }  

MyJsonModel kế thừa từ BaseModel

MyJsonModel.java

 package struts2.model;  

 import java.util.Arrays;  
 import java.util.List;  
 import struts2.domain.MyObject;  
 import struts2.enums.MyEnum;  

 public class MyJsonModel extends BaseModel{  
      private Integer anInt = 1;  
      private String aString = "my string";  
      private Double [] anArrayDouble = {1.2, 2.3, 3.4};  
      private List<Long> aListLong = Arrays.asList(100L, 200L, 300L);  
      private MyObject anObject = new MyObject();  
      private MyEnum anEnum = MyEnum.NO_1;  

      public Integer getAnInt() {  
           return anInt;  
      }  
      public void setAnInt(Integer anInt) {  
           this.anInt = anInt;  
      }  
      public String getaString() {  
           return aString;  
      }  
      public void setaString(String aString) {  
           this.aString = aString;  
      }  
      public Double[] getAnArrayDouble() {  
           return anArrayDouble;  
      }  
      public void setAnArrayDouble(Double[] anArrayDouble) {  
           this.anArrayDouble = anArrayDouble;  
      }  
      public List<Long> getaListLong() {  
           return aListLong;  
      }  
      public void setaListLong(List<Long> aListLong) {  
           this.aListLong = aListLong;  
      }  
      public MyObject getAnObject() {  
           return anObject;  
      }  
      public void setAnObject(MyObject anObject) {  
           this.anObject = anObject;  
      }  
      public MyEnum getAnEnum() {  
           return anEnum;  
      }  
      public void setAnEnum(MyEnum anEnum) {  
           this.anEnum = anEnum;  
      }  
 }  

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>   
    <package name="my-package" namespace="/action" extends="json-default">   
      ....
    </package>   
  </struts>   

Để sử dụng kiểu dữ liệu JSON, các package của ta phải kế thừa từ package của Struts là json-default. Và để quy định một action sẽ trả về kiểu dữ liệu JSON, ta sử dụng thẻ <result type="json">

Dưới đây là danh sách liệt kê một số các cấu hình tùy chọn khi thao tác với kiểu dữ liệu JSON trong Struts2

1. Mặc định

  <action name="get-json-data-default" class="struts2.actions.MyJsonAction" method="getJsonData">  
         <result name="success" type="json"></result>   
  </action>  

Mặc định struts plugin sẽ biến model và các thuộc tính của nó thành kiểu dữ liệu JSON (không bao gồm các thuộc tính kế thừa từ BaseModel)

codersontrang_strut2json_2

2. Hierachy

 <action name="get-json-data-hierachy" class="struts2.actions.MyJsonAction" method="getJsonData">  
      <result name="success" type="json">  
           <param name="ignoreHierarchy">false</param>  
      </result>   
 </action>  

Để bao gồm các thuộc tính kế thừa từ BaseModel trong JSON, ta đặt giá trị cho ignoreHierachyfalse (mặc định là true)

codersontrang_strut2json_3

3. Root

 <action name="get-json-data-root" class="struts2.actions.MyJsonAction" method="getJsonData">  
      <result name="success" type="json">  
           <param name="root">model.anObject</param>  
      </result>   
 </action>  

Dữ liệu JSON trả về không nhất thiết phải là cả model to, để trả về một phần nào đó trong model, ta đặt giá trị cho tham số root

codersontrang_strut2json_4

4. Wrapping

 <action name="get-json-data-wrapping" class="struts2.actions.MyJsonAction" method="getJsonData">  
       <result name="success" type="json">  
           <param name="wrapPrefix">/*</param>  
            <param name="wrapSuffix">*/</param>  
       </result>   
 </action>  

Để nối vào đầu hoặc đuôi của dữ liệu JSON trả về, ta khai báo phần được nối thêm bằng cách lần lượt sử dụng hai tham số wrapPrefixwrapSuffix tương ứng

codersontrang_strut2json_5

5. Error code

 <action name="get-json-data-error-code" class="struts2.actions.MyJsonAction" method="getJsonData">  
       <result name="success" type="json">  
           <param name="errorCode">404</param>  
       </result>   
 </action>  

Để trả về một response với mã lỗi, ta sử dụng tham số errorCode

codersontrang_strut2json_7

6. Một số các setting khác

 <action name="get-json-data-misc" class="struts2.actions.MyJsonAction" method="getJsonData">  
       <result name="success" type="json">  
           <param name="enableGZIP">true</param>  
           <param name="noCache">true</param>  
           <param name="enumAsBean">true</param>  
       </result>   
 </action>  

Ngoài ra còn các thuộc tính khác nữa như

  • enableGZIP: đặt bằng true để nén dữ liệu JSON trả về theo kiểu GZIP
  • noCache: đặt bằng true (mặc định là false) có nghĩa là response được trả về sẽ không phải là giá trị được lưu trong cache
  • enumAsBean: Coi đối tượng enum như một đối tượng của một lớp bình thường, khi trả về JSON sẽ có thêm các thông tin khác liên quan đến đối tượng enum

codersontrang_strut2json_6

Good luck!

Advertisements
By Coder Sơn Trang Posted in Struts2 Tagged

Trả lời

Mời bạn điền thông tin vào ô dưới đây hoặc kích vào một biểu tượng để đăng nhập:

WordPress.com Logo

Bạn đang bình luận bằng tài khoản WordPress.com Đăng xuất /  Thay đổi )

Google photo

Bạn đang bình luận bằng tài khoản Google Đăng xuất /  Thay đổi )

Twitter picture

Bạn đang bình luận bằng tài khoản Twitter Đăng xuất /  Thay đổi )

Facebook photo

Bạn đang bình luận bằng tài khoản Facebook Đăng xuất /  Thay đổi )

Connecting to %s