Hi list,
the demo of editing and saving entries using display
tag
http://demo.appfuse.org/appfuse/demos/users-edit.jsp
has the obvious limitation of only allowing ONE entry
to be manipulated at each request (save)
Ive found a simple way to edit all entries current
displayed however - the design is bad i think and if
displaytag would offer more manipulation abilities it
would not be needed.
Problem 1.
I needed to know WHICH entries the user currently
edits / views - displaytag does not tell me that on a
submit of a formular. If i knew which entries are
currently displayed i can manipulate this data i.e. by
ArrayList entryListDisplayed =
(ArrayList)session.getAttribute("entryListDisplayed");
// entryListDisplayed - the list of entries which
// are currently being edited / viewed by the user
for(int i=0; i < entryListDisplayed.size(); i++) {
User currentUser = (User)entryListDisplayed.get(i);
currentUser.setSomeField(request.getParameter("SOMEFIELD_"
+ currentUser.getId()));
}
Request for Displaytag :
Displaytag could put the currently viewed members of
the list into a seperate list and that list into the
session. i.e.
<display:table id="user" name="entryList"
currentlyDisplayed="entryListDisplayed">
My Solution :
As long as display tag does not supply such data
manipulation - i have to use something like this :
<%
ArrayList entryListDisplayed = new ArrayList();
%>
<display:table id="user" name="entryList">
<% User currentUser =
(User)pageContext.getAttribute("user"); %>
<display:column property="name">
<%
// memorize entires which are currently shown -
needed for save - can be in any column but must be
within <column>
entryListDisplayed.add(currentUser);
session.setAttribute("entryListDisplayed",
entryListDisplayed);
%>
</display:column>
</display:table>
I figured out that any code within a display:column
tag is only executed for entries which are currently
rendered i.e. displayed to the user - so now i do know
which entries the user currently sees.
Problem 2.
With the possibility of editing all currently
displayed data on a given page - you should (need) to
remember on which page you currently are and which
sorting you currently use. I.e. the user changes some
entries on page 4 - after submit he would be on page 1
again not on page 4. So not only the currently
displayed data needs to be hold into a session but
also the currently used view parameters (page number,
sorting etc)
Request for Displaytag :
Either supply a build in function for my own save /
edit links which adds the current pagination url
parameters to my link or store the current sorting
into a session var i.e.
<display:column title="Delete User">
<a
href="mypage.jsp?action=deleteUser=&id=${user.id}<display:getProperty
name=currentPaginationURL>" >Delete</a>
</display:column>
My Solution :
within the list i found somebody else with the same
problem he wrote a method which extracts the current
pSOMEVALUE=1 parameters - i modified it a bit to
include all parameters and use it now :
// find the internal url request params from the
display tag libary
public String
getDisplayTagOrderParams(HttpServletRequest myRequest)
{
if(myRequest == null || myRequest.getParameterMap()
== null)
return "";
java.util.Map pm = myRequest.getParameterMap();
String page_par = null;
String sort_par = null;
String order_par = null;
for( int i=0; i<pm.size(); i++){
java.util.Iterator it = pm.keySet().iterator();
while(it.hasNext()){
String next=it.next().toString();
if(next.substring(next.length()-2).equals("-p")
&&
next.substring(0, 2).equals("d-") && page_par==null)
page_par=next;
if(next.substring(next.length()-2).equals("-s")
&&
next.substring(0, 2).equals("d-") && sort_par==null)
sort_par=next;
if(next.substring(next.length()-2).equals("-o")
&&
next.substring(0, 2).equals("d-") && order_par==null)
order_par=next;
}
}
String result = "";
if (order_par != null &&
myRequest.getParameter(order_par)!=null &&
!"".equals(myRequest.getParameter(order_par)) ) {
result+="&"+order_par + "=" +
myRequest.getParameter(order_par);
}
if (sort_par != null &&
myRequest.getParameter(sort_par)!=null &&
!"".equals(myRequest.getParameter(sort_par)) ) {
result+="&"+sort_par + "=" +
myRequest.getParameter(sort_par);
}
if (page_par != null &&
myRequest.getParameter(page_par)!=null &&
!"".equals(myRequest.getParameter(page_par)) ) {
result+="&"+page_par + "=" +
myRequest.getParameter(page_par);
}
return result;
}
then i simply just use these in every jsp and add it
to my auto generating links i.e.
<% String orderParams =
getDisplayTagOrderParams(request); %>
<display:column title="Delete User">
<a
href="mypage.jsp?action=deleteUser=&id=${user.id}<%=orderParams%>"
>Delete</a>
</display:column>
Problem 3.
When a user is on page 2 i.e. and only 1 entry is
displayed and the user issues a delete action for this
entry some odd behaviour is seen. Since i remembered
the current sorting / pagination while issuing the
save - displaytag would try to display page 2 again
but sees there are no entries left - therefor it
correctly displayes page 1 - HOWEVER - only columns
without any code are displayed correctly i.e.
<!-- displays the value -->
<display:column property="name"/>
<!-- does NOT display any value - empty -->
<display:column title="email">
<% doSomething(currentUser.getName()) %>
</display:column
after clicking on page 1 again it (i.e. displaytag
does not try to render an empty page 2) it will
displayed correctly.
I have no solution for this problem...
__________________________________________________
Do You Yahoo!?
Tired of spam? Yahoo! Mail has the best spam protection around
http://mail.yahoo.com
_______________________________________________
displaytag-user mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/displaytag-user