I have a picture attached with pretty much all the information. To add to it. The table data is stored within a java bean within an ArrayList (Each record is one bean).
I would like my application to be able to recognize that I am in CYCLE_ID n and have all the runs displayed in a table (see Desired Results), and for each CYCLE_ID the same thing.
I am open to making changes in the background java class (not shown), or within the jsp.
<div id="activeQueue">
<h2>Active Modeling Queue for <bean:write name="userBean" property="uid" /> </h2>
<c:forEach items="${activeQueueList}" var="currentQueue">
<p>Queue {<c:out value="${currentQueue.modelQueueID}" />} - <c:out value="${currentQueue.PROJECTION_PROJECT_NME}" /></p>
<table>
<tr>
<th>Type</th>
<th>Start Time </th>
<th>Status</th>
</tr>
<tr>
<td><c:out value="${currentQueue.modelQueueDes}" /></td>
<td><c:out value="${currentQueue.ROW_CREATE_TSP}" /></td>
<td><c:out value="${currentQueue.STATUS_DES}" /></td>
</tr>
</table>
</c:forEach>
First prepare a Map using CYCLE_ID as key and the Queue List as the value. Assuming the bean class is ActiveQueue you can do the following
Map<Integer, ActiveQueue> data = new HashMap<Integer, ActiveQueue>();
for(ActiveQueue queue : activeQueueList) {
if(!data.containsKey(queue.CYCLE_ID)) {
data.put(queue.CYCLE_ID, new ArrayList<ActiveQueue>);
}
data.get(queue.CYCLE_ID).add(queue);
}
Now you can use two nested loops in jsp. The outer loop iterates over the Map data and the inner loop iterates over the corresponding Map.entry values. Like following
<div id="activeQueue">
<h2>Active Modeling Queue for <bean:write name="userBean" property="uid" /></h2>
<c:forEach items="${data}" var="entry">
<p>Queue {<c:out value="${entry.key}" />} - <c:out value="${entry.value[0].PROJECTION_PROJECT_NME}" /></p>
<table>
<tr>
<th>Type</th>
<th>Start Time </th>
<th>Status</th>
</tr>
<c:forEach items=${entry.value} var="currentQueue">
<tr>
<td><c:out value="${currentQueue.modelQueueDes}" /></td>
<td><c:out value="${currentQueue.ROW_CREATE_TSP}" /></td>
<td><c:out value="${currentQueue.STATUS_DES}" /></td>
</tr>
</c:forEach>
</table>
</c:forEach>
Instead of having a List<Run> and iterating on it, you should have a List<Cycle>, where each Cycle contains a List<Run>.
Grouping the original flat list of Runs by Cycle is easy with a Map storing the ID of the cycles as keys, and the corresponding cycle as value:
you iterate over the runs
for each run, you fetch the corresponding cycle by ID in the map. If it's not there yet, you create it and store it in the map
you add the run in the cycle
Ath the end, the keySet() of the map contains all the cycles, and each cycle contains all its runs.
Then use two nested foreach loops in the JSP.
Related
I want to give my users an ability to remove some items from database. Like this:
I have an array in jsp file:
<c:forEach items="${page.content}" var="row" varStatus="status">
<tr>
<td><input type="checkbox"/></td>
<td>${row.name}</td>
<td>${row.profession}</td>
<td>${row.phone}</td>
<td>${row.city.name}</td>
<td><img src="img/del.png"/></td>
Is there any way to remove an item from array "row" (for example, when I click on the picture del.png)? After that, I will send this array to the controller, to let it know which items I want to remove.
So write a if condition inside foreach tag like this.My idea is to exclude or skip the creation of html if if condition is not satisfied with the value you will specify.
<c:forEach items="${page.content}" var="row" varStatus="status">
<c:if test="${row.value != '<What you want to exclude>'}">
<tr>
<td><input type="checkbox"/></td>
<td>${row.name}</td>
<td>${row.phone}</td>
<td>${row.city.name}</td>
</tr>
</c:if>
</c:forEach>
I am working on Struts2 Application;
my displaying objects are Map objects:
Map<String, HashMap<String, List<PlanDAO>>> channelRoomTypePlanmap =
new HashMap<String,HashMap<String,List<PlanDAO>>>();
Map<String, List<RateInventoryDAO>> rateInventoryMap =
new HashMap<String, List<RateInventoryDAO>>();
Here, I have two objects, where rateInventoryMap key is dependent on channelRoomTypePlanmap value combination.
Like when I print first value of channelRoomTypePlanmap I want to create key using combination of its value, and find it in rateInventoryMap , if its true then it'll print its value.
<div>
<table id="mainTable" >
<tr>
<td>
<s:iterator value="channelRoomTypePlanmap">
<table border="1">
<tr>
<td><s:property value="key" />
</td>
<td>
<table>
<s:iterator value="value">
<tr>
<td><s:property value="key" />
</td>
<td>
<table border="1">
<s:iterator value="value">
<tr>
<td><s:property value="planName" />
</td>
<s:iterator value="rateInventoryMap">
<s:iterator value="value">
<td><s:property value="currentRate" />
</td>
</s:iterator>
</s:iterator>
</tr>
</s:iterator>
</table>
</td>
</tr>
</s:iterator>
</table>
</td>
</tr>
</table>
</s:iterator>
</td>
</tr>
</table>
</div>
I tried this, which is showing in wrong format, means showing all data from second Map in single row for all. I've also heard that scriptlet code should be avoided.
How can I join these two Maps on JSP ?
Current View using above code_
Your model structure
new HashMap<String,HashMap<String,List<PlanDAO>>>();
should be improved; it is too noisy, you need five nested iterators in your page to do what you need, never know in which iterator you are without counting them, and, more important, even if this structure can be used to display data, it can't be used to send it back (you never know).
I strongly suggest you to read the following answer:
Struts2 Object Modelling
That said, when dealing with Collections in a JSP you must read about two great features of OGNL:
OGNL List Selection
OGNL List Projection
i have to display 3 array lists in a table.. the arraylists are forwarded from a servlet. the value s coming to the jsp. as if we display one array list alone the prg is woking but to display 3 array lists is a problem.
<c:forEach var="auctionDO" items="${auctionDOListServlet}">
<tr div class="odd">
<td style="font-size:14px;"><c:out value="${auctionDO.auctionName}"/> </td>
<td><c:out value="${auctionDO.endDate}"/> </td>
<td><c:out value="${auctionDO.status}"/></td>
<td><c:out value="${depotDo.depotName}"/></td>
<td><c:out value="${userAuctionRelDo.bidAmt}"/></td>
</tr>
</c:forEach>
as auctionDOListServlet is provided in foreach its displaying correctly.. the depotDO and userAuctionRelDO is not being displayed..
how do i display the other 2 arraylists??
the arraylists are passed from servlet as follows
request.setAttribute("auctionDOListServlet", auctionDOListServlet);
request.setAttribute("depotDOListServlet", depotDOListServlet);
request.setAttribute("userAuctionRelDOListServlet", userAuctionRelDOListServlet);
i have combined the three list into 1 list
megaList.addAll(auctionDOListServlet);
megaList.addAll(depotDOListServlet);
megaList.addAll(userAuctionRelDOListServlet);
now how do i display this in for each?? would this work?
where mega is the name of the variable??
<td><c:out value="${mega.endDate}"/> </td>
this now hows errors for depot name and bidamt as they are in a totally different DO.. wat to do??
how do i display the other 2 arraylists??
As you did. depotDOListServlet and userAuctionRelDOListServlet are two array lists then same way you can use <c:forEach></c:forEach> to iterate those lists.
<c:forEach var="auctionDO" items="${auctionDOListServlet}">
<tr div class="odd">
<td style="font-size:14px;"><c:out value="${auctionDO.auctionName}"/> </td>
<td><c:out value="${auctionDO.endDate}"/> </td>
<td><c:out value="${auctionDO.status}"/></td>
<c:forEach var="depotDo" items="${depotDOListServlet}">
<td><c:out value="${depotDo.depotName}"/></td>
</c:forEach>
<c:forEach var="userAuctionRelDo" items="${userAuctionRelDOListServlet}">
<td><c:out value="${userAuctionRelDo.bidAmt}"/></td>
</c:forEach>
</tr>
</c:forEach>
Remember that for every item in list auctionDOListServlet rest two lists will iterate each time.
You are iterating over one particular array. This has no effect on other arrays. The other arrays are not being iterated over.
I would create a container object that holds these three entities together, and then put these in a list.
Or you could for a for loop and call getValueAt(anIntValue) on the list. This way you could get the correct value for every list.
following is my snippet, which was working good untill I migrated from spring 2 to spring 3 and Jstl 1.1 to jstl 1.2. Now, its not working and keep on giving the error
fEvents cannot found on object location
<c:forEach items="${location.fEvents}" var="item" varStatus="loop">
<tr><td><form:input path="fEvents[${loop.index}].hostName" size="30" maxlength="200"/></td>
<td><form:input path="fEvents[${loop.index}].directory" size="30" maxlength="200"/></td>
<td><form:input path="fEvents[${loop.index}].userName" size="20" maxlength="20"/></td>
<td><form:input path="fEvents[${loop.index}].password" size="20" maxlength="20"/></td>
</tr>
</c:forEach>
need to iterate the ftpEvents and show them on jsp
Any suggestion is appreciated!!!
It looks like the object called "location" does not have an fEvents property. Is it actually called ftpEvents? Do you need to just change the variable name?
Even with that, though, you'll probably want to do something more like this:
<c:forEach items="${location.ftpEvents}" var="item">
<tr><td><form:input path="item.hostName" size="30" maxlength="200"/></td>
<td><form:input path="item.directory" size="30" maxlength="200"/></td>
<td><form:input path="item.userName" size="20" maxlength="20"/></td>
<td><form:input path="item.password" size="20" maxlength="20"/></td>
</tr>
</c:forEach>
...you don't need to even use the loop.index at all, if I'm interpreting your code correctly.
In my java web application, I have a data table called "sell"
sell(id_sell,id_buyer,id_product,date,final_price,shipping_price,sales_tax)
I have created a jsp page which display some information about the user, such as the products which won at the auction; these products are described by "sell". In this page I have to use jstl library and my idea is to use 'c:forEach' tag to iterate every row of the table.
Here is my code:
<table class="table table-bordered">
<thead>
<tr>
<th>Product</th>
<th>Date</th>
<th>Final Price</th>
<th>Shipping Price</th>
<th>Salex Tax</th>
</tr>
</thead>
<tbody>
<c:forEach var="s" items="${sell}">
<tr>
<td><c:out value="${s.id_product}"/></td>
<td><c:out value="${s.date}"/></td>
<td><c:out value="${s.final_price}"/></td>
<td><c:out value="${s.shipping_price}"/></td>
<td><c:out value="${s.sales_tax}"/></td>
</tr>
</c:forEach>
</tbody>
</table>
But this code shows only an empty table. Where am I doing wrong? Do I have to import something?
From your servlet, load the needed data from your data source, and add it to a scope. Your JSP will then be able to access it through an EL expression. For example, to add data in the request scope:
List<> data = yourDao.list();
request.setAttribute("sell", data);
About your comment on your own question, use the session scope wisely. Good practice is to use the smallest scope possible.