Action代码如下:
import java.util.Map;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Controller;
@Controller("testAction")
@Scope("prototype")
public class TestAction extends BaseAction {
private static Log log = LogFactory.getLog(TestAction.class);
private Map<String, String> map;
public String init() {
return "init";
}
public String test() {
System.out.println(map);
return null;
}
public void setMap(Map<String, String> map) {
this.map = map;
}
}
struts.xml文件如下:
<action name="test-*" class="testAction" method="{1}">
<result name="init">/WEB-INF/page/test.jsp</result>
</action>
简单的jsp测试页面如下:
<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%>
<%@ taglib prefix="s" uri="/struts-tags"%>
<%@ include file="/taglibs.jsp" %>
<html>
<head>
<title>测试页面</title>
</head>
<body>
<div class="container-fluid">
<s:form action="test-test.jhtml" method="post" namespace="/" id="form_id">
<input type="text" name="map['a90']" value='A' />
<input type="text" name="map['a91']" value='A' />
<input type="text" name="map['a92']" value='A' />
<button type="submit" class="btn btn-success">提交</button>
</s:form>
</div>
</body>
</html>
说明:在向后台传递map时,结果只有一个值,如下图

奇怪就在这里,我在页面上传递了三个值,最后注入的只有一个值。
找了很久,最后发现在Action中,只提供了setMap的方法,没有提供getMap的方法造成的,请教各位比较精通struts2的大神,我以前理解的,struts2向后台属性注入的时候,只需要提供set*方法即可,为什么传递map,必须提供get方法呢?
struts2 map
------解决方案--------------------
我想这个过程
你说往map里面注入值的时候
是前台直接往后台传入一个map封装好的类型
还是传往后台的是三个数值,
然后逐个的往这个map里面赋值呢?
我觉得应该是第二种。
那么添加一个数值的流程应该是首先获取map对象,如果获取不到的话就new一个,然后赋给map。
这个推测的,不一定准,因为懒,我没看过源码
------解决方案--------------------
楼上推测的是对的。 这种问题看源码是最清晰的。我还是找了个比较好理解的贴过来,应该看得懂:
http://www.360doc.com/content/11/0406/20/1947337_107663126.shtml
------解决方案--------------------
按道理getMap会执行3此 而setMap会执行一次 如果不写getMap则每次都会重新生成Map并执行setMap方法,所以你最后的结果就是map里面就一个值 且是最后的一个值