struts-user mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From fusillator <fusilla...@gmail.com>
Subject Re: iterable tag
Date Sun, 13 Jan 2013 14:47:20 GMT
I still don't know the framework very well to report the bug, if 
opportune, someone more expert than me might open it.
I'll use your workaround.
Thanks for your support.

Kind regards


Il 12/01/2013 22:59, Chris Pratt ha scritto:
> Looking through the code and the exception.  This appears to be a bug.  It
> appears that OGNL is mistaking the TreeMap.Values Collection as a
> java.util.Set, when it attempts to coerce it in ognl.SetPropertyAccessor,
> you get the noted exception.  This should probably be reported as a bug,
> but one workaround would be to change your PersonService code like this:
>
>      static public Collection<Person> getPeople(){
>          logger.debug(people.values());
>          logger.debug(people.values().getClass().toString());
>          return new ArrayList<>(people.values());
>      }
>
>    (*Chris*)
>
>
> On Sat, Jan 12, 2013 at 1:22 PM, Chris Pratt <thechrispratt@gmail.com>wrote:
>
>> You're right Dave, somehow I replied to the wrong email.  Looking over the
>> code now.
>>    (*Chris*)
>>
>>
>> On Sat, Jan 12, 2013 at 1:08 PM, Dave Newton <davelnewton@gmail.com>wrote:
>>
>>> (Isn't it around where the iterator tag is in that source? I thought
>>> that *was* the OP's code this second barf of source.)
>>>
>>> Dave
>>>
>>>
>>> On Sat, Jan 12, 2013 at 4:04 PM, Chris Pratt <thechrispratt@gmail.com>
>>> wrote:
>>>> You said in your original post that you used the <s:iterator> tag,
>>>> correct?  Can I see how you used it?
>>>>    (*Chris*)
>>>>
>>>>
>>>> On Sat, Jan 12, 2013 at 3:06 AM, fusillator <fusillator@gmail.com>
>>> wrote:
>>>>> Sorry for my misunderstanding, I changed the code of the wiki tutorial
>>>>> about wildcard
>>>>>
>>>>> These is the view:
>>>>>
>>>>> <%@ page language="java" contentType="text/html; charset=UTF-8"
>>>>>      pageEncoding="UTF-8"%>
>>>>> <%@ taglib prefix="s" uri="/struts-tags" %>
>>>>> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "
>>>>> http://www.w3.org/TR/xhtml1/**DTD/xhtml1-transitional.dtd<
>>> http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd>
>>>>> ">
>>>>> <html xmlns="http://www.w3.org/1999/**xhtml <
>>> http://www.w3.org/1999/xhtml>
>>>>> ">
>>>>> <head>
>>>>> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"
/>
>>>>> <title>List of people</title>
>>>>> </head>
>>>>> <body>
>>>>> <h3>List of persons:</h3>
>>>>> <s:if test="people.isEmpty">
>>>>> <ol>
>>>>> <s:iterator value="people">
>>>>> <li>
>>>>> <s:property value="firstName" /> <s:property value="lastName"
/>
>>>>> <s:url action="removePerson" var="urlremove"><s:param name="code"
>>>>> value="id" /></s:url>
>>>>> <s:url action="editPerson" var="urledit"><s:param name="code"
>>> value="id"
>>>>> /></s:url>
>>>>> <s:a href="%{urledit}">Edit</s:a>
>>>>> <s:a href="%{urlremove}">Remove</s:**a>
>>>>> </li>
>>>>> </s:iterator>
>>>>> </ol>
>>>>> </s:if>
>>>>> <s:else>
>>>>> No person inserted
>>>>> </s:else>
>>>>> <s:url action="editPerson" var="urlnew" />
>>>>> <s:a href="%{urlnew}">Insert a new person</s:a>
>>>>> </body>
>>>>> </html>
>>>>>
>>>>> and this is the action class:
>>>>>
>>>>> package org.apache.struts.tutorial.**wildcard.action;
>>>>>
>>>>> import java.util.Collection;
>>>>> //import java.util.List;
>>>>> import org.apache.struts.tutorial.**wildcard.service.**PersonService;
>>>>> import org.apache.struts.tutorial.**wildcard.model.Person;
>>>>> import org.apache.log4j.Logger;
>>>>> import com.opensymphony.xwork2.**ActionSupport;
>>>>>
>>>>> public class PersonAction extends ActionSupport {
>>>>>
>>>>>      private static final long serialVersionUID = 1L;
>>>>>
>>>>>      private static final Logger logger =
>>> Logger.getLogger(PersonAction.**
>>>>> class.getName());
>>>>>
>>>>>      private Collection<Person> people=PersonService.**getPeople();
>>>>>      private int code=-1; //parametro passato da view
>>>>>      private Person personBean;
>>>>>      private PersonService personService=new PersonService();
>>>>>
>>>>>      @Override
>>>>>      public String execute(){
>>>>>          return SUCCESS;
>>>>>      }
>>>>>
>>>>>      public String edit(){
>>>>>          setPersonBean(personService.**getPerson(code));
>>>>>          return INPUT;
>>>>>      }
>>>>>
>>>>>      public String save(){
>>>>>          personService.savePerson(**getPersonBean());
>>>>>          return SUCCESS;
>>>>>      }
>>>>>
>>>>>      public String remove(){
>>>>>          personService.removePerson(**code);
>>>>>          return SUCCESS;
>>>>>      }
>>>>>
>>>>>      public Collection<Person> getPeople() {
>>>>>          return people;
>>>>>      }
>>>>>
>>>>>      public void setPeople(Collection<Person> people) {
>>>>>          this.people = people;
>>>>>      }
>>>>>
>>>>>      public int getCode() {
>>>>>          return code;
>>>>>      }
>>>>>
>>>>>      public void setCode(int code) {
>>>>>          this.code = code;
>>>>>      }
>>>>>
>>>>>      public Person getPersonBean() {
>>>>>          return personBean;
>>>>>      }
>>>>>
>>>>>      public void setPersonBean(Person personBean) {
>>>>>          this.personBean = personBean;
>>>>>      }
>>>>>
>>>>> }
>>>>>
>>>>> and my modified PersonService class:
>>>>>
>>>>> package org.apache.struts.tutorial.**wildcard.service;
>>>>>
>>>>> //import java.util.ArrayList;
>>>>> import java.util.Collection;
>>>>> //import java.util.List;
>>>>> import java.util.SortedMap;
>>>>> import java.util.TreeMap;
>>>>>
>>>>> import org.apache.log4j.Logger;
>>>>> import org.apache.struts.tutorial.**wildcard.model.Person;
>>>>>
>>>>> public class PersonService {
>>>>>
>>>>>      private static final Logger logger = Logger.getLogger(**
>>>>> PersonService.class.getName())**;
>>>>>
>>>>>      //static private List<Person> peopleList=new ArrayList<Person>();
>>>>>      static private SortedMap<Integer,Person> people=new
>>>>> TreeMap<Integer,Person>();
>>>>>      static {
>>>>>          people.put(new Integer(1), new
>>> Person(1,"Paolino","Paperino")**);
>>>>>          people.put(new Integer(2), new Person(2,"Paperon","De
>>> Paperoni"));
>>>>>          people.put(new Integer(3), new Person(3,"Archimede","**
>>>>> Pitagorica"));
>>>>>          //generateList();
>>>>>      }
>>>>>      /*
>>>>>      static void generateList(){
>>>>>          peopleList.clear();
>>>>>          for (Integer i : people.keySet()){
>>>>>              peopleList.add(people.get(i));
>>>>>          }
>>>>>      }
>>>>>      */
>>>>>      static public Collection<Person> getPeople(){
>>>>>          logger.debug(people.values());
>>>>>          logger.debug(people.values().**getClass().toString());
>>>>>          return people.values();
>>>>>      }
>>>>>
>>>>>      public Person getPerson(int code){
>>>>>          if (code<0)
>>>>>              return new Person(-1,"","");
>>>>>          else
>>>>>              return people.get(new Integer(code));
>>>>>      }
>>>>>
>>>>>      public void savePerson(Person person){
>>>>>          logger.debug(person);
>>>>>          if (person.getId()>=0){
>>>>>              people.put(new Integer(person.getId()),**person);
>>>>>          } else {
>>>>>              int id = people.isEmpty() ? 1 :
>>> people.lastKey().intValue()+1;
>>>>>              person.setId(id);
>>>>>              people.put(new Integer(id),person);
>>>>>          }
>>>>>          //generateList();
>>>>>      }
>>>>>
>>>>>      public void removePerson(int code){
>>>>>          people.remove(new Integer(code));
>>>>>          //generateList();
>>>>>      }
>>>>>
>>>>> }
>>>>>
>>>>>
>>>>> The mapping definitions are:
>>>>>
>>>>> <action name="*Person" class="org.apache.struts.**
>>>>> tutorial.wildcard.action.**PersonAction" method="{1}">
>>>>>              <result name="success">/view.jsp</**result>
>>>>>              <result name="input">/input.jsp</**result>
>>>>> </action>
>>>>>
>>>>> The model Person is a pojo with 3 attributes: firstName, lastName, id
>>>>>
>>>>> thanks for the support
>>>>>
>>>>> Il 12/01/2013 11:50, Umesh Awasthi ha scritto:
>>>>>
>>>>>   I believe what *Chris* has asked is to copy the code from your JSP
>>> page
>>>>>> i believe you must be using <s:iterator> tag in your JSP page
to
>>> iterate
>>>>>> some list
>>>>>> so please copy that code from your JSP and provide here
>>>>>>
>>>>>>
>>>>>>
>>>>>> On Sat, Jan 12, 2013 at 4:16 PM, fusillator <fusillator@gmail.com>
>>> wrote:
>>>>>>   Hi Chris, not really sure how to find that code... Anyway this
has
>>> been
>>>>>>> my
>>>>>>> steps:
>>>>>>> $ for lib in /opt/struts-2.3.7/lib/* ; do jar tvf $lib | grep
tld &&
>>> echo
>>>>>>> $lib; done
>>>>>>>     3349 Wed Aug 10 12:51:32 CEST 2005
>>> META-INF/sitemesh-decorator.****
>>>>>>> tld
>>>>>>>     3013 Sat May 15 11:55:14 CEST 2004 META-INF/sitemesh-page.tld
>>>>>>> /opt/struts-2.3.7/lib/****sitemesh-2.4.2.jar
>>>>>>> 346038 Tue Nov 06 08:13:06 CET 2012 META-INF/struts-tags.tld
>>>>>>> /opt/struts-2.3.7/lib/struts2-****core-2.3.7.jar
>>>>>>> 136496 Tue Nov 06 08:24:22 CET 2012 META-INF/struts-dojo-tags.tld
>>>>>>> /opt/struts-2.3.7/lib/struts2-****dojo-plugin-2.3.7.jar
>>>>>>>      752 Tue Nov 06 08:27:06 CET 2012 META-INF/tags/JsonPlugin.tld
>>>>>>> /opt/struts-2.3.7/lib/struts2-****json-plugin-2.3.7.jar
>>>>>>>        0 Tue May 13 21:39:54 CEST 2008 META-INF/tld/
>>>>>>>    27808 Tue May 13 21:39:54 CEST 2008 META-INF/tld/tiles-jsp.tld
>>>>>>> /opt/struts-2.3.7/lib/tiles-****jsp-2.0.6.jar
>>>>>>>
>>>>>>> $ jar xvf /opt/struts-2.3.7/lib/struts2-****core-2.3.7.jar
>>>>>>> META-INF/struts-tags.tld
>>>>>>>    \decompresso: META-INF/struts-tags.tld
>>>>>>>
>>>>>>> $ grep -n "<name>iterator</name>" META-INF/struts-tags.tld
>>>>>>> 4881:    <name>iterator</name>
>>>>>>>
>>>>>>> and the tag definition in the tld file is:
>>>>>>>
>>>>>>> <tag>
>>>>>>>       <description><![CDATA[Iterate over a iterable
>>> value]]></description>
>>>>>>>       <name>iterator</name>
>>>>>>>
>>> <tag-class>org.apache.struts2.****views.jsp.IteratorTag</tag-****class>
>>>>>>>       <body-content>JSP</body-****content>
>>>>>>>       <!-- here a lot of not interesting attributes-->
>>>>>>> </tag>
>>>>>>>
>>>>>>> $ find src -name IteratorTag.java
>>>>>>> src/core/src/main/java/org/****apache/struts2/views/jsp/****
>>>>>>> IteratorTag.java
>>>>>>>
>>>>>>> $ cat src/core/src/main/java/org/****apache/struts2/views/jsp/**
>>>>>>> IteratorTag.java
>>>>>>> /*
>>>>>>>    * $Id: IteratorTag.java 741179 2009-02-05 16:55:14Z musachy
$
>>>>>>>    *
>>>>>>>    * Licensed to the Apache Software Foundation (ASF) under one
>>>>>>>    * or more contributor license agreements.  See the NOTICE
file
>>>>>>>    * distributed with this work for additional information
>>>>>>>    * regarding copyright ownership.  The ASF licenses this file
>>>>>>>    * to you under the Apache License, Version 2.0 (the
>>>>>>>    * "License"); you may not use this file except in compliance
>>>>>>>    * with the License.  You may obtain a copy of the License
at
>>>>>>>    *
>>>>>>>    *  http://www.apache.org/****licenses/LICENSE-2.0<
>>> http://www.apache.org/**licenses/LICENSE-2.0>
>>>>>>> <http://**www.apache.org/licenses/**LICENSE-2.0<
>>> http://www.apache.org/licenses/LICENSE-2.0>
>>>>>>>    *
>>>>>>>    * Unless required by applicable law or agreed to in writing,
>>>>>>>    * software distributed under the License is distributed on
an
>>>>>>>    * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
>>>>>>>    * KIND, either express or implied.  See the License for the
>>>>>>>    * specific language governing permissions and limitations
>>>>>>>    * under the License.
>>>>>>>    */
>>>>>>>
>>>>>>> package org.apache.struts2.views.jsp;
>>>>>>>
>>>>>>> import javax.servlet.http.****HttpServletRequest;
>>>>>>> import javax.servlet.http.****HttpServletResponse;
>>>>>>> import javax.servlet.jsp.****JspException;
>>>>>>>
>>>>>>> import org.apache.struts2.components.****Component;
>>>>>>> import org.apache.struts2.components.****IteratorComponent;
>>>>>>>
>>>>>>> import com.opensymphony.xwork2.util.****ValueStack;
>>>>>>>
>>>>>>> /**
>>>>>>>    * @see IteratorComponent
>>>>>>>    */
>>>>>>> public class IteratorTag extends ContextBeanTag {
>>>>>>>
>>>>>>>       private static final long serialVersionUID =
>>> -1827978135193581901L;
>>>>>>>       protected String statusAttr;
>>>>>>>       protected String value;
>>>>>>>       protected String begin;
>>>>>>>       protected String end;
>>>>>>>       protected String step;
>>>>>>>
>>>>>>>       public Component getBean(ValueStack stack, HttpServletRequest
>>> req,
>>>>>>> HttpServletResponse res) {
>>>>>>>           return new IteratorComponent(stack);
>>>>>>>       }
>>>>>>>
>>>>>>>       protected void populateParams() {
>>>>>>>           super.populateParams();
>>>>>>>
>>>>>>>           IteratorComponent tag = (IteratorComponent) getComponent();
>>>>>>>           tag.setStatus(statusAttr);
>>>>>>>           tag.setValue(value);
>>>>>>>           tag.setBegin(begin);
>>>>>>>           tag.setEnd(end);
>>>>>>>           tag.setStep(step);
>>>>>>>       }
>>>>>>>
>>>>>>>       public void setStatus(String status) {
>>>>>>>           this.statusAttr = status;
>>>>>>>       }
>>>>>>>
>>>>>>>       public void setValue(String value) {
>>>>>>>           this.value = value;
>>>>>>>       }
>>>>>>>
>>>>>>>       public void setBegin(String begin) {
>>>>>>>           this.begin = begin;
>>>>>>>       }
>>>>>>>
>>>>>>>       public void setEnd(String end) {
>>>>>>>           this.end = end;
>>>>>>>       }
>>>>>>>
>>>>>>>       public void setStep(String step) {
>>>>>>>           this.step = step;
>>>>>>>       }
>>>>>>>
>>>>>>>       public int doEndTag() throws JspException {
>>>>>>>           component = null;
>>>>>>>           return EVAL_PAGE;
>>>>>>>       }
>>>>>>>
>>>>>>>       public int doAfterBody() throws JspException {
>>>>>>>           boolean again = component.end(pageContext.****getOut(),
>>>>>>> getBody());
>>>>>>>
>>>>>>>           if (again) {
>>>>>>>               return EVAL_BODY_AGAIN;
>>>>>>>           } else {
>>>>>>>               if (bodyContent != null) {
>>>>>>>                   try {
>>>>>>> bodyContent.writeOut(****bodyContent.****getEnclosingWriter());
>>>>>>>                   } catch (Exception e) {
>>>>>>>                       throw new JspException(e.getMessage());
>>>>>>>                   }
>>>>>>>               }
>>>>>>>               return SKIP_BODY;
>>>>>>>           }
>>>>>>>       }
>>>>>>>
>>>>>>> }
>>>>>>>
>>>>>>> Thanks a lot for your help.
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>> Il 11/01/2013 20:21, Chris Pratt ha scritto:
>>>>>>>
>>>>>>>   Can you cut and paste your <s:iterator> code into the
email so we
>>> can
>>>>>>>> see?
>>>>>>>>      (*Chris*)
>>>>>>>>
>>>>>>>>
>>>>>>>> On Fri, Jan 11, 2013 at 11:12 AM, fusillator <fusillator@gmail.com>
>>>>>>>> wrote:
>>>>>>>>
>>>>>>>>    Hi all, I'm new to struts2/java matters, so be sympathetic
please.
>>>>>>>>
>>>>>>>>> I've a question about <s:iterator> tag
>>>>>>>>>
>>>>>>>>> I recently used it to loop on a Iterable collection of
type
>>>>>>>>> java.util.TreeMap$Values retrieved by the method
>>>>>>>>> java.util.TreeMap.values()
>>>>>>>>>
>>>>>>>>> getting the following cast exception:
>>>>>>>>>
>>>>>>>>> 2013-01-11 18:45:00,520 DEBUG org.apache.struts.tutorial.**
>>>>>>>>> wildcard.service.******PersonService.getPeople:33 [Person
[1:
>>> Paolino
>>>>>>>>> Paperino], Person [2: Paperon De Paperoni], Person [3:
Archimede
>>>>>>>>> Pitagorica]]
>>>>>>>>> 2013-01-11 18:45:00,523 DEBUG org.apache.struts.tutorial.**
>>>>>>>>> wildcard.service.******PersonService.getPeople:34 class
>>>>>>>>> java.util.TreeMap$Values
>>>>>>>>> 2013-01-11 18:45:00,523 DEBUG org.apache.struts.tutorial.**
>>>>>>>>> wildcard.service.******PersonService.getPeople:34 class
>>>>>>>>> java.util.TreeMap$Values
>>>>>>>>> gen 11, 2013 6:45:01 PM org.apache.jasper.compiler.*****
>>>>>>>>> *TldLocationsCache
>>>>>>>>> tldScanJar
>>>>>>>>> WARNING: Caught an exception while evaluating expression
>>>>>>>>> 'people.isEmpty'
>>>>>>>>> against value stack
>>>>>>>>> java.lang.ClassCastException: java.util.TreeMap$Values
cannot be
>>> cast
>>>>>>>>> to
>>>>>>>>> java.util.Set
>>>>>>>>>            at ognl.SetPropertyAccessor.******getProperty(**
>>>>>>>>> SetPropertyAccessor.java:47)
>>>>>>>>>            at com.opensymphony.xwork2.ognl.******accessor.**
>>>>>>>>> XWorkCollectionPropertyAccesso******r.getProperty(**
>>>>>>>>> XWorkCollectionPropertyAccesso******r.java:93)
>>>>>>>>>            at
>>> ognl.OgnlRuntime.getProperty(******OgnlRuntime.java:2300)
>>>>>>>>> The used variable is reported by log4j.
>>>>>>>>> Is there any restriction on the iterator tags?
>>>>>>>>> Could someone suggest me a tutorial/howto about ognl/value
stack?
>>>>>>>>>
>>>>>>>>> Best regards
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>
>>> ------------------------------******--------------------------**--**
>>>>>>>>> --**---------
>>>>>>>>> To unsubscribe, e-mail: user-unsubscribe@struts.****apac**he.org<
>>>>>>>>> http://apache.org**>
>>>>>>>>> <user-unsubscribe@**struts.**apache.org <http://struts.apache.org
>>>> <
>>>>>>>>> user-unsubscribe@**struts.apache.org<
>>> user-unsubscribe@struts.apache.org>
>>>>>>>>> For additional commands, e-mail: user-help@struts.apache.org
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>   ------------------------------****----------------------------**
>>>>>>> --**---------
>>>>>>> To unsubscribe, e-mail: user-unsubscribe@struts.**apac**he.org<
>>> http://apache.org>
>>>>>>> <user-unsubscribe@**struts.apache.org<
>>> user-unsubscribe@struts.apache.org>
>>>>>>> For additional commands, e-mail: user-help@struts.apache.org
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>
>>> ------------------------------**------------------------------**---------
>>>>> To unsubscribe, e-mail: user-unsubscribe@struts.**apache.org<
>>> user-unsubscribe@struts.apache.org>
>>>>> For additional commands, e-mail: user-help@struts.apache.org
>>>>>
>>>>>
>>>
>>>
>>> --
>>> e: davelnewton@gmail.com
>>> m: 908-380-8699
>>> s: davelnewton_skype
>>> t: @dave_newton
>>> b: Bucky Bits
>>> g: davelnewton
>>> so: Dave Newton
>>>
>>> ---------------------------------------------------------------------
>>> To unsubscribe, e-mail: user-unsubscribe@struts.apache.org
>>> For additional commands, e-mail: user-help@struts.apache.org
>>>
>>>


---------------------------------------------------------------------
To unsubscribe, e-mail: user-unsubscribe@struts.apache.org
For additional commands, e-mail: user-help@struts.apache.org


Mime
View raw message