[struts2.x] 通过Map从前端传递动态扩展的属性
2014-07-30 20:49
225 查看
应用背景简介:
这两天有个开发任务,为了满足多个资源使用统一管理模块管理,需要提供自定义动态属性配置,从而不需要修改后台代码,可以满足经常变化的属性需求。后台的其它部分,在后续其它文章中总结,这里主要介绍一下如何将这些动态属性传递到后台。
这里,我们使用的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中。
这两天有个开发任务,为了满足多个资源使用统一管理模块管理,需要提供自定义动态属性配置,从而不需要修改后台代码,可以满足经常变化的属性需求。后台的其它部分,在后续其它文章中总结,这里主要介绍一下如何将这些动态属性传递到后台。
这里,我们使用的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中。
相关文章推荐
- 应用Map作为ActionForm的属性,动态增加ActionForm的“属性”
- 如何向Struts2自定义标签传递一个动态值?
- 【原】android 中通过 aidl 传递map对象
- 稳扎稳打Silverlight(65) - 5.0绑定之通过 ICustomTypeProvider 绑定动态生成的属性
- struts2 动态传递参数
- 通过IExtenderProvider接口实现控件属性扩展
- Redhat Linux通过LVM动态扩展系统分区
- 通过特性动态获取属性及值
- 动手实现扩展属性为对象动态添加获取数据(续)
- ASP.net中通过HyperLink的NavigateUrl属性传递参数,与新页面的Page_Load()接收参数
- Flex中如何通过rowCount属性,动态改变DataGrid显示行数
- iwpriv工具通过ioctl动态获取相应无线网卡驱动的private_args所有扩展参数 收藏
- 不需要Orchestration,通过Pipeline设定动态发送端口属性
- struts2 常用的结果类型,动态结果,异常处理,如何传递参数与常用的通配符映射
- FusionCharts通过属性link向JavaScript函数传递中文参数导致乱码的解决方法
- ACCESS中通过VBA动态修改传递查询的SQL串
- iwpriv工具通过ioctl动态获取相应无线网卡驱动的private_args所有扩展参数
- 不需要Orchestration,通过Pipeline设定动态发送端口属性
- FusionCharts通过属性link向JavaScript函数传递中文参数导致乱码的解决方法
- 通过struts2标签在jsp获取对象属性失败,这是bug?