Chcę udostępnić możliwość przeszukiwania bazy danych w swoim CRUDzie. Apka ma kilka beanów, min. payment i contact. Obydwa beany mają field o nazwie 'name'. Zrobiłem tabelkę w jsp gdzie każdy TR to osobny formularz.
<tr>
<td><spring:message code="search.tableRowPaymentByName" /></td>
<sf:form method="post" action="${pageContext.request.contextPath}/searchpaymentbyname" commandName="payment">
<td><sf:input path="name" type="text" /></td>
<td><input class="formButton" type="submit" value="<spring:message code='button.search'/>" /></td>
<td><div class="errors"><sf:errors path="name" /></div></td>
</sf:form>
</tr>
<tr>
<td><spring:message code="search.tableRowContact" /></td>
<sf:form method="post" action="${pageContext.request.contextPath}/searchcontact" commandName="contact">
<td><sf:input path="name" type="text" /></td>
<td><input class="formButton" type="submit" value="<spring:message code='button.search'/>" /></td>
<td><div class="errors"><sf:errors path="name" /></div></td>
</sf:form>
</tr>
Controller, który zwraca widok wygląda:
Controller
public class TimetableController {
@RequestMapping("/")
public String showHome(Payment payment, Contact contact){
return "home";
}
Przykładowo, jeśli user zechce poszukać paymentu po nazwie, to uruchomi się ta metoda PaymentControllera:
@RequestMapping(value = "/searchpaymentbyname")
public String searchPaymentByName(Model model, Payment payment, BindingResult rs, Contact contact) {
List<Payment> result = null;
if (payment.getName().isEmpty()) {
return "redirect:/payments";
}
result = paymentService.findByName(payment.getName());
if (result.size() < 1) {
rs.rejectValue("name", "search.paymentByName.notFound");
return HOME;
} else {
model.addAttribute(ALL_PAYMENTS, result);
return PAYMENTS;
}
}
Problem pojawia się w chwili, kiedy zostanie wprowadzona fraza, dla której nie ma wyników, czyli ta część kodu zostanie wykonana:
if (result.size() < 1) {
rs.rejectValue("name", "search.paymentByName.notFound");
return HOME;
Komunikat o braku wyników wyświetli się prawidłowo, wrócimy z powrotem do widoku z formularzem, natomiat zarówno input dla pola 'name' z Payment jak i dla pola 'name' z Contact będą miały wartość taką, jak wklepana uprzednio w inpucie Payment. Oczywiście wygląda to dokładnie tak samo w drugą stroną. Idzie oczywiście o to, żeby owszem, user wrócił do widoku z formularzem i zastał wklepaną przez siebie frazę wraz z informacją o tym, iż dla niej nie ma rezultatów w bazie dannych, natomiast niech ta wartość będzie wyłącznie w tym inpucie, w którym została pierwotnie wklepana.
Przy okazji chciałem zapytać, o to jak najsensowniej wykonać taki formularz szukający, w sytuacji, gdzie mamy kilka beanów z różnymi polami. Ta moja obecna wersja z całą pewnością ma dość chałupniczy charakter, ale tak to jest, jak się człowiek dopiero uczy. Póki co mam osobny button dla każdego fieldu, bo myślałem, że dodanie jednego przycisku bedzie problematyczne o tyle, o ile z wieloma inputami textowymi i jednym przyciskiem należałoby wprowadzić wiele if'ów (co w sytuacji, gdzie wklepano dane w więcej niż jeden input text itd.).