1k likes | 1.17k Views
Spring MVC. 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. Moduł Spring Web. Implementacja wzorca MVC Model
E N D
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> </property> </bean> Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego
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 @Controller(”uzytkownikList”) //@SessionAttributes public class UzytkownikListController { ... } Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego
@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
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
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 <c:if test="${page == 1}”> .... </c:if> <c:if test="${ not empty uzytkownikCommand.uzytkownik.dzieci}"> </c:if> 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" "/> <br/> </spring:nestedPath> Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego
spring:message <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