You are viewing a plain text version of this content. The canonical link for it is here.
Posted to adffaces-user@incubator.apache.org by Döring Markus <Ma...@tcc-products.de> on 2007/01/10 10:13:21 UTC

Wrong action called

Hello,

I'm using myfaces, Trinidad (snapshot M1) and facelets on a tomcat 5.5 webserver.

 

Because I'm not sure if this is a MyFaces or a Trinidad issue I write on both lists.

 

On one of my pages I have an <tr:selectOneChoice> to set an filter on a list of datas. Below it I have a <tr:table> to display the data itself. In the table there are download-links (<tr:commandLink>) for every row in the table.

 

All works fine: setting the filter, displaying the table and downloading the data via the link.

But if I first download data and than change the filter, the action from the download link is called again (the valueChangeListener is called, too)

 

Here are some code snippets:

 

            //facelet file

 

            <tr:selectOneChoice label="select filter"

                  id="event" autoSubmit="false" onchange="submit()"

                  valueChangeListener="#{dataBean.filterChangeEvent}">

                  <f:selectItems value="#{globalProperties.filterTypes}" />

            </tr:selectOneChoice>

            <tr:table value="#{dataBean.dataList}" var="data">

                  <tr:column>

                        <f:facet name="header">

                             <tr:outputText value="#{id}" />

                        </f:facet>

                        <tr:outputText value="#{data.id}" />

                  </tr:column>

 

 

                  // (some more columns)

 

 

                  <tr:column>

                        <f:facet name="header">

                             <tr:outputText value="data" />

                        </f:facet>

                        <tr:commandLink text="download}">

                             <tr:setActionListener  //only used to get the correct id from what to download

                                   from="#{data.id}"  

                                   to="#{dataBean.downloadId}" />

                             <f:actionListener

                                   type="de.tccproducts.dprs.basicstats.DataBean" />

                        </tr:commandLink>

                  </tr:column>

            </tr:table>

 

 

      //action Listener methods

      public void processAction(ActionEvent event)

                  throws AbortProcessingException {

            

// get the current data Object

            Data data = getData();

            

// get the byte array that should be downloaded

            byte[] data = data.getByteData();

            

// set mime type and filename

            FacesContext context = FacesContext.getCurrentInstance();

            HttpServletResponse response = (HttpServletResponse) context.getExternalContext().getResponse();

            response.setContentType("text/plain");

            response.setHeader("Content-Disposition", "attachment;filename=\"someTestFile.txt\"");

            

// append the byte[] to the response

            ByteArrayInputStream fis = new ByteArrayInputStream(data);

            try {

                  OutputStream os = response.getOutputStream();

                  int read = 0;

                  byte[] bytes = new byte[1024];

                  while ((read = fis.read(bytes)) != -1) {

                        os.write(bytes, 0, read);

                  }

                  os.flush();

                  os.close();

            } catch (Exception ex) {

                  ex.printStackTrace();

            }

            FacesContext.getCurrentInstance().responseComplete();

}

 

 

 

      public void filterChangeEvent(ValueChangeEvent ev) {

 

            // get the selected value from selectOneChoice

            String key = ev.getComponent().getAttributes().get("id").toString();

            FilterType filter = (FilterType) ev.getComponent().getAttributes().get("value");

 

            // set the filter and update the dataList

            setFilter(filter);

}

 

 

My thought is that the commandLink sets some hidden input fields to say the server what to download. The download is done but the page is not reloaded and so the hidden input fields stay as they are.

When the valueChangeListener is called, the Server recognises the hidden fields again, and so executes the commandLink Action again.

 

What can I do to avoid this?

Force a refresh on the page after download is done?

Reset the hidden input fields in some way?

Check in the download action if it really should be executed?

Or is there some other problem I don't see at the moment?

 

Please help if you have an idea on this.

Greetings

Markus