Spring MVC
Konfiguracja środowiska Kontroler Plan wykładu Konfiguracja środowiska Kontroler Realizacja widoku z wykorzystaniem stron jsp Walidacja formularzy Upload i download plików Spring 2.5 Formularz typu Wizzard Inne przydatne zagadnienia Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego
Moduł Spring Web Implementacja wzorca MVC Model Interfejs Controller i wiele jego implementacji Wbudowana walidacja i formatowanie danych Integracja z różnymi technologiami widoku (JSP, JSF, Struts i inne) Zaawansowany mechanizm mapowania URL Wbudowany mechanizm file upload Spring WebFlow – rozszerzenie modułu Web o możliwość definiowania przepływów – ścieżek używania aplikacji webowej Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego
DispatcherServlet Rolę zarządcy pełni zdefiniowany w pliku konfiguracyjnym web.xml serwlet będący instancją klasy DispatcherServlet Jest on odpowiedzialny za przyjmowanie żądań z zewnątrz i przekierowywanie żądań do właściwych kontrolerów Wymagane jest, aby konfiguracja aplikacji internetowej mieściła się w pliku konfiguracyjnym WEB-INF/sample-servlet.xml Do serwletu kontener będzie kierował wszystkie żądania, których adres URL pasuje do wzorca Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego
InternalResourceViewResolver (I) InternalResourceViewResolver zajmuje się odwzorowaniem nazw logicznych na fizyczne adresy zasobów. InternalResourceViewResolver zamienia logiczną nazwę widoku, np. uzytkownik na fizyczne adresy: /WEB-INF/jsp/uzytkownik.jsp Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego
InternalResourceViewResolver (II) <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix"> <value>/WEB-INF/jsp/</value> </property> <property name="suffix"> <value>.jsp</value> </bean> Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego
Kontroler to główny punk obsługi żądań na akcje. Kontroler (I) Kontroler to główny punk obsługi żądań na akcje. Kontroler implementuje logikę biznesową. Wynikiem działania kontrolera jest zwrócony obiekt ModelAndView, zawierający logiczną nazwę widoku. return new ModelAndView("/uzytkownik/uzytkownikRekord”); return new ModelAndView(new RedirectView(”uzytkownikList.html", true)) Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego
Kontroler (II) private final static String FORM_VIEW = "uzytkownik/uzytkownikRekord"; private final static String SUCCESS_VIEW = "uzytkownikList.html"; return FORM_VIEW; return "redirect:" + SUCCESS_VIEW; Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego
@Controller(”uzytkownikList”) //@SessionAttributes public class UzytkownikListController { ... } Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego
sessionStatus.setComplete(); @SessionAtribute @SessionAttributes( value = { ”adresCommand", "raportCommand", ”uzytkownikCommand", ”ksiazkaCommand"}) sessionStatus.setComplete(); Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego
@RequestMapping (I) @RequestMapping (method = RequestMethod.GET, value = "/uzytkownik/uzytkownikRekord.html") public String getForm( Model model, HttpServletRequest request) Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego
@RequestMapping (II) @RequestMapping (method = RequestMethod.POST, value = "/uzytkownik/uzytkownikRekord.html") public String submitForm( Model model, @RequestParam(defaultValue = "0”) int page, HttpServletRequest request, HttpServletResponse response, @ModelAttribute(”command") Command command, BindingResult bindingResult, SessionStatus sessionStatus)) Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego
@RequestParam @RequestParam String adres @RequestParam(defaultValue = "0", required = false) int page @RequestParam Integer[] kursId @RequestParam(defaultValue = "-1", required = false, value = ”uzytkownikId") Uzytkownik uzytkownik) Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego
@PathVariable (I) @RequestMapping(method = RequestMethod.GET, value = "/uzytkownik/zdjecie/{id}") public void zdjecie( @PathVariable int id, HttpServletResponse response) { if (id == 0) return; ... } Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego
@PathVariable (II) @RequestMapping(method = RequestMethod.GET, value = "/dane/{wydzial}/uzytkownik/{email}") public void getForm(@PathVariable(”wydzial") String namiar, @PathVariable String email) Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego
@ModelAttribute @ModelAttribute(”uzytkownikCommand”) UzytkownikCommand uzytkownikCommand, @ModelAttribute(”uzytkownikCommand") public UzytkownikCommand formBackingObject() { UzytkownikCommand uzytkownikCommand = new UzytkownikCommand(); return uzytkownikCommand; } Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego
Model model.addAttribute(”uzytkownikCommand", new uzytkownikCommand()); void referenceData(Model model) { List<Slownik> wojewodztwoList = new ArrayList<Slownik>(); Preselection preselection = new preselection(Wojewodztwo.class); preselection.setActive(true); wojewodztwoList = slownikService.findByCriteria(preselection); model.addAttribute("wojewodztwoList", wojewodztwoList); } Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego
Sterowanie <input type="submit" name="obsluga" value="Koniec"/> String akcja = ServletRequestUtils.getStringParameter(request, "obsluga”, null); if (”Koniec".equals(akcja)) { .... } if (WebUtils.hasSubmitParameter(request, "obsluga")) { .... } Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego
ApplicationContextAware public class UzytkownikRekordController implements ApplicationContextAware private ApplicationContext applicationContext; applicationContext.getBean(serviceBeanName) Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego
@initBinder (I) @InitBinder public void initBinder(WebDataBinder binder) { binder.registerCustomEditor(Date.class, "dataUrodzenia", new DateEditor()) binder.registerCustomEditor(Uzytkownik.class, new EntityEditor(applicationContext, ”uzytkownikService")); } Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego
DataBinder void registerCustomEditor(Class referenceData, String field, PropertyEditor propertyEditor) void setAllowedFields(String[] allowedFields) void setDisallowedFields(String[] disallowedFields) void setRequiredFields(String[] requiredFields) binder.setDisallowedFields(new String[] {"id"}) Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego
Editor (I) public class DateEditor extends PropertyEditorSupport { private DateFormat dateFormat; public DateEditor(Locale locale) super(); dateFormat = DateFormat.getDateInstance(DateFormat.MEDIUM, locale); } Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego
Editor (II) public String getAsText() { Date value = (Date) getValue(); if (value != null) return dateFormat.format(value) ; return ””; } Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego
Editor (III) public void setAsText(String text) throws IllegalArgumentException { if (StringUtils.hasText(text)) setValue(dateFormat.parse(text)); //obsługa błędu } else setValue(null); Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego
Editor (IV) public class EntityEditor extends PropertyEditorSupport { private Object serviceBean; public EntityEditor(ApplicationContext ctx, String serviceBeanName) this.serviceBean = ctx.getBean(serviceBeanName); } Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego
Editor (V) @Override public String getAsText() { Object entity = getValue(); if (entity == null) return "-1"; Method getId = entity.getClass().getMethod(”getId”); int id = (Integer) getId.invoke(entity); return String.valueOf(id); } Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego
Editor (VI) @Override public void setAsText(String textId) throws IllegalArgumentException { int id = Integer.parseInt(textId); Method getEntity = serviceBean.getClass().getMethod(”get”, int.class); Object entity = getEntity.invoke(serviceBean, id); setValue(entity); } Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego
Spring 3 Type Conversion (I) public abstract class GenericConverter<T> implements Converter<String,T> { protected GenericDAO<T> dao; public abstract void setDao(GenericDAO<T> dao); Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego
Spring 3 Type Conversion (II) public T convert(String source) { if (!StringUtils.hasText(source)) return null; int id = Integer.parseInt(source); if (id < 0) return null; return dao.get(id); } Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego
Spring 3 Type Conversion (III) public class WydzialConverter extends GenericConverter<Wydzial> implements Converter<String, Wydzial> { .... // setter do dao } Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego
Spring 3 Type Conversion (IV) public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; Wydzial wydzial = (Wydzial) obj; if (this.getId() == wydzial.getId()) return true; return false; } Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego
Spring 3 Type Conversion (V) binder.setConversionService(conversionService) <mvc:annotation-driven conversion-service="conversionService" /> <bean id="conversionService" class="org.springframework.format.support. FormattingConversionServiceFactoryBean"> <property name="converters"> <list> <bean class=”common.WydzialConverter"></bean> <bean class=”common.WojewodztwoConverter"></bean> </list> </property> </bean> Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego
Widok - zastosowanie EL ${zmienna.pole} true i false liczby całkowite i zmiennoprzecinkowe łańcuchy znaków operatory arytmetyczne: + - * / % mod div operatory logiczne: and or not && || ! operatory porównania: == != => > <= < lt gt le ge eq ne empty, null, instrukacja warunkowa A ? B : C Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego
value = "<%=TypDostepu.ADMINSTRATOR %>" var = ”admin” /> c:set <c:set value = "<%=TypDostepu.ADMINSTRATOR %>" var = ”admin” /> <c:when test="${dostep eq admin}"> ... Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego
<div class="value"> c:out <div class="value"> <c:out value="${uzytkownikCommand.uzytkownik.imie} ” /> </div> Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego
<c:if test="${page == 1}”> .... </c:if> <c:if test="${ not empty uzytkownikCommand.uzytkownik.dzieci}"> Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego
c:url <c:url value="uzytkownikRecord.html" var="adresurl” /> <a href = "<c:url value="uzytkownikRekord.html?id=${pozycja.id}"></c:url>">Edit</a> <a href="<c:url value="uzytkownikRekord.html"></c:url>">Dodaj nowy</a> Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego
c:when <c:choose> <c:when test="${uzytkownikCommand.typOP}"> <legend>Adres</legend> <c:out value="Nie dotyczy"></c:out> </c:when> <c:otherwise> .... </c:otherwise> </c:choose> Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego
c:forEach <c:forEach items="${uzytkownikCommand.uzytkownik.dzieci}" var=”dziecko" varStatus="loop” begin=”0” end=”10”> <c:out value="${loop.index + 1}."/> <c:out value=”dziecko[${loop.index}].imie”/> <form:input path=”dziecko[${loop.index}].nazwisko"/> </c:forEach> Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego
Biblioteka funkcji (I) ${fn:length(uzytkownikCommand.dzieckoList)} ${fn:length(uzytkownikCommand.imie)} ${fn:substringAfter(obiekt.nazwa,"Opis: ")} Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego
Biblioteka funkcji (II) boolean contains(String, String) boolean containsIgnoreCase(String, String) boolean endsWith(String, String) int indexOf(String,String) String join(String[], String) int length(Object) String replace(String, String, String) String[] split(String, String) boolean startsWith(String, String) String substring(String, int, int) Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego
Biblioteka funkcji (III) String substringAfter(String, String) String substringBefore(String, String) String toLowerCase(String) String toUpperCase(String) String trim(String) Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego
spring:nestedPath <spring:nestedPath path="uzytkownik.adres"> <form:label path="ulica">Ulica</form:label> <form:input path="ulica" "/> <br/> <form:label path=”kod">Ulica</form:label> <form:input path=”kod" "/> </spring:nestedPath> Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego
<spring:message code=”opis.uzytkownik.imie"/> <spring:message code=”miejscowosc" var=”miejscowosc" /> <display:column title="${miejscowosc}”> ... Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego
form:form <form:form name="nazwa" modelAttribute=”uzytkownikCommand" method="POST” > ... </form:form> Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego
form:input (I) imię:<form:input path=”uzytkownik.imie" /> nazwisko:<form:input path=”uzytkownik.nazwisko" /> Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego
form:input (II) path disabled size, maxlength id, title onblur, onchange, onclick, ondblclick, onfocus, onkeydown, onkeypress, onkeyup, onmousedown, onmousemove, onmouseout, onmouseover, onmouseup, onselect cssClass, cssErrorClass, cssStyle Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego
form:password <form:password path="newhaslo1" /> Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego
form:checkbox <form:checkbox path=”uzytkownik.aktualny"/> Sport: <form:checkbox path=”uzytkownik.zainteresowania" value=”sport"/> Gry: <form:checkbox path="uzytkownik.zainteresowania” value=”gry"/> Inne: <form:checkbox path="uzytkownik.zainteresowania” value=”inne"/> TV: <form:checkbox path="uzytkownik.abonament" value=”tv"/> Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego
form:checkboxs <form:label path="odbiorcy">Wyślij wiadomość do: </form:label> <form:checkboxes items="${uzytkownicy}" itemLabel="label" itemValue="id" path="odbiorcy" delimiter="<br/>” /> Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego
form:radiobutton Płeć:<br/> Mężczyzna: <form:radiobutton path=”uzytkownik.plec" value="M"/> <br/> Kobieta: <form:radiobutton path=”uzytkownik.plec" value="F"/> <br/> Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego
<form:radiobuttons items="<%=TypRegulacji.values()%>" itemLabel="label” path="typ" delimiter="<br>" /> Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego
<form:textarea path=”uzytkownik.opis" rows="3" cols="20" /> <form:errors path=”uzytkownik.opis" /> Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego
form:select, form:option, form:options (I) Wykształcenie <form:select path=”uzytkownik.wyksztalcenie" items="${wyksztalcenieList}"/> <form:select path="uzytkownik.wyksztalcenie"> <form:option value=”Podstawowe"/> <form:option value=”Średnie"/> <form:option value=”Wyższe"/> </form:select> Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego
form:select, form:option, form:options (II) <form:label path="uzytkownik.wydzial">Wydział</form:label> <form:select path="uzytkownik.wydzial"> <form:option value="-1" label="-"/> <form:options items="${wydzialLista}" itemLabel="nazwa" itemValue="id"/> </form:select> Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego
spring:bind <spring:bind path=”uzytkownikCommand.wyksztalcenie_id"> <select size="1" name=”wyksztalcenie_id"/> <c:forEach var=”wyksztalcenie" items="${wyksztalcenieLista}"> <option value="${wyksztalcenie.id}" <c:if test="${uzytkownikCommand.wyksztalcenie_id==wyksztalcenie.id}"> SELECTED </c:if>> <c:out value="${wyksztalcenie.nazwa}"/> </option> </c:forEach> </select> </spring:bind> Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego
Typ wyliczeniowy (I) public enum TypPlik { DOC("doc"), PDF("pdf"), JPG("jpg"), XLS("xls"); private final String label; private TypPlik(String label) public String getLabel() Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego
Typ wyliczeniowy (II) private static Map<String, TypPlik> actionMap; static { actionMap = new HashMap<String,TypPlik>(); for (TypPlik a : TypPlik.values()) actionMap.put(a.label, a); } public static TypPlik get(String label) { return actionMap.get(label); } Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego
Typ wyliczeniowy (III) public String getOpisResponse() { if (this == TypPlik.DOC) return "application/msword"; if (this == TypPlik.JPG) return "image/jpg"; if (this == TypPlik.PDF) return "application/pdf"; if (this == TypPlik.XLS) return "application/excel"; return ""; } Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego
<%@ page import=”przyklad.types.Typ"%> Typ wyliczeniowy (IV) <%@ page import=”przyklad.types.Typ"%> <form:select path="typ"> <form:options items="<%=Typ.values()%>" itemLabel=”label"/> </form:select> Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego
Internacjonalizacja MessageSource (I) <bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource"> <property name="basename" value="messages" /> </bean> <bean id="fixedLocaleResolver" class="org.springframework.web.servlet.i18n.FixedLocaleResolver"> <property name="defaultLocale" value="pl" /> Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego
Internacjonalizacja MessageSource (II) <bean id="messageSource" class="org.springframework.context. support.ReloadableResourceBundleMessageSource"> <property name="basenames"> <list> <value>WEB-INF/text/errorMessages</value> <value>WEB-INF/text/mailMassages</value> </list> </property> <property name="defaultEncoding" value="utf-8" /> </bean> Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego
Internacjonalizacja - przykład (I) typeMismatch.java.lang.Integer = Niepoprawny format dla liczby typeMismatch.java.math.Float = Niepoprawny format dla liczby typeMismatch.java.util.Date = Format daty niepoprawny typeMismatch = Niepoprawny format danej error.invalidArguments = Nieprawidłowe wartości parametrów error.security.brakUprawnien = Brak uprawnień Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego
Internacjonalizacja - przykład (II) form.page.title = Dodawanie aktualności form.title = Tytuł form.abstract = Nagłówek aktualności: form.position = Kolejność na liśie: form.active = Aktywny form.date = Data(RRRR-MM-DD): form.submit = Zapisz opis.uzytkownik.imie = imię Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego
Walidator - przykład (I) public class UzytkownikValidator implements Validator { public boolean supports(Class c) { return Uzytkownik.class.equals(c); } public void validate(Object object, Errors error) Uzytkownik uzytkownik = (Uzytkownik) object; ValidationUtils.rejectIfEmpty(error, ”imie", ”pole.required"); if (uzytkownik.getWiek() < 0) error.rejectValue(”wiek", ”pole.ujemne"); if (uzytkownik.getWiek() > 110) error.rejectValue(”wiek", "too.stary"); }} Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego
Walidator - przykład (II) if (errors.getErrorCount() == 0) { if (uzytkownik.getLogin().length()>100) errors.rejectValue("uzytkownik.login", "error.field.tooLong",new Object[]{"100”},""); } error.field.tooLong = Pole może zawierać nie więcej niż {0} znaków. Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego
Walidator - przykład (III) if (nip.length() != 10) .... ; int[] waga = {6,5,7,2,3,4,5,6,7}; int sumaKontrolna = new Integer(nip.substring(nip.length() - 1)).intValue(); int sumaLiczona = 0; for (int i = 0; i < nip.length() - 1; ++i) sumaLiczona += Integer(String.valueOf(nip.charAt(i))).intValue()*waga[i]; sumaLiczona = sumaLiczona % 11; if (sumaLiczona != sumaKontrolna) ...... ; int[] wagaPESEL= {1,3,7,9,1,3,7,9,1,3}; sumaLiczona = 10 - sumaLiczona % 10; // 10 >> 0 Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego
Walidator - przykład (IV) String napis = numerRachunku.substring(2) + "2521" + numerRachunku().substring(0, 2); String napisCzesc = napis.substring(0, 6); Integer liczba = Integer.valueOf(napisCzesc); napisCzesc = Integer.toString(liczba % 97) + napis.substring(6, 12); liczba = Integer.valueOf(napisCzesc); napisCzesc = Integer.toString(liczba % 97) + napis.substring(12, 18); napisCzesc = Integer.toString(liczba % 97) + napis.substring(18, 24); napisCzesc = Integer.toString(liczba % 97) + napis.substring(24, 30); liczba = Integer.valueOf(napisCzesc) % 97; if (liczba.intValue() != 1) ... Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego
BindingResult (errors) (I) errors.getErrorCount(); errors.getAllErrors(); errors.getFieldErrors(); errors.getGlobalErrors(); errors.setNestedPath("uzytkownik"); errors.pushNestedPath(”uzytkownik"); errors.popNestedPath(); Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego
BindingResult (errors) (II) errors.pushNestedPath(”adresZamieszkania"); adresValidator.validate(uzytkownik.getAdresZamieszkania, errors); if (errors.getErrorCount() == 0) { ..... } errors.popNestedPath(); Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego
form:errors ValidationUtils.rejectIfEmptyOrWhitespace(errors, ”imie", "required", ”Pole jest wymagane"); Imię: <form:input path=”imie" /> <form:errors path=”imie" /> <input type="submit" value=”zapisz" /> Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego
Walidator - błąd globalny errors.reject("error.sumaKontrola"); <spring:hasBindErrors name=”uzytkownikCommand"> <c:forEach items="${errors.globalErrors}" var="error"> <spring:message code="${error.code}"/> </c:forEach> </spring:hasBindErrors> <form:errors path="*" /> Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego
Walidator - walidatory standardowe if (EmailValidator.getInstance().isValid(uzytkownik.getEmail()) == false) { errors.rejectValue(”uzytkownik.email","error.email.invalid"); } DateValidator UrlValidator Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego
Upload plików (I) <bean id="multipartResolver" class="org.springframework.web. multipart.commons.CommonsMultipartResolver"> <property name="maxUploadSize"> <value>107374182400</value> <!-- 100MB --> </property> </bean> binder.registerCustomEditor(byte[].class, new ByteArrayMultipartFileEditor()); Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego
Upload plików (II) <label>Zapisz plik wzoru:</label> <input id="plik" name="plik" type="file"> <br> <form:form modelAttribute=”ksiazkaCommand" enctype="multipart/form-data" method="POST"> Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego
Upload plików (III) @Lob private byte[] plikWBazie; MultipartFile plik; plik = ((MultipartRequest)request).getFile("plik"); plik.getOriginalFilename() plik.getBytes(); Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego
Download plików (I) <c:if test="${not empty ksiazkaCommand.ksiazka.plik}"> <a href="<c:url value="plik.html?id=${ksiazkaCommand.ksiazka.id}"/>" target="_blank">Pobierz plik </a> </c:if> Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego
Download plików (II) @RequestMapping(value = "plik.html") public void pobierzPlik(HttpServletResponse response) { int id = ServletRequestUtils.getIntParameter(request, ”id", -1); Ksiazka ksiazka = ksiazkaService.pobierzPlik(id); response.setContentType(ksiazka.getMimeType()); response.setHeader("Content-Disposition", "inline; filename="+ ksiazka.getNazwa() + "." + ksiazka.getRozszerzenie()); Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego
Download plików (III) OutputStream os = response.getOutputStream(); os.write(ksiazka.getPlik()); os.flush(); os.close(); } Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego
Spring 2.5 - Mapowanie adresów url <bean name="insertUzytkownik" class=”przyklad.InsertUzytkownik"> <property name="uzytkownikDAO" ref="uzytkownikDAO" /> </property> </bean> <bean id="simpleUrlMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping"> <property name="mappings"> <props> <prop key="/admin/insertUzytkownik.htm">insertUzytkownik</prop> </props> Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego
Spring 2.5 - kontrolery Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego
Spring 2.5 - przykładowy kontroler public class PrzykładowyController extends AbstractController { public ModelAndView handleRequestInternal( HttpServletRequest request, HttpServletResponse response) throws Exception ModelAndView mav = new ModelAndView("hello"); mav.addObject("message", "Hello World!"); return mav; } bean id="sampleController" class="samples.SampleController"> </bean> Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego
Spring 2.5 - kontroler (konstruktor) public editUzytkownik() { super(); setCommandClass(UzytkownikCommand.class); setCommandName(”uzytkownikCommand"); setBindOnNewForm(true); setSessionForm(true); } Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego
Spring 2.5 - kontroler (parametry widoku) <bean name="slownikRekordController" class="controller.slownik.SlownikRekordController"> <property name="formView" value="slownikRekord"/> <property name="successView” value="slownikLista"/> </bean> String getSuccessView(); String getFormView(); setSuccessView(String successView); setFormView(String formView); Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego
Spring 2.5 - kontroler (start formularza) 1. formBackingObject 2. initBinder 3. onBindOnNewForm (setBindOnNewForm(true)) 4. showForm 4a. referenceData Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego
Spring 2.5 - kontroler (submit formularza) 1. formBackingObject (jeżeli setSessionForm(false)) 2. handleInvalidSubmit 3. onBind 4. Walidacja 5. onBindAndValidate 6. processFormSubmission 7. onSubmit (albo showForm) Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego
Spring 2.5 - kontroler (onSubmit) protected ModelAndView onSubmit(HttpServletRequest request, HttpServletResponse response, Object command, org.springframework.validation.BindException errors) throws Exception { RedirectView rv; Uzytkownik uzytkownik = (Uzytkownik) command; uzytkownikService.persist(uzytkownik); rv = new RedirectView("editUzytkownik.htm?id="+uzytkownik.getId()"); rv.setContextRelative(true); return new ModelAndView(rv); } Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego
Spring 2.5 - AbstractWizardFormController (I) lista widoków wchodzących w skład wizarda status: finish, cancel, page_change przechodzenie pomiędzy widokami w wizardzie (nawet gdy walidacja sie nie powiodła – "dirty back", "dirty forward") zmiana kolejności stron / omijanie wybranych stron bieżący widok zapisany w sesji Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego
Spring 2.5 - AbstractWizardFormController (II) postProcessPage processFinish processCancel suppressValidation validatePage getInitialPage Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego
Wizard - jsp (I) <c:choose> <c:when test="${uzytkownikCommand.uzytkownik.id == 0}"> Rejestracja uzytkownika.</c:when> <c:otherwise>Edycja uzytkownika: ${uzytkownikCommand.uzytkownik.label}</c:otherwise> </c:choose> Strona ${page} z 5: ${pageTitleList[page]} Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego
Wizard - jsp (II) <c:url value="editUzytkownik.htm" var="adresurl"/> <form:form action="${adresurl}"> .... </form:form> Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego
Wizard - jsp (III) <input name="page" type="submit" value=”page1" /> ... <c:forEach items="${pageTitleList}" var="pageTitle" varStatus=”loop"> <c:choose> <c:when test="${page eq loop.index}"> <button type="submit" name="page" value=”${loop.index}" cssClass="button_selected">${pageTitle}</button> </c:when> <c:otherwise> <button type="submit" name="page" value=”${loop.index}" cssClass="button">${pageTitle}</button> </c:otherwise> </c:choose> </c:forEach> Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego
// nagłówek widoczny nad każdą stroną <br /> Wizard - jsp (IV) // blok globalError // nagłówek widoczny nad każdą stroną <br /> <jsp:include page="${pageList[page]}.jsp" /> Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego
Wizard - jsp (V) <s:button type="submit" value=”prev" name=”page" <input name=”prev" type="submit" value="Poprzedni" /> <input name=”next" type="submit" value=”Następny" /> <s:button type="submit" value=”prev" name=”page" disabled="${page le 0}"> Poprzednia strona</s:button> <s:button type="submit" value=”next" name="page" disabled="${page ge pageCount-1}"> Nastęna strona</s:button> Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego
Tabela - obiekt Command (I) public class UzytkownikCommand { Uzytkownik uzytkownik; Dziecko dziecko = new Dziecko(); private int dzieckoIndex = -1; ...... Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego
Tabela - obiekt Command (II) public boolean isNewDziecko() { return pozycjaIndex < 0; } public void zmienDziecko() { if (isNewDziecko()) uzytkownik.getDzieci().add(dziecko); else uzytkownik.getDzieci().get(dzieckoIndex).clone(dziecko); dziecko = new Dziecko(); //inicjalizacja dzieckoIndex = -1; } Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego
Tabela - obiekt Command (III) public void edytujDziecko(int index) { dzieckoIndex = index; dziecko = new Dziecko(); dziecko.clone(uzytkownik.getDzieci().get(index)); } public void usunDziecko(int index) dziecko.getDzieci().remove(index); dzieckoIndex = -1; Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego
Tabela - kontroler int row = ServletRequestUtils.getIntParameter(request, "row", -1); if ("zapisz".equals(akcja)) uzytkownikCommand.zmienDziecko(); if ("edycja".equals(akcja)) { if (row == -1) return; uzytkownikCommand.edytujDziecko(row); } if ("usun".equals(akcja)) uzytkownikCommand.usunDziecko(row); Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego
Tabela - jsp (I) <center><big><form:errors path=”uzytkownik.dzieci" cssClass="error_field"/></big></center> <display:table id=”dziecko" list="${uzytkownikCommand.uzytkownik.dzieci}"> <display:column title=""> <input type="radio" name="row" value="${dziecko_rowNum-1}" /> </display:column> <display:column title=”Imię" property=”imie"/> </display:table> <button type="submit" value="edycja” name=”page">Edycja</button> <button type="submit" value="usun" name=”page">Usuń</button> Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego
Tabela - jsp (II) <spring:nestedPath path=”dziecko"> imię:<form:input path=”imie" /> </spring:nestedPath> <button type="submit" value="zapisz" name=”page”> ${uzytkownikCommand.newDziecko ? 'Dodaj' : 'Zapisz'} </button> Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego