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

Применение SessionAttributes в Spring MVC плане

Anna | 4.06.2014 | нет комментариев
Вступление

Данная статья описывает реализацию крепко упрощенного процесса бронирования билета в кино. Предполагается, что пользователь вводит данные нужные для бронирования на нескольких страницах, функционал поделен логически, т.е. на первой странице он вводит данные относящиеся к сеансу, на 2-й свои собственные данные, на третьей — данные для оплаты. Последняя страница — для подтверждения бронирования. Все что пользователь вводит — сохранятся в виде формы в сессии, по окончанию бронирования данные из сессии удаляются.

С чего начать

Сразу оговорюсь, предполагается что Spring MVC теснее применяется у вас в плане, jsp применяются в виде view.

Пользователь исполняет навигацию в дальнейшем порядке:

  • booking.jsp: страница выбора киносеанса
  • customer.jsp: страница ввода персональных данных
  • payment.jsp: страница ввода платежной информации
  • confirmation.jsp: страница подтверждения

Листинг: booking.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form"%>
<html>
<head>
    <title>Booking Start Page</title>
</head>
<body>
    <form:form action="/booking/movie" modelAttribute="ticketForm">
        Movie ID : <form:input path="movieId"/>
        <input type="submit"/>
    </form:form>
</body>
</html>

Листинг: customer.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form"%>
<html>
<head>
    <title>Customer Page</title>
</head>
<body>
    <form:form action="/booking/customer" modelAttribute="ticketForm">
        Last Name : <form:input path="lastName"/>
        <input type="submit"/>
    </form:form>
</body>
</html>

Листинг: payment.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form"%>
<html>
<head>
    <title>Payment Page</title>
</head>
<body>
    <form:form action="/booking/payment" modelAttribute="ticketForm">
        CreditCard Number : <form:input path="creditCardNumber"/>
        <input type="submit"/>
    </form:form>
</body>
</html>

Листинг: confirmation.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Confirmation Page</title>
</head>
<body>
    Thank you for your purchase!
</body>
</html>

Форма:

public class TicketForm {

    private String movieId;
    private String lastName;
    private String creditCardNumber;

    public String getMovieId() {
        return movieId;
    }

    public void setMovieId(String movieId) {
        this.movieId = movieId;
    }

    public String getLastName() {
        return lastName;
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
    }

    public String getCreditCardNumber() {
        return creditCardNumber;
    }

    public void setCreditCardNumber(String creditCardNumber) {
        this.creditCardNumber = creditCardNumber;
    }

}

Пример применения аннотации @SessionAttributes в контроллере BookTicketController, сейчас типы TicketForm прикрепленные к модели, будут так же сохранены в сессии. @SessionAttributes дозволено так же применять с указанием имени признака в модели.

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.util.Assert;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.SessionAttributes;
import org.springframework.web.bind.support.SessionStatus;

Controller
@RequestMapping(value = "/booking")
@SessionAttributes(types = TicketForm.class)
public class BookTicketController {

    @RequestMapping(method = RequestMethod.GET)
    public String start(Model model) {
        // позже выхода из start() форма будет скопирована в http session признаки вследствие @SessionAttributes(types = TicketForm.class)
        model.addAttribute(new TicketForm()); 
        return "booking/booking";
    }

    @RequestMapping(value = "/movie", method = RequestMethod.POST)
    public String selectMovie(TicketForm ticketForm) {

        Assert.notNull(ticketForm);
        Assert.notNull(ticketForm.getMovieId());

        return "booking/customer";
    }

    @RequestMapping(value = "/customer", method = RequestMethod.POST)
    public String enterCustomerData(TicketForm ticketForm) {

        Assert.notNull(ticketForm);
        // movieId не передавался с customer.jsp, но он был сохранен в сессии во время selectMovie()
        Assert.notNull(ticketForm.getMovieId());
        Assert.notNull(ticketForm.getLastName());

        return "booking/payment";
    }

    @RequestMapping(value = "/payment", method = RequestMethod.POST)
    public String enterPaymentDetails(TicketForm ticketForm) {

        // movieId не передавался с customer.jsp, но он был сохранен в сессии во время selectMovie()
        Assert.notNull(ticketForm.getMovieId());
        // lastName не передавался с payment.jsp, но он был сохранен в сессии во время enterCustomerData()
        Assert.notNull(ticketForm.getLastName());
        Assert.notNull(ticketForm.getCreditCardNumber());

        return "redirect:/booking/confirmation";
    }

    @RequestMapping(value = "/confirmation", method = RequestMethod.GET)
    public String confirmation(SessionStatus status) {
        status.setComplete(); // очищаем Spring Session в целях безопасности личных данных
        return "booking/confirmation";
    }

}
В дополнение

Руководить SessionAttributes дозволено при помощи передачи SessionStatus параметра в способ контроллера.

@RequestMapping(value = "/confirmation", method = RequestMethod.GET)
    public String confirmation(SessionStatus status) {
        status.setComplete();
        return "booking/confirmation";
    }

Вызвав status.setComplete(); вы закончите Spring сессию, SessionAttributes будут удалены, сохранив при этом HTTP сессию.

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

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