1. 程式人生 > >[struts2.x] 通過Map從前端傳遞動態擴充套件的屬性

[struts2.x] 通過Map從前端傳遞動態擴充套件的屬性

應用背景簡介:

這兩天有個開發任務,為了滿足多個資源使用統一管理模組管理,需要提供自定義動態屬性配置,從而不需要修改後臺程式碼,可以滿足經常變化的屬性需求。後臺的其它部分,在後續其它文章中總結,這裡主要介紹一下如何將這些動態屬性傳遞到後臺。

這裡,我們使用的MVC框架是struts,從前端傳值到後臺,使用struts可以輕鬆完成POJO的值注入。如果我們要完成動態屬性定義,就不可能預先知道這個屬性的key,所以不可能預先在POJO中定義對應的成員變數。所以,需要有個可以接受未定義的屬性值,而且還能接收到這個key。首先,想到的是使用Map。到底可以嗎,我們實戰看看。

實戰概況:

開始測試想法,環境配置同之前的文章,不做詳述,首先寫一個接受action,。

/**

 * 測試是否可以通過map接收前端傳參

 *

 * @author linjx

 * @date 2014-7-29

 * @version 1.0.0

 */

@ParentPackage(value = "json-default")

public class MapInputTestAction {

    private Map<String,Object> map;

    @Action(value="/map/input", results= {@Result(name = ActionSupport.SUCCESS, type="json")})

    public

String input() {

        System.out.println(getMap());

        return ActionSupport.SUCCESS;

    }

    public Map<String,Object> getMap() {

        return map;

    }

    public void setMap(Map<String, Object> map) {

        this.map = map;

    }

}

上述action只有一個私有變數,實現方式並不需要指定。

然後前端jsp,不講究具體樣式

<%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>

<!DOCTYPE html PUBLIC "-//W3C//DTDXHTML 1.0 Frameset//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">

    <head>

        <title>map測試介面</title>

    </head>

    <body background="${images}/bonjour-bg.jpg">

        <form name="map-form"action="${ctx}/map/input.action" method="post">

            <br/><br/>

            <label>編號:</label><input type="text"name="map.code"/><br/>

            <label>名稱:</label><input type="text"name="map.name"/><br/>

            <label>性別:</label><input type="text"name="map.sex"/><br/>

            <label>年齡:</label><input type="text"name="map.age"/><br/>

            <input type="submit"value="提交"/>

        </form>

    </body>

</html>

對應輸入介面:


點選提交後介面跳轉到/map/input.action介面,結果為json字串,如下

{"map":{"sex":["male"],"name":["jason"],"age":["24"],"code":["1002"]}}

控制檯輸出如下

{sex=[Ljava.lang.String;@31d80c,name=[Ljava.lang.String;@5f3b87, age=[Ljava.lang.String;@3d32d3,code=[Ljava.lang.String;@1d3cb2e}

Yes,說明預想成功了。但是,感覺這裡面好像還有些細節不是很清晰,map.code這樣的屬性值是怎麼注入的呢?我順勢做了探索,由於篇章偏長,所以單獨記錄。詳情請看下篇部落格《》。

小結:

    Struts2.x的功能確實比較豐滿了,作為一款成熟的MVC開發框架,它擁有很多成熟的工具。即使上述的測試失敗了,我們也可以考慮自定義型別轉換——前端將我們動態擴充套件的屬性和值拼接為類似json的字串,然後通過型別轉換器,根據預定義的格式反解析出key:value,然後填充到map中。