问题描述
我有以下来源:
struts.xml
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://www.51sjk.com/Upload/Articles/1/0/333/333814_20221024092559346.dtd"> <struts> <constant name="struts.enable.DynamicMethodInvocation" value="true" /> <constant name="struts.devMode" value="true" /> <constant name="struts.custom.i18n.resources" value="ApplicationResources" /> <package name="vislabWebShop" extends="struts-default"> <action name="UserForward"> <result>/pages/Login.jsp</result> </action> <action name="UserLogin" class="vislabWebShop.controller.LoginAction"> <result name="success">/pages/Welcome.jsp</result> <result name="input">/pages/Login.jsp</result> </action> <action name="UserRegister" class="vislabWebShop.controller.RegisterAction"> <result name="success">/pages/RegisterSuccess.jsp</result> <result name="input">/pages/Register.jsp</result> </action> <action name="UserRegisterNew"> <result>/pages/Register.jsp</result> </action> <action name="UserRegisterSuccess"> <result>/pages/Login.jsp</result> </action> <action name="ProductSearchForward"> <result>/pages/SearchProduct.jsp</result> </action> <action name="ProductSearch" class="vislabWebShop.controller.ProductSearchAction"> <result name="success">/pages/Login.jsp</result> </action> </package> </struts>
ProductSearchAction.java:
ProductSearchAction.java:
package vislabWebShop.controller; import java.util.ArrayList; import java.util.List; import com.opensymphony.xwork2.ActionSupport; public class ProductSearchAction extends ActionSupport { private List<String> categories; private String chosenCategory; public ProductSearchAction() { categories = new ArrayList<String>(); categories.add("Eins"); categories.add("Zwei"); categories.add("Drei"); } @Override public String execute() throws Exception { return SUCCESS; } public List<String> getCategories() { return categories; } public void setCategories(List<String> categories) { this.categories = categories; } public String getChosenCategory() { return chosenCategory; } public void setChosenCategory(String chosenCategory) { this.chosenCategory = chosenCategory; } }
SearchProduct.jsp:
SearchProduct.jsp:
<%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <%@ taglib prefix="s" uri="/struts-tags"%> <html> <head> <title><s:text name="welcome.title" /></title> </head> <body bgcolor="white"> <font color="red"> <s:actionmessage /> </font> <p> <b><s:text name="product.search.title" /></b> </p> <s:form action="ProductSearch" focusElement="description"> <s:textfield name="description" key="prompt.description" size="20" /> <s:textfield name="minprice" key="prompt.price.min" size="20" /> <s:textfield name="maxprice" key="prompt.price.max" size="20" /> <s:select key="product.search.category" headerKey="-1" headerValue="Bitte w?hlen Sie eine Kategorie" list="categories" /> <s:submit value="Produkt suchen" align="right" /> </s:form> <font color="red"> <s:actionerror label="label" /> </font> </body> </html>
现在我有一个问题,如果我从 Action ProductSearchForward 转到 JSP 站点 SearchProduct.jsp,我总是会收到以下错误:
Now I have the problem, that I always get the following error if I come from Action ProductSearchForward to the JSP site SearchProduct.jsp:
org.apache.jasper.JasperException:标签选择",字段列表",名称产品.search.category":请求的列表键类别"无法解析为集合/数组/映射/枚举/迭代器类型.示例:人或人.{name} - [未知位置]
org.apache.jasper.JasperException: tag 'select', field 'list', name 'product.search.category': The requested list key 'categories' could not be resolved as a collection/array/map/enumeration/iterator type. Example: people or people.{name} - [unknown location]
我只想从给定的 ArrayList<String> (List<String>) 填充 DropDownList,但它不起作用.如果我直接设置列表内容就可以了.
I just want the DropDownList to be populated from the given ArrayList<String> (List<String>), but it is not working. If I set the list content directly it works fine.
推荐答案
<s:select list = "categories" key = "product.search.category" />
您正在列出 List<String> 并尝试通过 OGNL .(点表示法)访问不存在的字段.
You are listing a List<String> and trying to access, through OGNL . (dot notation), fields that do not exist.
在 OGNL 中
product.search.category
相当于Java
getProduct().getSearch().getCategory()
由于您要列出字符串,因此只需省略 key 属性,因为您的键和值都将是字符串本身.
Since you are listing Strings, just omit key attribute, because both your key and value will be the String itself.
您似乎也将 key 与 name 混淆了:key 是
It seems that you are confusing key with name too: key is the key of the <option> element, while name is the Action's attribute that will receive the chosen value through its Setter.
<s:select list = "categories" name = "chosenCategory" />
<小时>
编辑:为了成功的生活,实施 Preparable Interface 并在那里加载你的静态"数据:
EDIT: for a succesful living, implement Preparable Interface and load there your "static" data:
public class ProductSearchAction extends ActionSupport implements Preparable { private List<String> categories; private String chosenCategory; @override public void prepare() throws Exception { categories = new ArrayList<String>(); categories.add("Eins"); categories.add("Zwei"); categories.add("Drei"); } @Override public String execute() throws Exception { return SUCCESS; } /* GETTERS AND SETTERS */ }
而且你必须为 struts.xml 中的每个标签指定完全限定的类名...
And you must specify fully qualified class names for each tag in struts.xml...