Reputation: 319
Guys could you help me please, i stuck with the problem, i have a form, where i'm choosing different services, which should be added to the order. The problem is i can't get these values of chosen checkboxes, there is even no any errors in a console. Looks like my servlet never runs for now, i tried difference ways to fix this issue, but nothing helped me.
Here is for in jsp page:
<!-- SERVICE TABLE -->
<form class="form-horizontal" action="/clients/addOrder/${client.id}" method="POST" >
<table class="table table-striped table-bordered table-condensed" >
<tr>
<th><spring:message code="label.serviceId" /></th>
<th><spring:message code="label.serviceName" /></th>
<th><spring:message code="label.servicePrice" /></th>
<th><spring:message code="label.actions" /></th>
</tr>
<c:forEach var="service" items="${servicesList}">
<tr id="${service.service_id}">
<td><c:out value="${service.service_id}" /></td>
<td><c:out value="${service.service_name}" /></td>
<td><c:out value="${service.service_price}" /></td>
<td><input type="checkbox" name="serviceBox"
value="${service.service_id}" /></td>
</tr>
</c:forEach>
</table>
<div class="form-group form-group-sm">
<div class="col-sm-offset-2 col-sm-10">
<a class="pull-right">
<button class="btn btn-primary" type="submit"><c:out value="Add order"/></button>
</a>
</div>
</div>
<input type="hidden" name="clientId" value="${client.id}">
</form>
servlet
@RequestMapping(value = "/addOrder/{clientId}", method = RequestMethod.POST)
public String addOrder(@Valid @PathVariable("clientId") Long clientId, @ModelAttribute("serviceBox") String[] services, BindingResult result,
Model model) {
System.out.println("IN addOrder POST");
if (result.hasErrors()) {
AllServicesEvent ase = servicesService
.requestAllServices(new RequestAllServicesEvent());
model.addAttribute("servicesList", ase.getServices());
return "addOrderForm";
}
System.out.println("NO MISTAKES");
List<Services> servicesList = servicesService.requestService(new RequestServiceEvent(services)).getServicesList();
System.out.println("Service List size: " + servicesList.size());
if (servicesList != null && servicesList.size() > 0) {
// update orders amount and total price
System.out.println("IN IF METHOD");
ClientUpdatedEvent cue = clientsService.updateClient(new UpdateClientEvent(clientId, servicesList));
System.out.println("AFTER UPDATING CLIENTS");
// add order to orders table, add order id, service id to order_service table
OrderCreatedEvent oce = ordersService.addOrder(new CreateOrderEvent(clientId, servicesList));
System.out.println("AFTER ADDING ORDERS");
return "redirect:/clients";
} else {
return "addOrderForm";
}
}
In console:
Oct 01, 2014 11:07:34 PM org.apache.coyote.AbstractProtocol start
INFO: Starting ProtocolHandler ["http-bio-8080"]
Oct 01, 2014 11:07:34 PM org.apache.coyote.AbstractProtocol start
INFO: Starting ProtocolHandler ["ajp-bio-8009"]
Oct 01, 2014 11:07:34 PM org.apache.catalina.startup.Catalina start
INFO: Server startup in 4926 ms
Oct 01, 2014 11:07:34 PM org.apache.jasper.compiler.TldLocationsCache tldScanJar
INFO: At least one JAR was scanned for TLDs yet contained no TLDs. Enable debug logging for this logger for a complete list of JARs that were scanned but no TLDs were found in them. Skipping unneeded JARs during scanning can improve startup time and JSP compilation time.
Hibernate: select clients0_.client_id as client_i1_3_, clients0_.birthdate as birthdat2_3_, clients0_.city as city3_3_, clients0_.country as country4_3_, clients0_.email as email5_3_, clients0_.first_name as first_na6_3_, clients0_.gender as gender7_3_, clients0_.last_name as last_nam8_3_, clients0_.orders as orders9_3_, clients0_.phone as phone10_3_, clients0_.total_income as total_i11_3_ from clients clients0_
Hibernate: select clients0_.client_id as client_i1_3_0_, clients0_.birthdate as birthdat2_3_0_, clients0_.city as city3_3_0_, clients0_.country as country4_3_0_, clients0_.email as email5_3_0_, clients0_.first_name as first_na6_3_0_, clients0_.gender as gender7_3_0_, clients0_.last_name as last_nam8_3_0_, clients0_.orders as orders9_3_0_, clients0_.phone as phone10_3_0_, clients0_.total_income as total_i11_3_0_ from clients clients0_ where clients0_.client_id=?
Hibernate: select services0_.service_id as service_1_4_, services0_.service_name as service_2_4_, services0_.service_price as service_3_4_ from services services0_
And instead of the result i have only a web page with:
HTTP Status 404 - /clients/addOrder/1
--------------------------------------------------------------------------------
type Status report
message /clients/addOrder/1
description The requested resource is not available.
upd: in this way it works:
@RequestMapping(value = "/addOrder/{clientId}", method = RequestMethod.POST)
public String addOrder(@PathVariable("clientId") Long clientId) {
System.out.println("IN addOrder POST, id" + clientId);
return "addOrderForm";
}
So the only problem how in right way get checkboxed values in servlet.
Upvotes: 0
Views: 18986
Reputation: 655
<script>
$(function() {
$("#selectAll").click(function(){
$('input:checkbox:not(:disabled)').prop('checked', this.checked);
});
})
</script>
<table class="noborder" cellspacing="0" border="0" width="100%">
<tr>
<td><form:label path="selectAll" id="h1"></form:label></td>
<td><form:checkbox path="selectAll" id="selectAll" onclick="selectall(this);"/></td>
<td id="h2">Sr. No.</td>
<td id="h3">Login Name</td>
</tr>
<c:forEach var="loginNameList" items="${loginNameList}" varStatus="status">
<tr>
<td><form:label path="selectAll" id="h1"></form:label></td>
<td><form:checkbox path="lockedItems" value="${loginNameList.uId}" id="lockedItems${status}"/></td>
<td>${status.count}</td>
<td>${loginNameList.loginName}</td>
</tr>
</c:forEach>
<tr>
<td></td>
<td><input type="submit" value="Unlock"></td>
<td></td>
<td></td>
</tr>
</table>
Upvotes: 0
Reputation: 149185
Well it is generally considered as bad practice to give a link only answer on StackOverflow, but really, RTFM ! Spring reference manual has a paragraph on usage of checkboxes.
Here are some extracts :
<form:form>
<table>
<tr>
<td>Interests:</td>
<td>
<%-- Approach 2: Property is of an array or of type java.util.Collection --%>
Quidditch: <form:checkbox path="preferences.interests" value="Quidditch"/>
Herbology: <form:checkbox path="preferences.interests" value="Herbology"/>
Defence Against the Dark Arts: <form:checkbox path="preferences.interests"
value="Defence Against the Dark Arts"/>
</td>
</tr>
</table>
</form:form>
The associated model is :
public class Preferences {
private String[] interests;
public String[] getInterests() {
return interests;
}
public void setInterests(String[] interests) {
this.interests = interests;
}
}
So use <form:checkbox/>
with a path unless you have a good reason not to do so, and use a model that contains an array, not one that is an array
Upvotes: 3