日期:2014-05-18  浏览次数:20850 次

struts2 传递map的疑问?
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里面就一个值 且是最后的一个值