求解,struts2中为set赋值的问题,花了一天时间了,还是不行...

在JSP这样写:<%@taglibprefix="s"uri="/struts-tags"%>...<s:textfieldlabel="品牌"name="brand.m... 在JSP这样写:
<%@ taglib prefix="s" uri="/struts-tags" %>
...
<s:textfield label="品牌" name="brand.makeNew[0].name"></s:textfield>
<s:textfield label="品牌" name="brand.makeNew[1].name"></s:textfield>
...

Action中:
public class LoginAction extends ActionSupport implements ModelDriven<Product> {

private Product p = new Product();

public Product getP() {
return p;
}

public void setP(Product p) {
this.p = p;
}

public String loginIn() {
return "loginSuccess";
}

public Product getModel() {
System.out.println(p.getPname());
System.out.println(p.getPrice());
System.out.println(p.getBrand());
System.out.println(p.getBrand().size() + " -----------------");
return p;
}
}

LoginAction-conversion.properties文件中(上面的类与这个文件都是在default包中的):
KeyProperty_brand=id
Element_brand=entity.Brand
CreateIfNull_brand=true

Product.java:
package entity;

import java.io.Serializable;
import java.util.HashSet;
import java.util.Set;

public class Product implements Serializable {
private String id;
private String pname;
private double price;
private Set<Brand> brand = new HashSet<Brand>();

public Product() {
super();
}

public String getPname() {
return pname;
}

public void setPname(String pname) {
this.pname = pname;
}

public double getPrice() {
return price;
}

public void setPrice(double price) {
this.price = price;
}

public Set<Brand> getBrand() {
return brand;
}

public void setBrand(Set<Brand> brand) {
this.brand = brand;
}

public Product(String id, String pname, double price, Set<Brand> brand) {
super();
this.id = id;
this.pname = pname;
this.price = price;
this.brand = brand;
}

public String getId() {
return id;
}

public void setId(String id) {
this.id = id;
}

}

Brand.java类中:
package entity;

import java.io.Serializable;

public class Brand implements Serializable {
private String id;
private String name;

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public Brand() {
super();
System.out.println("to here");
}

public String getId() {
return id;
}

public void setId(String id) {
this.id = id;
}

public Brand(String id, String name) {
super();
this.id = id;
this.name = name;
}

}

抛出的异常:
警告: Error setting expression 'brand.makeNew[0].name' with value '[Ljava.lang.String;@1ff83'
ognl.OgnlException: Error getting property descriptor: null

太纠结了,不知道错在哪...
展开
 我来答
程序员在思考
2012-05-19 · 知道合伙人互联网行家
程序员在思考
知道合伙人互联网行家
采纳数:347 获赞数:784
毕业于吉林大学计算机科学与技术学院,硕士学位。从事IT互联网工作12年,现任银行产品架构师、高级项目经理

向TA提问 私信TA
展开全部
<s:textfield label="品牌" name="brand.makeNew[0].name"></s:textfield>
<s:textfield label="品牌" name="brand.makeNew[1].name"></s:textfield>
这个不对
大概看了一下你的程序
product类有4个属性id,name,price,brand
brand有2个属性id,name
action有一个成员变量p

第一个建议:action的成员变量一定要按命名规则来做
Product类的成员变量命名就叫product不要用p,否则,反射机制映射setter方法会出问题。
第二:如果你想给action的成员变量p的name属性传值,这样写
<s:textfield label="p的name属性" name="p.name"></s:textfield>
(这里用p做变量名应该会有问题建议修改)

你的编码习惯很不好,命名不规范,这样会给你代码调试产生很大的障碍。尤其使用开源框架更是如此,框架大多使用反射,反射就是根据属性的名字寻找对应的getter和setter方法来传递值的。

其实看起来你的需求并不复杂,但是你设计的类实在有点复杂,我实在没想出来,什么情况下需要在用set(或者说集合)来做成员变量,并且给这个set从jsp传递值呢?
追问
我把brand声明在Action类中就行了,是不是一定要放在Action类下呢?
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式