Цель работы. Познакомиться с технологией 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. Как связать персистентный класс с контроллером?