"选取[未从List< String>填充在struts中 [英] "Select" not populated from List<String> in struts

查看:107
本文介绍了"选取[未从List< String>填充在struts中的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有以下来源:



struts.xml

 <?xml version =1.0encoding =UTF-8?> 
<!DOCTYPE struts PUBLIC
- // Apache Software Foundation // DTD Struts Configuration 2.0 // EN
http://struts.apache.org/dtds/struts- 2.0.dtd>

< struts>

< constant name =struts.enable.DynamicMethodInvocationvalue =true/>
< constant name =struts.devModevalue =true/>
< constant name =struts.custom.i18n.resourcesvalue =ApplicationResources/>

< package name =vislabWebShopextends =struts-default>

< action name =UserForward>
< result> /pages/Login.jsp< / result>
< / action>

< action name =UserLoginclass =vislabWebShop.controller.LoginAction>
< result name =success> /pages/Welcome.jsp< / result>
< result name =input> /pages/Login.jsp< / result>
< / action>

< action name =UserRegisterclass =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 =ProductSearchclass =vislabWebShop.controller.ProductSearchAction>
< result name =success> /pages/Login.jsp< / result>
< / action>
< / package>
< / struts>

ProductSearchAction.java:

  package vislabWebShop.controller; 

import java.util.ArrayList;
import java.util.List;

import com.opensymphony.xwork2.ActionSupport;

公共类ProductSearchAction扩展ActionSupport
{
private List< String>类别;
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()
{
返回类别;
}

public void setCategories(List< String> categories)
{
this.categories = categories;
}

public String getChosenCategory()
{
return chosenCategory;
}

public void setChosenCategory(String chosenCategory)
{
this.chosenCategory = chosenCategory;
}
}

SearchProduct.jsp:

 <%@ page language =javacontentType =text / html; charset = ISO-8859-1
pageEncoding =ISO-8859-1%>
<!DOCTYPE html PUBLIC - // W3C // DTD HTML 4.01 Transitional // ENhttp://www.w3.org/TR/html4/loose.dtd\">
<%@ taglib prefix =suri =/ 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 =ProductSearchfocusElement =description>
< s:textfield name =descriptionkey =prompt.descriptionsize =20/>
< s:textfield name =minpricekey =prompt.price.minsize =20/>
< s:textfield name =maxpricekey =prompt.price.maxsize =20/>
< s:select key =product.search.categoryheaderKey = - 1
headerValue =BittewählenSieeine Kategorie
list =categories/>
< s:submit value =Produkt suchenalign =right/>
< / s:form>

< font color =red> < s:actionerror label =label/>
< / font>


< / body>
< / html>

现在我遇到了问题,如果我从Action ProductSearchForward转到JSP站点SearchProduct.jsp:


org.apache.jasper.JasperException:tag'select',field'list',name'product。 search.category':请求的列表键'categories'无法解析为collection / array / map / enumeration / iterator类型。示例:人或人。{name} - [unknown location]


我只想从给定的<$填充DropDownList c $ c> ArrayList< String> ( List< String> ),但它不起作用。如果我直接设置列表内容,它可以正常工作。

解决方案

 < s:select list =categories
key =product.search.category/>

您正在列出列表< String> 并尝试通过OGNL (点表示法),不存在的字段进行访问。



在OGNL

  product.search.category 

相当于Java

  getProduct()。getSearch()。getCategory()

由于列出字符串,只需省略键属性,因为键和值都是字符串本身。 / p>

您似乎也在混淆密钥名称 key < option> 元素的键,而 name 是Action的属性,它将通过其Setter接收所选值。

 < ; s:select list =categories
name =chosenCategory/>






EDIT :for一个成功的生活,实施可预配接口并加载你的静态数据:

 公共类ProductSearchAction扩展ActionSupport实现Preparable {
private List< String>类别;
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中的每个标记指定完全限定的类名...


I have the following sources:

struts.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
    "http://struts.apache.org/dtds/struts-2.0.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:

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:

    <%@ 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>

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: 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]

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" />

You are listing a List<String> and trying to access, through OGNL . (dot notation), fields that do not exist.

In OGNL

product.search.category 

is the equivalent of Java

getProduct().getSearch().getCategory()

Since you are listing Strings, just omit key attribute, because both your key and value will be the String itself.

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" />


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 */
}

And you must specify fully qualified class names for each tag in struts.xml...

这篇关于&QUOT;选取[未从List&lt; String&gt;填充在struts中的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆