应用背景简介:
这两天有个开发任务,为了满足多个资源使用统一管理模块管理,需要提供自定义动态属性配置,从而不需要修改后台代码,可以满足经常变化的属性需求。后台的其它部分,在后续其它文章中总结,这里主要介绍一下如何将这些动态属性传递到后台。
这里,我们使用的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中。