Wyklad56(SpringMVC)

Download Report

Transcript Wyklad56(SpringMVC)

Projektowanie warstwy serwera
Spring MVC
Plan wykładu
•
•
•
•
•
•
•
•
Projektowanie warstwy serwera
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
2
Moduł Spring Web
Projektowanie warstwy serwera
3
• 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
Projektowanie warstwy serwera
4
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/sampleservlet.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
Projektowanie warstwy serwera
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
5
Projektowanie warstwy serwera
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
6
Projektowanie warstwy serwera
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
7
Projektowanie warstwy serwera
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
8
Projektowanie warstwy serwera
@Controller
@Controller(”uzytkownikList”)
//@SessionAttributes
public class UzytkownikListController
{
...
}
Projekt współfinansowany przez Unię Europejską
w ramach Europejskiego Funduszu Społecznego
9
Projektowanie warstwy serwera
@SessionAtribute
@SessionAttributes( value = { ”adresCommand",
"raportCommand", ”uzytkownikCommand",
”ksiazkaCommand"})
sessionStatus.setComplete();
Projekt współfinansowany przez Unię Europejską
w ramach Europejskiego Funduszu Społecznego
10
Projektowanie warstwy serwera
@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
11
Projektowanie warstwy serwera
12
@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
Projektowanie warstwy serwera
@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
13
Projektowanie warstwy serwera
14
@PathVariable (I)
@RequestMapping(method = RequestMethod.GET,
= "/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
value
Projektowanie warstwy serwera
15
@PathVariable (II)
@RequestMapping(method = RequestMethod.GET,
= "/dane/{wydzial}/uzytkownik/{email}")
value
public void getForm(@PathVariable(”wydzial") String namiar,
@PathVariable String email)
Projekt współfinansowany przez Unię Europejską
w ramach Europejskiego Funduszu Społecznego
Projektowanie warstwy serwera
@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
16
Projektowanie warstwy serwera
17
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
Projektowanie warstwy serwera
18
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
Projektowanie warstwy serwera
ApplicationContextAware
public class UzytkownikRekordController implements
ApplicationContextAware
private ApplicationContext applicationContext;
applicationContext.getBean(serviceBeanName)
Projekt współfinansowany przez Unię Europejską
w ramach Europejskiego Funduszu Społecznego
19
Projektowanie warstwy serwera
20
@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
Projektowanie warstwy serwera
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
21
Projektowanie warstwy serwera
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
22
Projektowanie warstwy serwera
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
23
Projektowanie warstwy serwera
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
24
Projektowanie warstwy serwera
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
25
Projektowanie warstwy serwera
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
26
Projektowanie warstwy serwera
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
27
Projektowanie warstwy serwera
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
28
Projektowanie warstwy serwera
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
29
Projektowanie warstwy serwera
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
30
Projektowanie warstwy serwera
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
31
Projektowanie warstwy serwera
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
32
Projektowanie warstwy serwera
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
33
Projektowanie warstwy serwera
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
34
Projektowanie warstwy serwera
c:out
<div class="value">
<c:out
value="${uzytkownikCommand.uzytkownik.imie} ”
/>
</div>
Projekt współfinansowany przez Unię Europejską
w ramach Europejskiego Funduszu Społecznego
35
Projektowanie warstwy serwera
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
36
Projektowanie warstwy serwera
37
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
Projektowanie warstwy serwera
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
38
Projektowanie warstwy serwera
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
39
Projektowanie warstwy serwera
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
40
Projektowanie warstwy serwera
Biblioteka funkcji (II)
boolean
boolean
boolean
int
String
int
String
String[]
boolean
String
contains(String, String)
containsIgnoreCase(String, String)
endsWith(String, String)
indexOf(String,String)
join(String[], String)
length(Object)
replace(String, String, String)
split(String, String)
startsWith(String, String)
substring(String, int, int)
Projekt współfinansowany przez Unię Europejską
w ramach Europejskiego Funduszu Społecznego
41
Projektowanie warstwy serwera
Biblioteka funkcji (III)
String
String
String
String
String
substringAfter(String, String)
substringBefore(String, String)
toLowerCase(String)
toUpperCase(String)
trim(String)
Projekt współfinansowany przez Unię Europejską
w ramach Europejskiego Funduszu Społecznego
42
Projektowanie warstwy serwera
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
43
Projektowanie warstwy serwera
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
44
Projektowanie warstwy serwera
form:form
<form:form
name="nazwa"
modelAttribute=”uzytkownikCommand"
method="POST”
>
...
</form:form>
Projekt współfinansowany przez Unię Europejską
w ramach Europejskiego Funduszu Społecznego
45
Projektowanie warstwy serwera
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
46
Projektowanie warstwy serwera
47
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
Projektowanie warstwy serwera
form:password
<form:password
path="newhaslo1"
/>
Projekt współfinansowany przez Unię Europejską
w ramach Europejskiego Funduszu Społecznego
48
Projektowanie warstwy serwera
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
49
Projektowanie warstwy serwera
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
50
Projektowanie warstwy serwera
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
51
Projektowanie warstwy serwera
form:radiobuttons
<form:radiobuttons
items="<%=TypRegulacji.values()%>"
itemLabel="label”
path="typ"
delimiter="<br>"
/>
Projekt współfinansowany przez Unię Europejską
w ramach Europejskiego Funduszu Społecznego
52
Projektowanie warstwy serwera
form:textarea
Opis:
<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
53
Projektowanie warstwy serwera
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
54
Projektowanie warstwy serwera
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
55
Projektowanie warstwy serwera
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
56
Projektowanie warstwy serwera
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
57
Projektowanie warstwy serwera
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
58
Projektowanie warstwy serwera
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
59
Projektowanie warstwy serwera
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
60
Projektowanie warstwy serwera
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" />
</bean>
Projekt współfinansowany przez Unię Europejską
w ramach Europejskiego Funduszu Społecznego
61
Projektowanie warstwy serwera
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
62
Projektowanie warstwy serwera
Internacjonalizacja - przykład (I)
typeMismatch.java.lang.Integer
typeMismatch.java.math.Float
typeMismatch.java.util.Date
typeMismatch
= Niepoprawny format dla liczby
= Niepoprawny format dla liczby
= Format daty niepoprawny
= 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
63
Projektowanie warstwy serwera
Internacjonalizacja - przykład (II)
form.page.title
form.title
form.abstract
form.position
form.active
form.date
form.submit
= Dodawanie aktualności
= Tytuł
= Nagłówek aktualności:
= Kolejność na liśie:
= Aktywny
= Data(RRRR-MM-DD):
= Zapisz
opis.uzytkownik.imie = imię
Projekt współfinansowany przez Unię Europejską
w ramach Europejskiego Funduszu Społecznego
64
Walidator - przykład (I)
Projektowanie warstwy serwera
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
65
Walidator - przykład (II)
Projektowanie warstwy serwera
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
66
Walidator - przykład (III)
Projektowanie warstwy serwera
67
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)
Projektowanie warstwy serwera
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);
liczba = Integer.valueOf(napisCzesc);
napisCzesc = Integer.toString(liczba % 97) + napis.substring(18, 24);
liczba = Integer.valueOf(napisCzesc);
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
68
Projektowanie warstwy serwera
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
69
Projektowanie warstwy serwera
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
70
Projektowanie warstwy serwera
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
71
Walidator - błąd globalny
Projektowanie warstwy serwera
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
72
Projektowanie warstwy serwera
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
73
Projektowanie warstwy serwera
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
74
Projektowanie warstwy serwera
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
75
Projektowanie warstwy serwera
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
76
Projektowanie warstwy serwera
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
77
Projektowanie warstwy serwera
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
78
Projektowanie warstwy serwera
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
79
Projektowanie warstwy serwera
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>
</property>
</bean>
Projekt współfinansowany przez Unię Europejską
w ramach Europejskiego Funduszu Społecznego
80
Projektowanie warstwy serwera
Spring 2.5 - kontrolery
Projekt współfinansowany przez Unię Europejską
w ramach Europejskiego Funduszu Społecznego
81
Projektowanie warstwy serwera
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
82
Projektowanie warstwy serwera
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
83
Projektowanie warstwy serwera
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
84
Projektowanie warstwy serwera
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
85
Projektowanie warstwy serwera
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
86
Projektowanie warstwy serwera
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
87
Projektowanie warstwy serwera
88
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
Projektowanie warstwy serwera
Spring 2.5 - AbstractWizardFormController (II)
•
•
•
•
•
•
postProcessPage
processFinish
processCancel
suppressValidation
validatePage
getInitialPage
Projekt współfinansowany przez Unię Europejską
w ramach Europejskiego Funduszu Społecznego
89
Projektowanie warstwy serwera
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
90
Projektowanie warstwy serwera
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
91
Projektowanie warstwy serwera
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
92
Projektowanie warstwy serwera
Wizard - jsp (IV)
// blok globalError
// nagłówek widoczny nad każdą stroną
<br />
<jsp:include page="${pageList[page]}.jsp" />
<br />
Projekt współfinansowany przez Unię Europejską
w ramach Europejskiego Funduszu Społecznego
93
Projektowanie warstwy serwera
Wizard - jsp (V)
<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
94
Projektowanie warstwy serwera
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
95
Projektowanie warstwy serwera
96
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
Projektowanie warstwy serwera
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
97
Projektowanie warstwy serwera
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
98
Projektowanie warstwy serwera
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
99
Projektowanie warstwy serwera
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
100