Главная
Блог разработчиков phpBB
 
+ 17 предустановленных модов
+ SEO-оптимизация форума
+ авторизация через соц. сети
+ защита от спама

Вступление в Spring Frameworks: Spring MVC

Anna | 5.06.2014 | нет комментариев
Я не буду вдаваться в тонкости теории, тут на прогре довольно статей об этом. Выбираю практику.
Тем не менее, стоит напомнить, что трудиться со Spring Framework дозволено как с поддержкой xml-конфигурации, так и с поддержкой аннотаций. Также, ничего не мешает комбинировать оба подхода.
Лично я выбираю трудиться с аннотациями, чего и вам советую. Следственно все примеры, которые я буду приводить, будут применять аннотации.

Думаю, стоит рассказать, что же мы сегодня будем делать.
Сегодня мы сотворим примитивное веб-приложение, которое будет считать сумму 2-х чисел и, безусловно, отправлять пользователю результат.
Трудиться будем в IDE Intellij IDEA 12. Приступим.Сделаем новейший план (File-New Project).
Выбираем «Тип плана» — Spring MVC. Даем плану имя (Project name) и жмем Finish. При желании дозволено указать иной базовый пакет (Base package), так я изменил его на «com.springapp.controllers». Также, если дозволено указать путь к JDK (Project SDK) и Серверу(Application server), на котором приложение будет развертываться. Как дозволено подметить я использую 7 версию Java и сервер Glassfish.

Скриншот

image

План сделан и должен иметь такую конструкцию.

Скриншот

image

Это шаблонный план, тот, что использует xml-конфигурацию. Но чай мы хотим применять аннотации. Значит удалим лишнее.
Удаляем файл mvc-dispatcher-servlet.xml и папку test (тесты в ней применяют файл mvc-dispatcher-servlet.xml).
Ненужный раз приведу скрин того, что должно быть на этом шаге.

Скриншот

image

Сейчас нужно сделать тот самый dispatcher-servlet, только с поддержкой обыкновенного java-класса. Я считаю, что программа неизменно должна быть отлично структурированна и, думаю, многие меня поддержат. Для начала сотворим новейший пакет «config», тот, что будет беречь всю конфигурацию Spring. Для этого выбираем папку java и нажимаем «ALT-INSERT». Вводим имя пакета (com.springapp.config) и жмакаем «ОК».

Скриншот

image
image

Пакет сделан. Добавим в него новейший класс. Для этого, все также — ALT-INSERT и выбираем «Class». Назовем его MvcConfig.
Сделанный класс должен иметь примерно такой вид.

package com.springapp.config;

/**
 * Created with IntelliJ IDEA.
 * User: diversant
 * Date: 18.06.13
 * Time: 13:05
 * To change this template use File | Settings | File Templates.
 */
public class MvcConfig {
}

Приступим к созданию конфигурации. Я приведу сразу готовый конфигурационный класс и ниже опишу все нужные детали.

package com.springapp.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.ViewResolver;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
import org.springframework.web.servlet.view.InternalResourceViewResolver;

@Configuration
@ComponentScan(basePackages="com.springapp")
@EnableWebMvc
public class MvcConfig extends WebMvcConfigurerAdapter {
    @Bean
    public ViewResolver getViewResolver(){
        InternalResourceViewResolver resolver = new InternalResourceViewResolver();
        resolver.setPrefix("/WEB-INF/pages/");
        resolver.setSuffix(".jsp");
        return resolver;
    }

    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/resources/**").addResourceLocations("/resources/");
    }
}

Начнем с самого начала.
@Configuration — говорим о том, что данный класс является конфигурационным для Spring, тоесть включает конфигурацию бинов.
@ComponentScan — указываем пакет, к котором будут искаться нужные директивы для взаимодействия с бинами.
@EnableWebMvc — указываем, что данный класс является конфигурационным для Spring MVC.
@Bean — говорим о том, что аннотированный способ является бином.

Аннотацию @Override думаю знают все, кто хоть немножко работал с Java.

Сейчас больше детально о самих способах класса.

В способе getViewResolver() мы указываем, на мой взор, самый примитивный просмотрщик страниц, конфигурация которого состоит из добавления префикса и суфикса к странице.

В способе addResourceHandlers(ResourceHandlerRegistry registry) мы указываем расположение всех источников, которые будут применяться для страниц. Это могут быть и каскадные таблицы жанров, и java-script файлы, изображения и другое.

Вот такая простая конфигурация.

Сейчас нужно объяснить веб-контейнеру, что мы будем применять данный класс в качестве диспатчера. Для этого нужно отредактировать файл web.xml. Идея сделала для нас такой шаблонный код.

<web-app version="2.4" 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">

 <display-name>Spring MVC Application</display-name>

 <servlet>
    <servlet-name>mvc-dispatcher</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
 </servlet>

 <servlet-mapping>
    <servlet-name>mvc-dispatcher</servlet-name>
    <url-pattern>/</url-pattern>
 </servlet-mapping>
</web-app>

Нам нужно заменить его этим

<web-app version="2.4" 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">

 <display-name>Spring MVC</display-name>

 <context-param>
    <param-name>contextClass</param-name><param-value>org.springframework.web.context.support.AnnotationConfigWebApplicationContext</param-value></context-param>

<listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

<servlet>
    <servlet-name>SpringDispatcher</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
       <param-name>contextClass</param-name><param-value>org.springframework.web.context.support.AnnotationConfigWebApplicationContext</param-value></init-param>
    <init-param>
       <param-name>contextConfigLocation</param-name><param-value>com.springapp.config</param-value></init-param>
    <load-on-startup>1</load-on-startup>
</servlet>

<servlet-mapping>
    <servlet-name>SpringDispatcher</servlet-name>
    <url-pattern>/</url-pattern>
</servlet-mapping>

<session-config>
    <session-timeout>30</session-timeout>
</session-config>
</web-app>

Подробно расписывать не буду, скажу только — мы указываем, что конфигурация контекста и диспатчера выполняется с поддержкой аннотаций (c поддержкой параметра contextClass и его значения org.springframework.web.context.support.AnnotationConfigWebApplicationContext). Также указываем, в каком пакете искать конфигурационные классы (параметр contextConfigLocation).

Дальше нужно сделать контроллер. Контроллер в Spring исполняет трасляцию адресов (то что мы видим в браузере) и перенаправление на страницы (в нашем случае hello.jsp).

Так как, Идея сотворила базовый контроллер за нас, нам не прийдется писать его вручную. На каждый случай, я приведу его код и поясню, что там происходит.

package com.springapp.controllers;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;

@Controller
@RequestMapping("/")
public class HelloController {

   @RequestMapping(method = RequestMethod.GET)
   public String printWelcome(ModelMap model) {
      model.addAttribute("message", "Hello world!");
      return "hello";
   }
}

Начнем с аннотаций.

@Controller — собственно говорим о том, что это контроллер. Добавить нечего

@RequestMapping("/") — с поддержкой этой аннотации указываем область видимости для этого котроллера (если эта аннотация применина к классу) либо определенный транслируемый адрес (если это способ). Также дозволено указать при каком определенном запросе будет транслироваться тот либо инной адрес (параметр method). В данной случае мы говорим о том, что данный контроллер будет видеть все адреса (то, что в браузере) и пытаться траслировать их на необходимую страницу. Для большей ясности приведу пример.

Возможен есть 2 адреса mydomain.com/info, mydomain.com/about. Если мы указаем в RequestMapping взамен “/” — “/about”, то контроллер никогда не будет пытаться траслировать адрес mydomain.com/info, так как легко не будем видеть его.

О том, что делает способ printWelcome(). Данный способ легко передает на страницу сообщение «Hello World» и, безусловно, указывает имя самой страницы. Ну а с поддержкой просмотрщика, тот, что мы описали в классе диспатчера (MvcConfig) это имя транслируется в полнить путь к странице, с поддержкой добавления префикса и суфикса.

Осталось привести только код самой страницы hello.jsp.

<html>
   <body>
      <h1>${message}</h1>
   </body>
</html>

Собственно, дозволено приступить к развертке приложения. Для этого используем кнопку запуска.
Ожидаем пока, запустится сервер, развернется приложение. И вуаля, видим всеми любимый «Hello World».

Скриншот

image

Раз все работает, как нужно, дозволено приступить к реализации просчета суммы 2-х чисел.

Для начала изменим нашу jsp страницу, добавив в нее форму для ввода чисел.

<html>
   <body>
      <h1>${message}</h1>

      <form method="post">
          <input name="value1" type="text"/>

          <input name="value2" type="text"/>
          <input type="submit"/>
      </form>

      <h3>Result: ${result}</h3>
   </body>
</html>

Ничего трудного. Мы добавили два поля для ввода чисел, кнопку отправки и дериктиву итога итога. Для простоты, я решил применять для итога итога ту же страницу.

И последнее, добавить способ обработки POST-запроса в наш котроллер.

package com.springapp.controllers;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;

@Controller
@RequestMapping("/")
public class HelloController {

   @RequestMapping(method = RequestMethod.GET)
   public String printWelcome(ModelMap model) {
      model.addAttribute("message", "Hello world!");
      return "hello";
   }

   @RequestMapping(method = RequestMethod.POST)
   public String calcSum(Model m,
                         @RequestParam(value = "value1") Double value1,
                         @RequestParam(value = "value2") Double value2  ){
      m.addAttribute("result", (value1 value2));
      return "hello";
   }
}

В этом способе мы, с поддержкой аннотации @RequestMapping указываем способ обработки POST, а также с поддержкой аннотации @RequestParam получает информацию из полей формы (value1, value2).

Запускаем (Идея предложит 4 варианта, выбираем «Redeploy»), видим, что наша форма есть.

Скриншот

image

Ну и считаем сумму.

Скриншот

image

Собственно, на этом все.

В дальнейший раз мы разберем, что такое Spring Data JPA и как с ним трудиться.

Каждая информация, которую я привел является сугубо моим навыком либо суждением и не претендует на стандарт либо эталон. Я показываю методы как ДОЗВОЛЕНО сделать, а не как НУЖНО.

Буду рад конструктивной критике, так как навык в сфере «статьестроя» у меня не огромный.

Каждому пока, верней до встречи.

Источник: programmingmaster.ru

Оставить комментарий
Форум phpBB, русская поддержка форума phpBB
Рейтинг@Mail.ru 2008 - 2017 © BB3x.ru - русская поддержка форума phpBB