Лабораторная работа №6. Технология Model-View-Controller




Цель работы. Познакомиться с технологией Spring.

Краткое теоретическое содержание. Технология Java Spring (MVC) базируется на триаде <Model – View – Controller>. Model представляет данные, например, на основе персистентного класса (-ов). View представляет отображаемый документ (например, html/jsp), через который осуществляется ввод-вывод данных. Controller содержит методы, осуществляющие стыковку между Model и View. Приложение Spring создаем как web-приложение. В процессе выполнения мастера по созданию приложений указываем платформу Spring Web MVC. Создадим заготовку приложения с именем SpringLab. В настройках мастера изменим имя обработчика (mydispatcher) (рисунок 1).

 

 

Рисунок 1. Задание платформы Spring MVC

 

 

Сначала отредактируем конфигурационный файл web.xml

 

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

<web-app version="3.0" xmlns="https://java.sun.com/xml/ns/javaee" xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="https://java.sun.com/xml/ns/javaee https://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">

<context-param>

<param-name>contextConfigLocation</param-name>

<param-value>/WEB-INF/applicationContext.xml</param-value>

</context-param>

<listener>

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

</listener>

<servlet>

<servlet-name>springlab</servlet-name>

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

<load-on-startup>2</load-on-startup>

</servlet>

<servlet-mapping>

<servlet-name>springlab</servlet-name>

<url-pattern>*.htm</url-pattern>

</servlet-mapping>

<session-config>

<session-timeout>

</session-timeout>

</session-config>

<welcome-file-list>

<welcome-file>index.jsp</welcome-file>

</welcome-file-list>

</web-app>

 

Далее изменяем содержимое файла index.jsp, просто переадресовав его на документ main.html, который, разумеется, нужно будет построить и добавить в проект:

 

<%@ page session="false"%>

<%@ taglib prefix="c" uri="https://java.sun.com/jsp/jstl/core" %>

<%@ taglib prefix="fmt" uri="https://java.sun.com/jsp/jstl/fmt" %>

 

<html>

<head><title>Spring LAB</title></head>

<c:redirect url="/my.htm"/>

</html>

 

Создаем далее файл main.jsp и добавляем его в проект:

 

<%@ page session="false"%>

<%@ taglib prefix="c" uri="https://java.sun.com/jsp/jstl/core" %>

<%@ taglib prefix="fmt" uri="https://java.sun.com/jsp/jstl/fmt" %>

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

<title>JSP Page</title>

</head>

<body>

<h1>Car List</h1>

<c:forEach items="${carList}" var="car">

${car.model}: ${car.price}

<br />

</c:forEach>

</body>

</html>

 

Рисунок 2. Дерево проекта

 

Важно отметить, что мы вынесли файлы index.jsp, main.jsp из папки jsp (рисунок 2).

Создаем контроллер. Это обычный класс java-сервлета (по сути). Размещаем его в узле SpringLab.contr Пакета исходных файлов (рисунок 3):

 

 

Рисунок 3. Расширение проекта

 

Итак, наше приложение последовательно усложняется. У нас есть документ view – это main.jsp (main.html). У нас появился контроллер MyController.java (файл CarManager.java пока во внимание не берем). В конфигурационном файле springlab-servlet.xml мы должны эту связь прописать. Вот текст этого конфигурационного файла:

 

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

<beans xmlns="https://www.springframework.org/schema/beans"

xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance"

xsi:schemaLocation="https://www.springframework.org/schema/beans

https://www.springframework.org/schema/beans/spring-beans-2.5.xsd">

<!-- the application context definition for the springapp DispatcherServlet -->

<bean name="/main.htm" class="contr.MyController"/>

</beans>

 

Именно строка

<bean name="/main.htm" class="contr.MyController"/>

и реализует требуемую связь view-controller. Вы должны записать текст конфигурационного файла так, как указано здесь. Прежде, чем писать контроллер, нужно создать персистентный класс (model). Добавляем его в проект, создав предварительно пакет model:

 

package model;

 

public class Car {

private Long id;

private String model;

private int price;

 

public Long getId() {

return id;

}

public void setId(Long id) {

this.id = id;

}

 

public String getModel() {

return model;

}

public void setModel(String model) {

this.model = model;

}

public int getPrice() {

return price;

}

public void setPrice(int price) {

this.price = price;

}

}

 

Теперь нам потребуется класс для доступа к объектам персистентного класса Car. Создаем новый класс – CarManager в пакете contr:

 

package contr;

import java.util.LinkedList;

import java.util.List;

import model.Car;

 

public class CarManager {

private static List<Car> carList;

static {

Car car1 = new Car();

car1.setId((long)1);

car1.setModel("SL 500");

car1.setPrice(20000);

Car car2 = new Car();

car2.setId((long)2);

car2.setModel("607");

car2.setPrice(35000);

Car car3 = new Car();

car3.setId((long)3);

car3.setModel("KIA");

car3.setPrice(15000);

Car car4 = new Car();

car4.setId((long)4);

car4.setModel("Toyota");

car4.setPrice(25000);

 

carList = new LinkedList<Car>();

carList.add(car1);

carList.add(car2);

carList.add(car3);

carList.add(car4);

}

public List<Car> getCarList() {

return carList;

}

}

 

Наконец, пишем сам контроллер:

 

package contr;

 

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import org.springframework.web.servlet.ModelAndView;

import org.springframework.web.servlet.mvc.Controller;

 

public class MyController implements Controller{

 

 

public ModelAndView handleRequest(HttpServletRequest arg0,

HttpServletResponse arg1) throws Exception {

 

CarManager carManager = new CarManager();

 

ModelAndView modelAndView = new

ModelAndView("carList");

modelAndView.addObject("carList",

carManager.getCarList());

 

return modelAndView;

}

}

 

 

Метод handleRequest является ключевым.

 

Конфигурационный файл applicationContext.xml должен иметь такой вид:

 

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

<beans xmlns="https://www.springframework.org/schema/beans"

xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance"

xmlns:p="https://www.springframework.org/schema/p"

xmlns:aop="https://www.springframework.org/schema/aop"

xmlns:tx="https://www.springframework.org/schema/tx"

xsi:schemaLocation="https://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans-3.0.xsd

https://www.springframework.org/schema/aop https://www.springframework.org/schema/aop/spring-aop-3.0.xsd

https://www.springframework.org/schema/tx https://www.springframework.org/schema/tx/spring-tx-3.0.xsd">

 

<!--bean id="propertyConfigurer"

class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"

p:location="/WEB-INF/jdbc.properties" />

 

<bean id="dataSource"

class="org.springframework.jdbc.datasource.DriverManagerDataSource"

p:driverClassName="${jdbc.driverClassName}"

p:url="${jdbc.url}"

p:username="${jdbc.username}"

p:password="${jdbc.password}" /-->

 

<!-- ADD PERSISTENCE SUPPORT HERE (jpa, hibernate, etc) -->

</beans>

 

Итак, проект SpringLab создан. Выполним его (Очистить и построить, затем Развернуть, затем Выполнить). Результат показан на рисунке 4.

 

 

Рисунок 4. Окно приложения

 

Задание

Приведенное приложение следует усложнить, включив в интерфейс методы:

для поиска цены автомобиля по его модели, добавления автомобиля в персистентный класс, поиска автомобилей, цена на которые не превосходит введенную в форме клиента.

 

Контрольные вопросы.

 

1. Как вы понимаете назначение и принципы работы контроллера?

2. Как вы понимаете назначение и принципы работы представления?

3. Как связать представление с контроллером?

4. Как связать персистентный класс с контроллером?

 

 



Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2019-03-17 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: