eXtreme Programming XP Тема 10
XP 1. Контроллеры (SimpleFormController, UrlFilenameViewController); 2. Модель и представление соединяются посредством класса org.springframework.web.servlet.ModelAndView 3. Для поддержки работы с формой используется командный объект (JavaBean, который заполняется значениями из полей формы) 4. Представления реализуются с помощью JSP страниц. Для упрощения сценариев существуют специальные теги из библиотеки дескрипторов Spring. 5. Используются объекты, раскрывающие интерфейс Validator (для проверки правильности ввода данных в форму) 6. Перехватчики – классы, которым передается управление перед (после) тем, как будет выполнен контроллер 7. Преобразователи представления – класс InternalResourceViewResolver. Осуществляет преобразование имен представлений (файл с расширением htm) в фактическое представление (файл с расширением jsp)
Перенаправление на контроллеры осуществляет класс org.springframework.web.servlet.DispatcherServlet Управление на него передается с помощью настройки в файле web.xml приложения. XP
В корневой папке приложения – index.jsp В папке WEB-INF содержатся файлы настройки приложения web.xml и timex-servlet.xml Файлы настройки Hibernate находятся в папке classes XP
XP
XP
<war destfile="${war.file}" webxml="${src.dir}/conf/web.xml"> <delete dir="${webinf.dir}/${src.dir}" failonerror="false" /> XP
<web-app xmlns=" xmlns:xsi=" xsi:schemaLocation=" version="2.4"> Time Expression Example index.jsp
XP timex org.springframework.web.servlet.DispatcherServlet 1 timex *.htm
XP Файл контекста приложения задает JavaBean’ы, используемые в приложении и их отношения внедрения. Разберем сначала функциональность авторизации пользователя.
XP <beans xmlns=" xmlns:xsi=" xsi:schemaLocation=" <bean id="urlMap" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping"> signInController signOutController urlFilenameController
XP <bean id="httpRequestInterceptor" class="com.visualpatterns.timex.controller.HttpReques tInterceptor"> signin.htm
XP true /signin redirect:ok.htm com.visualpatterns.timex.controller.SignLogin
XP <bean name="signOutController" class="com.visualpatterns.timex.controller.SignOutCon troller"> redirect:signin.htm
XP <bean id="urlFilenameController" class="org.springframework.web.servlet.mvc.UrlFilenameViewCo ntroller" />
XP <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResour ceViewResolver"> org.springframework.web.servlet.view.JstlView /WEB-INF/jsp/.jsp
XP <bean id="messageSource" class="org.springframework.context.support.Resourc eBundleMessageSource"> messages Файл messages.properties должен содержать строки: Id сообщения = текст сообщения
XP <bean id="urlMapAuthenticate" class="org.springframework.web.servlet.handler.SimpleUrlHandle rMapping">...
XP package com.visualpatterns.timex.controller; public class SignLogin { String login, password; public String getLogin() {return login;} public void setLogin(String login){this.login=login;} public String getPassword(){return password;} public void setPassword(String pass){ password=pass;} }
XP package com.visualpatterns.timex.controller; import javax.servlet.http.HttpServletRequest; public class ApplicationSecurityManager { public static final String USER = "user"; public Object getUser(HttpServletRequest request) { return request.getSession(true).getAttribute(USER); } public void setUser(HttpServletRequest request, Object user) { request.getSession(true).setAttribute(USER, user);} public void removeUser(HttpServletRequest request) { request.getSession(true).removeAttribute(USER);} }
XP package com.visualpatterns.timex.controller; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.springframework.web.servlet.handler.HandlerInterceptorAdapter; import com.visualpatterns.timex.controller.SignLogin; import com.visualpatterns.timex.controller.ApplicationSecurityManager; public class HttpRequestInterceptor extends HandlerInterceptorAdapter { private String signInPage; private ApplicationSecurityManager applicationSecurityManager; public String getSignInPage() { return signInPage;} public void setSignInPage(String signInPage) { this.signInPage = signInPage;} public ApplicationSecurityManager getApplicationSecurityManager() { return applicationSecurityManager;} public void setApplicationSecurityManager( ApplicationSecurityManager applicationSecurityManager) { this.applicationSecurityManager = applicationSecurityManager;}
XP public void setApplicationSecurityManager( ApplicationSecurityManager applicationSecurityManager) { this.applicationSecurityManager = applicationSecurityManager;} public boolean preHandle( HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { String log = (String)applicationSecurityManager.getUser(request); if (log == null) { response.sendRedirect(this.signInPage); return false; } return true; }
XP 1. Обращение к форме: - formBackingObject – создание командного объекта - initBinder – регистрация редакторов свойств - showForm - referenceData – формирование списков 2. Данные в форме некорректные: - initBinder - onBind - onBindAndValidate - processFormSubmission - showForm - referenceData 3. Данные были корректными: - initBinder - onBind - onBindAndValidate - processFormSubmission - onSubmit
XP package com.visualpatterns.timex.controller; import org.springframework.validation.Errors; import com.visualpatterns.timex.controller.SignLogin; public class SignInValidator implements org.springframework.validation.Validator { public boolean supports(Class clazz) { return clazz.equals(SignLogin.class); } public void validate(Object command, Errors errors) { SignLogin log = (SignLogin) command; if (log == null) return; String login = log.getLogin(); String password = log.getPassword(); if (!(login.equals("admin") && password.equals("admin"))) errors.reject("error.login.invalid"); }
XP package com.visualpatterns.timex.controller; import java.util.Map; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.springframework.validation.BindException; import org.springframework.web.servlet.ModelAndView; import org.springframework.web.servlet.mvc.SimpleFormController; import com.visualpatterns.timex.controller.ApplicationSecurityManager; import com.visualpatterns.timex.controller.SignLogin; public class SignInController extends SimpleFormController { private ApplicationSecurityManager applicationSecurityManager; protected Object formBackingObject(HttpServletRequest request) throws Exception { return new SignLogin(); }
XP public ModelAndView showForm( HttpServletRequest request, HttpServletResponse response, BindException errors, Map controlModel) throws Exception { if (applicationSecurityManager.getUser(request) != null) return new ModelAndView(getSuccessView()); return super.showForm(request, response, errors, controlModel); } public void onBindAndValidate( HttpServletRequest request, Object command, BindException errors) throws Exception { if (errors.hasErrors()) return; SignLogin formUser = (SignLogin) command; applicationSecurityManager.setUser(request, formUser.getLogin()); }
XP public ModelAndView onSubmit( HttpServletRequest request, HttpServletResponse response, Object command, BindException errors) throws Exception { return new ModelAndView(getSuccessView());} public ApplicationSecurityManager getApplicationSecurityManager() { return applicationSecurityManager; } public void setApplicationSecurityManager( ApplicationSecurityManager applicationSecurityManager) { this.applicationSecurityManager = applicationSecurityManager; }
XP package com.visualpatterns.timex.controller; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.springframework.web.servlet.ModelAndView; import org.springframework.web.servlet.mvc.Controller; import com.visualpatterns.timex.controller.ApplicationSecurityManager; public class SignOutController implements Controller { private ApplicationSecurityManager applicationSecurityManager; private String successView; public String getSuccessView() { return successView; } public void setSuccessView(String successView) { this.successView = successView; }
XP public ModelAndView handleRequest( HttpServletRequest request, HttpServletResponse response) throws Exception { applicationSecurityManager.removeUser(request); return new ModelAndView(getSuccessView()); } public ApplicationSecurityManager getApplicationSecurityManager() { return applicationSecurityManager;} public void setApplicationSecurityManager( ApplicationSecurityManager applicationSecurityManager) { this.applicationSecurityManager = applicationSecurityManager; }
XP Цель – перенаправление на страницу авторизации
XP Авторизация
XP Логин: ' value=' ' type="text" size="6" maxlength="6"> Пароль: ' value=' ' type="password" size="8" maxlength="10">
XP Вы успешно вошли в систему Выйти из системы