1.org.apache.jasper.JasperException: Class: com.opensymphony.xwork2.ognl.OgnlValueStack
File: OgnlValueStack.java
Method: checkForInvalidProperties
??
如果在Action中有一个属性是List类型的。没有conversion的话,就是[null, null]
需要在Action的同一目录建一个文件,文件名为 "action的名字-conversion.properties":
内容如下:
Element_persons=conversion.Person(required)
再次运行list的内容如下:[conversion.Person@e63606, conversion.Person@1e4eb5b, conversion.Person@17b2b2]
<c:forEach items="${persons}" var="per">
<c:out value="${per.name}"></c:out>
</c:forEach> jstl的forEach标签也可以从action的list中取值。
<s:iterator value="persons" status="status">
<s:label label="%{'SET '+#status.index+' Name'}" value="%{name}" /><br/>
<s:label label="%{'SET '+#status.index+' Age'}" value="%{age}" /><br/>
</s:iterator>
struts2的标签iterator直接value="persons"就可以取得list的值。
-----------------------------------
public class PersonAction extends ActionSupport {
private List persons;
public String submit() throws Exception {
for(int i=0;i<persons.size();i++){
System.out.println(((Person)persons.get(i)).getName());
}
return SUCCESS;
}}
在同一目录下有一个文件:PersonAction-conversion.properties
----------------------------
public class AddressAction extends ActionSupport {
private Set addresses = new LinkedHashSet(); 如果是Set类型,必须实例化
// private Set addresses; 不实例化会出错
}
必须在AddressAction-conversion.properties中指定key:
KeyProperty_addresses=id,否则addresses=null.(id是Address中的属性,也可以指定别的属性)
第一,没有向服务器提交Address的id属性,那么Address的id属性是什么呢?
KeyProperty_addresses=id表示向服务器提交的内容的key部分("id0”, "id1”, "id2”)会被认定为Addredd的id。
第二,CreateIfNull_addresses=true表示及时客户端没有向服务器提交任何Address内容,服务器也会为AddressAction的addresses 建立一个长度为0的Set。
-------------
########自定义转换############
(1)转换类:
public class EnumTypeConverter extends StrutsTypeConverter {
@Override
public Object convertFromString(Map context, String[] values, Class toClass) {//从页面提交时转换成String类型的字符串
List<Enum> result = new ArrayList<Enum>();
for (int a=0; a< values.length; a++) {
Enum e = Enum.valueOf(OperationsEnum.class, values[a]);
if (e != null)
result.add(e);
}
System.out.println("formString: "+result);
return result;
}
@Override
public String convertToString(Map context, Object o) {//在页面显示时转换成对象
List l = (List) o;
String result ="<";
for (Iterator i = l.iterator(); i.hasNext(); ) {
result = result + "["+ i.next() +"]";
}
result = result+">";
System.out.println("toString: "+result);
return result;
}
}
(2)OperationsEnumAction-conversion.properties如下:
selectedOperations=conversion.EnumTypeConverter 指定converter,请求action的时候会运行fromString()
Element_selectedOperations=conversion.OperationsEnum 这个注释掉也能运行。
(3)
public class OperationsEnumAction extends ActionSupport {
private static final long serialVersionUID = -2229489704988870318L;
private List<OperationsEnum> selectedOperations = new LinkedList<OperationsEnum>();
......
}
####
---------------
把登陆的用户名,密码转换成User对象:
<s:form action="Login">
<s:textfield name="user" label="用户名:"></s:textfield>
<s:password name="user" label="密 码:"></s:password>
<s:submit value="登陆"></s:submit>
</s:form>
-----LoginAction-convertion.properties--
user=com.struts.conversion.UserTypeConverter
-----------
import org.apache.struts2.util.StrutsTypeConverter;
import com.model.User;
public class UserTypeConverter extends StrutsTypeConverter {
@Override
public Object convertFromString(Map context, String[] values, Class toClass) {
User user=new User();
System.out.println(values[0]);
user.setName(values[0]);
user.setPassword(values[1]);
return user;
}
@Override
public String convertToString(Map arg0, Object arg1) {
// TODO Auto-generated method stub
return null;
}
}
--------------