1 / 33

Spring MVC

Тема 10. Spring MVC. XP. eXtreme Programming. Основные составляющие Spring MVC. Контроллеры ( SimpleFormController , UrlFilenameViewController ) ; Модель и представление соединяются посредством класса org.springframework.web.servlet.ModelAndView

thu
Download Presentation

Spring MVC

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Тема 10 SpringMVC XP eXtreme Programming

  2. Основные составляющие Spring MVC • Контроллеры (SimpleFormController, UrlFilenameViewController); • Модель и представление соединяются посредством класса org.springframework.web.servlet.ModelAndView • Для поддержки работы с формой используется командный объект (JavaBean, который заполняется значениями из полей формы) • Представления реализуются с помощью JSP страниц. Для упрощения сценариев существуют специальные теги из библиотеки дескрипторов Spring. • Используются объекты, раскрывающие интерфейс Validator (для проверки правильности ввода данных в форму) • Перехватчики – классы, которым передается управление перед (после) тем, как будет выполнен контроллер • Преобразователи представления – класс InternalResourceViewResolver. Осуществляет преобразование имен представлений (файл с расширением htm) в фактическое представление (файл с расширением jsp) XP

  3. СервлетDispatcherServlet Перенаправление на контроллеры осуществляет класс org.springframework.web.servlet.DispatcherServlet Управление на него передается с помощью настройки в файле web.xml приложения. XP

  4. Структура WEB-приложения В корневой папке приложения – index.jsp В папке WEB-INF содержатся файлы настройки приложения web.xml и timex-servlet.xml Файлы настройки Hibernate находятся в папке classes XP

  5. Задача Ant для развертывания приложения <target name="copy_files"> <copy todir="${webinf.dir}/${src.dir}"> <fileset dir="${src.dir}"> <include name="**/*.java" /> </fileset> </copy> <copy todir="${webinf.dir}/${data.dir}"> <fileset dir="${data.dir}"> <include name="**/*" /> </fileset> </copy> </target> XP

  6. Задача Ant для развертывания приложения <target name="copy_files"> <copy todir="${webinf.dir}/${src.dir}"> <fileset dir="${src.dir}"> <include name="**/*.java" /> </fileset> </copy> <copy todir="${webinf.dir}/${data.dir}"> <fileset dir="${data.dir}"> <include name="**/*" /> </fileset> </copy> <copy todir="${war.dir}"> <fileset dir="${web.dir}"> <include name="**/*" /> </fileset> </copy> <copy todir="${jsp.dir}"> <fileset dir="${views.dir}" /> </copy> </target> XP

  7. Задача Ant для развертывания приложения –создания war-архива <target name="dist" depends="rebuild”> <mkdir dir="${dist.dir}" /> <war destfile="${war.file}" webxml="${src.dir}/conf/web.xml"> <fileset dir="${war.dir}"> <include name="**/*.*" /> <exclude name="**/web.xml" /> <exclude name="**/test/*.class" /> <exclude name="**/*mock*.jar" /> </fileset> </war> <delete dir="${webinf.dir}/${src.dir}" failonerror="false" /> </target> XP

  8. Файл web.xml <?xml version="1.0" encoding="ISO-8859-1"?> <web-app xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd" version="2.4"> <display-name>Time Expression</display-name> <description> Example </description> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list> XP

  9. Файл web.xml <servlet> <servlet-name>timex</servlet-name> <servlet-class> org.springframework.web.servlet.DispatcherServlet </servlet-class> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>timex</servlet-name> <url-pattern>*.htm</url-pattern> </servlet-mapping> </web-app> XP

  10. Файл контекста приложения timex-servlet.xml Файл контекста приложения задает JavaBean’ы, используемые в приложении и их отношения внедрения. Разберем сначала функциональность авторизации пользователя. XP

  11. Файл timex-servlet.xml <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <!– Настройка URL с расширением htmна контроллер --> <bean id="urlMap" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping"> <property name="urlMap"> <props> <prop key="/signin.htm">signInController</prop> <prop key="/signout.htm">signOutController</prop> <prop key="/ok.htm">urlFilenameController</prop> </props> </property> </bean> XP

  12. Файл timex-servlet.xml <!-- Bean для перехватчика запросов --> <bean id="httpRequestInterceptor" class="com.visualpatterns.timex.controller.HttpRequestInterceptor"> <property name="signInPage"> <value>signin.htm</value> </property> <property name="applicationSecurityManager"> <ref bean="applicationSecurityManager" /> </property> </bean> XP

  13. Файл timex-servlet.xml <!-- Bean для контроллера формы ввода логина и пароля --> <bean name="signInController“ class="com.visualpatterns.timex.controller.SignInController"> <property name="sessionForm"> <value>true</value> </property> <property name="formView“> <value>/signin</value> </property> <property name="successView"> <value>redirect:ok.htm</value> </property> <property name="commandClass"> <value>com.visualpatterns.timex.controller.SignLogin</value> </property> <property name="validator"> <ref bean="signinValidator" /> </property> <property name="applicationSecurityManager"> <ref bean="applicationSecurityManager" /> </property> </bean> XP

  14. Файл timex-servlet.xml <!-- Bean для контроллера выхода из системы --> <bean name="signOutController" class="com.visualpatterns.timex.controller.SignOutController"> <property name="applicationSecurityManager"> <ref bean="applicationSecurityManager" /> </property> <property name="successView"> <value>redirect:signin.htm</value> </property> </bean> XP

  15. Файл timex-servlet.xml <!-- Bean длявалидатора формы ввода пароля --> <bean id="signinValidator“ class="com.visualpatterns.timex.controller.SignInValidator" /> <!-- Bean дляуправления параметрами сессии --> <bean id="applicationSecurityManager" class="com.visualpatterns.timex.controller.ApplicationSecurityManager"/> <!-- Bean дляперенаправления без контроллера --> <bean id="urlFilenameController" class="org.springframework.web.servlet.mvc.UrlFilenameViewController" /> XP

  16. Файл timex-servlet.xml <!-- Bean для определения фактических имен представлений --> <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="viewClass"> <value>org.springframework.web.servlet.view.JstlView</value> </property> <property name="prefix"> <value>/WEB-INF/jsp/</value> </property> <property name="suffix"> <value>.jsp</value> </property> </bean> XP

  17. Файл timex-servlet.xml <!-- Bean для формирования сообщений системы --> <bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource"> <property name="basenames"> <list> <value>messages</value> </list> </property> </bean> Файл messages.propertiesдолжен содержать строки: Id сообщения = текст сообщения XP

  18. Файл timex-servlet.xml <!-- Bean для назначения перехватчиков --> <bean id="urlMapAuthenticate" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping"> <property name="interceptors"> <list> <ref bean="httpRequestInterceptor" /> </list> </property> <property name="urlMap"> <props> ... </props> </property> </bean> XP

  19. Для входа в систему создаем командный объект 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

  20. Все классы-контроллеры внедряют ApplicationSecurityManagerдля установки/снятия параметров сессии 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

  21. Класс-перехватчик 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

  22. Класс-перехватчик 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

  23. Последовательность вызова методов контроллера формы 1. Обращение к форме: - formBackingObject – создание командного объекта - initBinder – регистрация редакторов свойств - showForm - referenceData – формирование списков 2. Данные в форме некорректные: - initBinder - onBind - onBindAndValidate - processFormSubmission - showForm - referenceData 3. Данные были корректными: - initBinder - onBind - onBindAndValidate - processFormSubmission - onSubmit XP

  24. Создание валидатора формы(метод validate вызывается в onBindAndValidate) 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

  25. Контроллер формы 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

  26. Контроллер формы 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

  27. Контроллер формы 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

  28. Контроллер без формы для выхода из системы 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

  29. Контроллер без формы для выхода из системы 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

  30. JSP-страницы – index.jsp Цель – перенаправление на страницу авторизации <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <c:redirect url="signin.htm"/> XP

  31. JSP-страницы – signin.jsp <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> <%@ taglib prefix="spring" uri="http://www.springframework.org/tags"%> <%@ page contentType="text/html; charset=windows-1251" %> <html><body><h1>Авторизация</h1> <form method="post"> <br/> <spring:bind path="command.*"> <c:if test="${not empty status.errorMessages}"> <c:forEach var="error" items="${status.errorMessages}"> <font color="red"><c:out value="${error}" escapeXml="false" /></font> <br /> </c:forEach> </c:if> </spring:bind> <c:if test="${not empty message}"> <font color="green"><c:out value="${message}" /></font> <c:set var="message" value="" scope="session" /> </c:if> XP

  32. JSP-страницы – signin.jsp <br/> Логин: <spring:bind path="command.login"> <input name='<c:out value="${status.expression}"/>' value='<c:out value="${status.value}"/>' type="text" size="6" maxlength="6"> </spring:bind> <br/> Пароль: <spring:bind path="command.password"> <input name='<c:out value="${status.expression}"/>' value='<c:out value="${status.value}"/>' type="password" size="8" maxlength="10"> </spring:bind> <br/> <input type="submit" name="Submit" value="Войти"> </form> </body> </html> XP

  33. JSP-страницы – signout.jsp <%@ page contentType="text/html; charset=windows-1251" %> <html> <body> <h1>Вы успешно вошли в систему</h1> <a href="signout.htm">Выйти из системы</a> </body> </html> XP

More Related