Transcript

Spring MVC

Spring MVC

Spring MVC помогает в создании гибких и слабо связанных веб-приложений. Шаблон Model-View-Controller помогает отделять бизнес-логику, логику представления и логику навигации. Модели ответственны за инкапсуляцию данных приложения. View показывают ответ пользователю с помощью объектной модели. Контроллеры отвечают за прием запроса от пользователя и вызов серверных служб.

Architecture - modules

Core Container

Core Container состоит из Core, Beans, Context, and Expression Language модулей:

- Core – базовые классы для фреймворка- Bean – BeanFactory имплементация шаблона

factory.- Context – стрит базовую структуру на основе

Core и Beans, интерфейс ApplicationContextодин из основных в модуле.

- Expression Language для запросов и изменения объектов при выполнении

Data Access/Integration

Состоит из :- Модуль JDBC предоставляет JDBC-уровень абстракции, который

избавляет от необходимости писать код JDBC- Модуль ORM обеспечивает интеграцию слоев для популярных

объектно-реляционные отображений (ORM), включая JPA, JDO, Hibernate и IBATIS.

- Модуль OXM обеспечивает уровень абстракции, который поддерживает объектно / XML отображение реализации для JAXB, Castor XMLBeans, JiBX и XStream.

- Java Messaging Service - JMS модуль содержит функции для производства и получения сообщений.

- Transaction - поддерживает программные и декларативные транзакции управления для классов, реализующих специальные интерфейсы и для всех ваших POJOs.

Web

Состоит из Web, Web-сервлетов, Web-Struts и веб-модулей, портлетов

подробно следующим образом:- Web обеспечивает основные веб-интеграции функций, таких

как составные загрузки файла функциональности и инициализации контейнера, использование слушателей сервлета и веб-ориентированных приложений контексте.

- Web-Servlet содержит Spring Model-View-Controller (MVC)реализацию для веб-приложений.

- Web-Struts модуль содержит классы для поддержки интеграции классического Struts веб-уровня

- Web-portlet модуль обеспечивает реализацию MVC для использования в портлет имплементации

Miscellaneous

- AOP обеспечивает aspect-oriented programming имплементацию для определения method-interceptors и pointcuts

- Aspects интеграция с AspectJ AOP framework.- Instrumentation обеспечивает инструментарий

и class loader - Test для тестирования Spring компонентов с

Junit или TestNG- Integration- Batch

Поток запроса

HelloWorldController

public class HelloWorldController extends AbstractController {

private String message;

@Override

protected ModelAndView handleRequestInternal(HttpServletRequest request, HttpServletResponse response) throws Exception {

return new ModelAndView("welcomePage","welcomeMessage", message);

// view name, model param name, model param

}

public void setMessage(String message) {

this.message = message;

}

}

web.xml

<?xml version="1.0" encoding="UTF-8"?><web-app >

<servlet><servlet-name>dispatcher</servlet-name><servlet-class> org.springframework.web.servlet.DispatcherServlet </servlet-

class><load-on-startup>1</load-on-startup>

</servlet><servlet-mapping>

<servlet-name>dispatcher</servlet-name><url-pattern>*.htm</url-pattern>

</servlet-mapping><welcome-file-list>

<welcome-file>redirect.jsp</welcome-file></welcome-file-list>

</web-app>

redirect.jsp

Redirect.jsp будет вызван первым, когда мы выполняем приложение Spring Web. Это единственный файл JSP вне WEB-INF каталога, он нужен, чтобы обеспечить перенаправление на DispatcherServlet. Все другие view должны храниться в WEB-INF каталоге, так что они могут быть вызваны только через контроллер процесса.

<%@page contentType="text/html" pageEncoding="UTF-8"%>

<% response.sendRedirect("welcome.htm"); %>

dispatcher-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">

<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>

<bean name="/welcome.htm" class=“HelloWorldController" >

<property name="message" value="Hello World!" />

</bean>

</beans>

Handler Mapping

По умолчанию DispatcherServlet использует BeanNameUrlHandlerMapping

<bean id="handlerMapping" class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>

<bean id="handlerMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping"><property name="mappings">

<value>/ex/view*.html=editAccountFormController/**/help.html=helpController

</value></property>

</bean>

welcomePage.jsp

<html><head><meta http-equiv="Content-Type"

content="text/html; charset=ISO-8859-1"><title>Welcome Page</title></head><body>${welcomeMessage}</body></html>

Using annotations

dispatcher-servlet.xml

<beans xmlns="http://www.springframework.org/schema/beans"xmlns:context="http://www.springframework.org/schema/context"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-3.0.xsdhttp://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd">

<context:component-scan base-package="com.tutorialspoint" /><bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"><property name="prefix" value="/WEB-INF/jsp/" /><property name="suffix" value=".jsp" /></bean></beans>

Using annotations

@Controller

@RequestMapping("/hello")

public class HelloController{

@RequestMapping(method = RequestMethod.GET)

public String printHello(ModelMap model) {

model.addAttribute("message", "Hello Spring MVC Framework!");

return "hello"; // name of the view

}

}

@RequestMapping(value = "/hello", method = RequestMethod.GET)

Form Handling

public class Student {private Integer age;private String name;private Integer id;public void setAge(Integer age) {

this.age = age;}public Integer getAge() {

return age;}public void setName(String name) { this.name = name; }public String getName() { return name;}public void setId(Integer id) {this.id = id;}public Integer getId() {return id; }

}

Form Handling

@Controllerpublic class StudentController {

@RequestMapping(value = "/student", method = RequestMethod.GET)public ModelAndView student() {

//"command" is required for <form:form> tagsreturn new ModelAndView("student", "command", new Student());

}@RequestMapping(value = "/addStudent", method = RequestMethod.POST)public String addStudent(@ModelAttribute("SpringWeb")Student student,

ModelMap model) {model.addAttribute("name", student.getName());model.addAttribute("age", student.getAge());model.addAttribute("id", student.getId());return "result";

}}

student.jsp

Result.jsp

Spring IoC Containers

Spring IoC Containers - основа Spring Framework. Контейнер создаст объекты, свяжет их вместе, настроит их, и управляет их жизненным циклом от создания до разрушения. Spring Containerиспользует инъекции зависимостей (DI) для управления компонентами, которые составляют приложения. Такие объекты называются Spring Beans.

Контейнер получает свои инструкции для создания экземпляров объектов, настройки и сборки за счетчтения конфигурации метаданных.Конфигурацииметаданные могут быть представлены либо XML, Java аннотации, или Java код.

2 типа контейнеров

1) Spring BeanFactory ContainerЭто самый простой контейнера, базовая поддержка DI и определяетсяorg.springframework.beans.factory.BeanFactory интерфейс.BeanFactory исвязанный интерфейсов, таких как BeanFactoryAware, InitializingBean, DisposableBean2)Spring ApplicationContext ContainerЭтот контейнер добавляет больше enterprise функции, такие как

способность обрабатывать текстовые сообщения из свойств файла. Этот контейнер определяется org.springframework.context.ApplicationContext interface.

Контейнер ApplicationContext включает в себя все функциональные возможности контейнера BeanFactory

BeanFactory Container

public class HelloWorld {

private String message;

public void setMessage(String message){ this.message = message;}

public void getMessage(){System.out.println("Your Message : " + message);}

}

public class MainApp {

public static void main(String[] args) {

XmlBeanFactory factory = new XmlBeanFactory(new ClassPathResource("Beans.xml"));

HelloWorld obj = (HelloWorld) factory.getBean("helloWorld");

obj.getMessage();

}

}

<beans >

<bean id="helloWorld" class="com.tutorialspoint.HelloWorld">

<property name="message" value="Hello World!"/>

</bean>

ApplicationContext Container

import org.springframework.context.ApplicationContext;

Importorg.springframework.context.support.FileSystemXmlApplicationContext;

public class MainApp {

public static void main(String[] args) {

ApplicationContext context = new FileSystemXmlApplicationContext

("C:/src/Beans.xml");

HelloWorld obj = (HelloWorld) context.getBean("helloWorld");

obj.getMessage();

}

}

Spring Bean Scopes

<bean id="..." class="..." scope="singleton"></bean>

singleton single instance per Spring IoC container (default).prototype a single bean definition to have any number of

instances.request HTTP request. Only valid in the context of a web-

aware Spring ApplicationContext.session HTTP session. Only valid in the context of a web-

aware Spring ApplicationContext.global-session global HTTP session. Only valid in the context

of a web-aware Spring ApplicationContext.

Autowiring

Способы:no – по умолчаниюbyName - property name.byType - by property datatype. constructor - similar to byType, but type applies to constructor

arguments. autodetect - Spring first tries to wire using autowire by constructor, if

it does not work, Spring tries to autowire by byType.

<bean id="textEditor" class="com.tutorialspoint.TextEditor"autowire="byName"><property name="name" value="Generic Text Editor" /></bean>

Annotation Based Config

<?xml version="1.0" encoding="UTF-8"?><beans><context:annotation-config/><!-- bean definitions go here --></beans>

@Required – for settet methods and it indicates that the affected bean property must be populated in XML configuration file at

configuration time@Autowired -can be used to autowire bean @Qualifier - There may be a situation when you create more than one

bean of the same type and want to wire only one of them with a property

Autowiring

public class TextEditor {@Autowired(required=false)@Qualifier(“check1")private SpellChecker spellChecker;public TextEditor() {

System.out.println("Inside TextEditor constructor." );}public SpellChecker getSpellChecker( ){ return spellChecker; }public void spellCheck(){spellChecker.checkSpelling();}

}

Autowiring

@Resource(name= "spellChecker")

public void setSpellChecker( SpellChecker spellChecker ){

this.spellChecker = spellChecker;

}

Q&A