Розробка Web-проектів із використанням Spring Framework
Завантажити презентаціюПрезентація по слайдам:
Spring — це Framework ! Framework — засіб, що дозволяє “склеювати” окремі частини (наприклад, програмні модулі, компоненти) у проект, готовий до застосування. При цьому структура проекту у найбільш загальному вигляді є вже визначеною (залежить від Framework), і від розробника вимагається фактично здійснити налаштування проекту, виходячи із власних потреб. Spring
Стисло про специфіку Spring Framework 1. Ядро Spring (Core Spring) може розглядатись двояко: як легковаговий (Light-Weight) Framework; як легковаговий (Light-Weight) контейнер (Container ) для управління бізнес-об'єктами (Business Objects) та відношеннями між ними. (Важливо, що навіть при розробці J2EE-проектів далеко не завжди є потреба у використанні усіх можливих сервісів, що надаються Heavy-Weight J2EE контейнерами. У багатьох випадках можна обмежитись легковаговими контейнерами). 2. Core Spring (як легковаговий контейнер) – це IoC-контейнер. 3. (POJO та POJI ). Суттєва специфіка Spring – розроблювана компонентна інфраструктура не регламентується потребами успадкування від специфічних (для Spring) класів чи інтерфейсів. Отже, Spring ґрунтується на POJO (Plain Old Java Object) та POJI (Plain Old Java Interface). Spring
Spring: POJO (Plain Old Java Object) та POJI (Plain Old Java Interface). Орієнтація на POJO та POJI означає, що спрощується Unit-тестування, забезпечується можливість досить просто застосовувати TDD (Test Driven Development). Для порівняння можна розглянути клас TheServlet (він є Non-POJO, оскільки успадковується від HttpServlet): class TheServlet extends HttpServlet{ … } Для його Unit-тестування потрібно запустити Web/Application сервер, а перед цим забезпечити розгортання (deployment) відповідного компонента на сервері, оскільки для HttpServlet та його розширень необхідно забезпечити контекст, що надається сервером. Те ж саме стосується і класичних компонентів EJB. Spring
Spring та парадигма Model-View-Controller Spring Framework для Web- проектів базується на парадигмі (паттерні архітектурного рівня ще часів Smalltalk) Model-View-Controller (MVC). На MVC-парадигмі базуються такі популярні фреймворки як Struts, WebWork тощо. Як наслідок — можлива інтеграція Spring з іншими фреймворками. (Якщо коротко, то об'єкти Model задають дані, об'єкти View відповідають за відображення даних, об'єкти Controller реагують на дії користувача щодо отримання даних та їх модифікації.) Підтримка різних View. Spring
Трохи історії Web-розробки на Java Java-сервлети — отримання HTML-коду шляхом використання println(). Model 1: JavaServer Pages (JSP) — змішування HTML-коду (“статика”) та Java-коду (“динаміка”). Model 2: Java-сервлети + JSP — cервлети використовуються для керування потоком виконання Web-додатків, а JSP допомагають в отриманні HTML-коду. Model 2 фактично відповідає патерну Model-View-Controller. Як і багато інших Web-фреймфорків Spring Web MVC Framework будується навколо сервлета , що генерується (generic servlet) та відомий як DispatcherServlet чи FrontControler. Саме цей сервлет є точкою підключення клієнтів, що використовують для доступу веб-браузери. Spring
Ілюстрація до проектів Spring Web MVC (http://www.springframework.org/documentation) Spring
Ще одна ілюстрація до проектів Spring Web MVC Agile Java Development with Spring, Hibernate and Eclipse By Anil Hemrajani ............................................... Publisher: Sams Pub Date: May 09, 2006 Print ISBN-10: 0-672-32896-8 Print ISBN-13: 978-0-672-32896-1 Pages: 360 Spring
Проекти Spring MVC Web. Потік робіт (workflow) та ключові складові таких проектів (1/2) 1. Від клієнта запит стосовно деякого ресурсу потрапляє до Spring Front Controller, який реалізовано як сервлет проекту (Web Application). 2. Front Controller відшукує Handler Mapping, який на основі заданого відображення (map) «ресурс» --> «контролер» дозволяє визначити контролер для проведення подальшої обробки запиту. За підключення контролера до процесу обробки запиту відповідає Handler Adapter. 3. Контролер обробляє запит, результатом роботи є об'єкт типу ModelAndView, який повертається до Front Controller. 4. Front Controller, використовуючи View Resolver, визначає відповідне View (View може бути реалізований на основі Jsp, Velocity, Free marker тощо) та передає його клієнту. 1 2 3 4 Spring
Проекти Spring MVC Web. Потік робіт (workflow) та ключові складові таких проектів (2/2) 1. Від клієнта запит стосовно деякого ресурсу потрапляє до Spring Front Controller, який реалізовано як сервлет проекту (Web Application). 2. Front Controller відшукує Handler Mapping, який на основі заданого відображення (map) «ресурс» --> «контролер» дозволяє визначити контролер для проведення подальшої обробки запиту. За підключення контролера до процесу обробки запиту відповідає Handler Adapter. 3. Контролер обробляє запит, результатом роботи є об'єкт типу ModelAndView, який повертається до Front Controller. 4. Front Controller, використовуючи View Resolver, визначає відповідний View (View може бути реалізований на основі Jsp, Velocity, Free marker тощо) та передає його клієнту. Front Controller (класу DispatcherServlet) Handler Mapping, Handler Adapter Controller, ModelAndView View Resolver Складові Spring MVC Web-проектів Spring
Front Controller (DispatcherServlet) та файл web.xml (дескрипторний файл web-проектів) . . . springapp org.springframework.web.servlet.DispatcherServlet 1 springapp1 *.htm . . . (Web-) контекст Web Application за замовчуванням задається у файлі /WEB-INF/springapp-servlet.xml Spring
Варіант використання кількох файлів конфігурації контексту. Файл web.xml . . . org.springframework.web.context.ContextLoaderListener contextConfigLocation /WEB-INF/ applicationContext.xml, /WEB-INF/ springapp-servlet.xml, /WEB-INF/ yet_appContext.xml . . . Listener Servlet – це “завантажувач контексту” (“Context Loader” ) проекту. (За замовчуванням файлом конфігурації контексту виступає / WEB-INF/ applicationContext.xml.) Файл конфігурації “веб”-контексту за замовчуванням Spring
Handler Mapping Handler Mapping задає відображення (map) «ресурс» --> «контролер». Чотири варіанти класів для реалізації Handler Mapping (гнучкість Spring! ): SimpleUrlHandlerMapping; BeanNameUrlHandlerMapping; CommonsPathMapHandlerMapping; ControllerClassNameHandlerMapping. (Усі класи містяться у пакеті org.springframework.web.servlet.handler). Приклади використання перших двох класів надаються у наступних двох слайдах. Spring
Використання SimpleUrlHandlerMapping. Приклад Controller CalcS-servlet.xml (фрагмент) Spring
Використання BeanNameUrlHandlerMapping. Приклад Реалізації Handler Mapping за замовчуванням використовують саме цей клас. Завдяки замовчуванню можна отримати більш лаконічний вигляд конфігураційного файлу web-контексту. Новий варіант файлу CalcS-servlet.xml (фрагмент) Можна вважати, що у даному випадку Url-адреси використовуються безпосередньо для ідентифікації бінів-контролерів. Spring
Handler Adapter Можливі різноманітні варіанти класів для реалізації Handler Adapter (знову гнучкість Spring! ), зокрема “готові” класи framework’у: SimpleControllerHandlerAdapter (використовується за замовчуванням, саме ним обмежуються у більшості проектів); SimpleServletHandlerAdapter; ThrowawayControllerHandlerAdapter (усі три класи містяться у пакеті org.springframework.web.servlet.handler); власноруч розроблені класи (вони мають реалізовувати interface HandlerAdapter з того ж пакету org.springframework.web.servlet). Spring
AbstractController. Spring MVC Web проект Hello (Hello World !) Hello-servlet.xml (фрагмент) public class HelloController extends AbstractController{ public ModelAndView handleRequestInternal ( HttpServletRequest request, HttpServletResponse response){ return new ModelAndView("hello.jsp"); } } Spring Application Hello World! hello.jsp AbstractController забезпечує базову підтримку GET та POST методів. Для цього прикладу можна обійтись і без розширення (extends) AbstractController: public class HelloController implements Controller {...} Spring
Клас ModelAndView Клас ModelAndView (з пакету org.springframework.web.servlet) є контейнерним класом. Відповідні об'єкти-контейнери містять дані стосовно View та Model. При цьому використовується досить високий рівень абстракції: ModelAndView mv = new ModelAndView(myView, myModel). Spring
Model & View Клас ModelAndView (з пакету org.springframework.web.servlet) є контейнерним класом. Відповідні об'єкти містять дані стосовно View та Model. При цьому використовується досить високий рівень абстракції: ModelAndView mv = new ModelAndView(myView, myModel). Клас View (org.springframework.web.servlet.View) забезпечує підтримку різних View-технологій: JSP, Excel, Pdf, Xslt, Free Marker, Html, Tiles, Velocity, Jasper Reports etc: return new ModelAndView("hello.jsp") (з попереднього слайду). Об'єкти Model (класу org.springframework.ui.ModelMap) є по суті Map- об'єктами, які містять додаткову інформацію, що використовується разом з View для візуального відображення: 1) Map myModel = new HashMap(); ModelAndView mv = new ModelAndView(myView, myModel). 2) Map myModel = new HashMap(); myModel.put("now", now); Spring
ModelAndView. Приклади 1) ModelAndView mv = new ModelAndView("myView.jsp", "var", var); 2) ModelAndView mav = new ModelAndView("calc.jsp"); mav.addObject("z", z); mav.addObject("x", x); mav.addObject("y", y); // див. також наступний слайд 3) ModelAndView mv = new ModelAndView("myView"). Тут myView є логічним (іменем) View (Logical View) View Resolver: Logical View Physical View Location. myView.jsp myView myView.xml + розташування . . . Spring
Інтерфейс Controller. ModelAndView. Приклад: Spring MVC Web проект springapp public class InventoryController implements Controller { private ProductManager productManager; public ModelAndView handleRequest( HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String now = (new java.util.Date()).toString(); Map myModel = new HashMap(); myModel.put("now", now); myModel.put("products", this.productManager.getProducts()); return new ModelAndView("hello", "model", myModel); } public void setProductManager( ProductManager productManager) { this.productManager = productManager; } } Spring
Клас SimpleFormController Цей клас стає у нагоді, коли від користувача вимагається уведення чи уточнення деяких даних у полях форми (такі ситуації зустрічаються у більшості розроблюваних веб-проектів). Ґрунтується на концепції “об'єкта форми“ (“командного об'єкта”): в “об'єкті форми” інкапсулюються дані, що вводяться користувачем; далі, використовуючи “об'єкт форми”, такі дані можуть бути задіяні для перевірки (зокрема, так званим валідатором) і повернуті користувачу для виправлення; крім того, на основі “об'єкта форми” можна визначати деякі початкові значення для полів форми. Об'єкт форми SimpleForm Controller Spring
Використання SimpleFormController. Приклад. (1/5) Об'єкт форми SimpleForm Controller priceincrease.jsp class PriceIncreaseFormController extends SimpleFormController Об'єкт "priceIncrease” (class PriceIncrease) Контролер (фрагмент файлу springapp-servlet.xml) Spring
Використання SimpleFormController. Приклад . (2/5) (Class PriceIncreaseFormController) public class PriceIncreaseFormController extends SimpleFormController { public ModelAndView onSubmit (Object command) throws ServletException { int increase = ((PriceIncrease) command).getPercentage(); . . . return new ModelAndView(. . .); } protected Object formBackingObject ( HttpServletRequest request) throws ServletException { PriceIncrease priceIncrease = new PriceIncrease(); priceIncrease.setPercentage (20); return priceIncrease; } } Життєвий цикл контролерів для web-сторінок із формами Spring
Використання SimpleFormController. Приклад. (3/5) (Class PriceIncrease) public class PriceIncrease { private int percentage; public void setPercentage(int i) { percentage = i; } public int getPercentage() { return percentage; } } Клас об'єкта форми Spring
Використання SimpleFormController. Приклад. (5/5) (Форма у priceincrease.jsp) . . . . . . . . . . . . Фрагменти файлу priceincrease.jsp Командний об'єкт (“об'єкт форми”) Spring
View Resolver Поставка Spring містить чималий арсенал готових до використання варіантів View Resolver. До того ж можна створювати власні варіанти, реалізовуючи інтерфейс: org.springframework.web.servlet.ViewResolver Spring
Spring: арсенал View Resolver Чималий арсенал готових до використання варіантів View Resolver: InternalResourceViewResolver; BeanNameViewResolver; FreeMarkerViewResolver; JasperReportsViewResolver; ResourceBundleViewResolver; UrlBasedViewResolver; VelocityLayoutViewResolver; VelocityViewResolver; XmlViewResolver; XsltViewResolver. Spring
Клас InternalResourceViewResolver . Приклад. Можливості захисту. Не можна безпосередньо дістатись до jsp-сторінок hello, priseincrease, задаючи у браузері їх імена, оскільки сторінки знаходяться у “внутрішньому” підкаталозі /WEB-INF/jsp/.
???? BeanNameViewResolver. Приклад. Можливість динамічно генерувати View (не тільки за рахунок префіксу-суфіксу!). Приклад: return ModelAndView("pdf") public class PdfGenerator extends org.springframework.web.servlet. view.document.AbstractPdfView {…} Spring
Використання валідатора (Validator) (3/4) PriceIncreaseValidator (початок) import org.springframework.validation.Validator; import org.springframework.validation.Errors; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; public class PriceIncreaseValidator implements Validator { private int DEFAULT_MIN_PERCENTAGE = 0; private int DEFAULT_MAX_PERCENTAGE = 50; private int minPercentage = DEFAULT_MIN_PERCENTAGE; private int maxPercentage = DEFAULT_MAX_PERCENTAGE; public boolean supports(Class clazz) { return PriceIncrease.class.equals(clazz); } public void setMinPercentage(int i){minPercentage = i;} public int getMinPercentage() { return minPercentage;} public void setMaxPercentage(int i) { . . .} public int getMaxPercentage() { . . .} Spring
Використання валідатора (Validator) (4/4) PriceIncreaseValidator (завершення) public void validate(Object obj, Errors errors) { PriceIncrease pi=(PriceIncrease)obj; if(pi==null){ errors.rejectValue("percentage", "error.not-specified", null, "Value required."); } else { if (pi.getPercentage() > maxPercentage) { errors.rejectValue("percentage", "error.too-high", new Object[] {new Integer(maxPercentage)}, "Value too high."); } if (pi.getPercentage()
Склад (мінімальний) проекту calc1 (1/2) calc1| WEB-INF| classes| SumController.class | lib | commons-beanutils.jar | spring-2.0.4.jar | . . . | web.xml | CalcS-servlet.xml | calc.jsp CalcS Проект розгорнуто у Tomcat Spring
Склад (мінімальний) проекту calc1 (2/2) commons-beanutils.jar – утіліти для визначення властивостей JavaBean та доступу до них; commons-digester.jar – засоби обробки XML-документів; commons-logging-1.1.jar – засоби протоколювання. Spring
Файл WEB-INF/web.xml (дескрипторний файл web- проектів) CalcS org.springframework.web.servlet.DispatcherServlet 1 CalcS *.html Spring
WEB-INF/CalcS-servlet.xml – конфігураційний файл Spring Framework (задається WebApplicationContext)
Class SumController import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.springframework.web.servlet.ModelAndView; import org.springframework.web.servlet.mvc.AbstractController; public class SumController extends AbstractController { protected ModelAndView handleRequestInternal( HttpServletRequest request, HttpServletResponse response) throws Exception { ModelAndView mav = new ModelAndView("/calc.jsp"); try { int x=Integer.parseInt(request.getParameter("x")); int y=Integer.parseInt(request.getParameter("y")); int z = x + y; mav.addObject("x", x); mav.addObject("y", y); mav.addObject("z",z); } catch (NumberFormatException e){e.printStackTrace();} return mav; } } Model View Spring
Модифікація Calc1-проекту (проектCalc2) // SumController.java import java.util.*; . . . mav.addObject("y", y); mav.addObject("date", new Date()); . . . . . . + = ${z} ${date} Обчислення в JSP: ${x+y} . . . Java Standard Tag Library Model Spring
Виконання проектів Spring Web MVC на прикладі Calc1 (1/2) 3. SumController обробляє запит, повертаючи об'єкт типу ModelAndView (виробляється методом handleRequestInternal). Такий об'єкт містить інформацію про View (у даному випадку це просто ім'я JSP-файлу — calc.jsp) та деякі дані моделі (у даному випадку значення x, y, z). 1. Запити від користувача (у даному випадку до ресурсу calc.html) надходять до DispatcherServlet (з іменем CalcS) – єдиного сервлету у Spring Web MVC проектах, він відіграє роль FrontControler). 2. DispatcherServlet за конфігуруванням відображення ресурсів (URL-mapping) перенаправляє запит одному з контролерів (у даному випадку відображення визначено для єдиного ресурсу: calc.html --> SumController ). 1 2 3 1 2 3 Spring
Виконання проектів Spring Web MVC на прикладі Calc1 (2/2) 4. DispatcherServlet передає отримані дані на обробку View-template (при цьому може використовуватись ViewResolver), у даному випадку в якості View-template виступає JavaServer Page (а отже, calc.jsp буде оброблено контейнером Tomcat) 5. DispatcherServlet передає HTML-файл (response) користувачу. 4 4 5 5 Spring
Ant Призначення: виконання повторюваних, як правило, рутинних завдань, пов'язаних із розробкою, розгортанням, виконанням проектів. Приклади можливих завдань-цілей (за змістом): компіляція; копіювання файлів (з урахуванням структури каталогів); розгортання проекту; etc. Приклади використання (запусків): ant deploy ant createTables loadData printData Завдання-цілі (та їх імена) визначають- ся у файлі build.xml Конкретні імена завдань Spring
Опис завдань (фрагмент build.xml) - 2. (Використання з БД та технологією JDBC API) SELECT * FROM products; JDBC (Java DataBase Connectivity) SQL (Structured Query Language) Перелік завдань (target), пов'язаних із БД: dropTables; loadData; printData; clearData; shutdownDb. Spring
Опис завдань (фрагмент build.xml) - 3. (Використання з БД та технологією JDBC API) INSERT INTO products (id, description, price) values(1, 'Lamp', 5.00); INSERT INTO products (id, description, price) values(2, 'Table', 75.00); INSERT INTO products (id, description, price) values(3, 'Chair', 22.00); Файл load_data.sql CREATE TABLE products ( id INTEGER NOT NULL PRIMARY KEY, description varchar(255), price decimal(15,2) ); CREATE INDEX products_description ON products(description); Файл create_products.sql для target “createTables” Spring
Файл build.xml (початковий фрагмент) . . . Для зручності в окремому файлі визначені властивості (properties) для налаштуван-ня на конкретні веб-сервер та СУБД Spring
Файл build.properties (налаштування на Tomcat 6, hsqldb ) # Ant properties for building the springapp1 appserver.home=c:/tomcat # for Tomcat 5 use $appserver.home}/server/lib # for Tomcat 6 use $appserver.home}/lib appserver.lib=${appserver.home}/lib deploy.path=${appserver.home}/webapps tomcat.manager.url=http://localhost:8080/manager tomcat.manager.username=admin tomcat.manager.password= ##################### DB ########################## db.driver=org.hsqldb.jdbcDriver db.url=jdbc:hsqldb:hsql://localhost db.user=sa db.pw= driverClassName (hsqldb.jar) Spring
JDBC. Файл build.properties (переналаштування проекту на MySQL ) # Ant properties for building the springapp1 . . . ##################### DB ########################## db.driver=com.mysql.jdbc.Driver db.url=jdbc:mysql://localhost/test db.user=root db.pw=root driverClassName (mysql-connector-java-3.1.14.jar) Spring
Файл build.xml. Не мучайтесь, копіюйте! DROP TABLE products; SELECT * FROM products; DELETE FROM products; SHUTDOWN; Не для перегляду, тільки для можливого копіювання! Цей файл (build.xml) майже без змін узято з документації до Spring Framework (http://www.springframework): spring-framework-2.5.3-with-docs.zip Spring
Додаток 5. Приклад: springapp1 (spring-проект з БД) Проект розроблено на основі прикладу з документації, що надається в одному архіві із Spring Framework (spring-framework-2.5.3-with-docs.zip): spring-framework-2.5.3\docs\MVC-step-by-step): http://www.springframework.org Spring
Запуск СУБД HSQL у серверному режимі (із визначенням робочої БД test) java -classpath ..\war\WEB-INF\lib\hsqldb.jar org.hsqldb.Server -database test Spring
Створення БД test (1/3) (з використанням ant) ant createTables loadData printData Налаштування на СУБД HSQL SQL JDBC JDBC (Java DataBase Connectivity) SQL (Structured Query Language) Spring
Створення таблиць БД test (2/3) (використання SQL JDBC) Target createTables Target loadData Spring
Створення таблиць БД test (3/3) (виконання ant-завдання) ant createTables loadData printData Spring
Використання MySQL (1/4) 1. Створити БД, наприклад з використання HeidiSQL (Frontend MySQL) (MySQL запускається у вигляді служби Windows) Spring
Використання MySQL (2/4) 2. Зробити наступні заміни у налаштуваннях, пов'язаних із СУБД: 3. Додати у каталог lib файл mysql-connector-java-3.1.14.jar. Все! Проект можна запускати. Spring
Використання MySQL (3/4) MySQL: створення таблиць БД test (ant-завдання) ant createTables loadData printData Spring
web.xml (фрагмент) org.springframework.web.context.ContextLoaderListener springapp org.springframework.web.servlet.DispatcherServlet 1 springapp *.htm index.jsp /spring /WEB-INF/tld/spring-form.tld Spring
class Product package springapp.domain; import java.io.Serializable; public class Product implements Serializable { private int id; private String description; private Double price; public void setId(int i) { id = i; } public int getId() { return id; } public String getDescription() { return description; } public void setDescription(String description) { this.description = description; } public Double getPrice() { return price; } public void setPrice(Double price) {this.price = price;} public String toString() { StringBuffer buffer = new StringBuffer(); buffer.append("Description: " + description + ";"); buffer.append("Price: " + price); return buffer.toString(); } } Spring
interface ProductDao package springapp.dao; import java.util.List; import springapp.domain.Product; public interface ProductDao { public List getProductList(); public void saveProduct(Product prod); } Spring
class JdbcProductDao - (1/2) package springapp.dao; import java.sql.ResultSet; import java.sql.SQLException; import java.util.List; import org.springframework.jdbc.core.namedparam.MapSqlParameterSource; import org.springframework.jdbc.core.simple.ParameterizedRowMapper; import org.springframework.jdbc.core.simple.SimpleJdbcDaoSupport; import springapp.domain.Product; public class JdbcProductDao extends SimpleJdbcDaoSupport implements ProductDao { public List getProductList() { List products = getSimpleJdbcTemplate().query( "select id, description, price from products", new ProductMapper()); return products; } Spring
class JdbcProductDao - (2/2) public void saveProduct(Product prod) { int count = getSimpleJdbcTemplate().update( "update products set description = :description, price = :price where id = :id", new MapSqlParameterSource().addValue("description", prod.getDescription()) .addValue("price", prod.getPrice()) .addValue("id", prod.getId())); } private static class ProductMapper implements ParameterizedRowMapper { public Product mapRow(ResultSet rs, int rowNum) throws SQLException { Product prod = new Product(); prod.setId(rs.getInt("id")); prod.setDescription(rs.getString("description")); prod.setPrice(new Double(rs.getDouble("price"))); return prod; } } } Spring
class PriceIncrease package springapp.service; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; public class PriceIncrease { private int percentage; public void setPercentage(int i) { percentage = i; } public int getPercentage() { return percentage; } } Spring
class PriceIncreaseValidator - (1/2) package springapp.service; import org.springframework.validation.Validator; import org.springframework.validation.Errors; public class PriceIncreaseValidator implements Validator { private int DEFAULT_MIN_PERCENTAGE = 0; private int DEFAULT_MAX_PERCENTAGE = 50; private int minPercentage = DEFAULT_MIN_PERCENTAGE; private int maxPercentage = DEFAULT_MAX_PERCENTAGE; public boolean supports(Class clazz) { return PriceIncrease.class.equals(clazz); } public void validate(Object obj, Errors errors) { PriceIncrease pi = (PriceIncrease) obj; if (pi == null) { errors.rejectValue("percentage", "error.not-specified", null, "Value required.") } else { if (pi.getPercentage() > maxPercentage) { errors.rejectValue("percentage", "error.too-high", new Object[] {new Integer(maxPercentage)}, "Value too high."); } Spring
interface ProductManager package springapp.service; import java.io.Serializable; import java.util.List; import springapp.domain.Product; public interface ProductManager extends Serializable{ public void increasePrice(int percentage); public List getProducts(); } Spring
class SimpleProductManager package springapp.service; import java.util.List; import springapp.domain.Product; import springapp.dao.ProductDao; public class SimpleProductManager implements ProductManager { private ProductDao productDao; public List getProducts() { return productDao.getProductList(); } public void increasePrice(int percentage) { List products = productDao.getProductList(); if (products != null) { for (Product product : products) { double newPrice = product.getPrice().doubleValue() * (100 + percentage)/100; product.setPrice(newPrice); productDao.saveProduct(product); } } } public void setProductDao(ProductDao productDao) { this.productDao = productDao; } } Spring
Eclipse. Структура проектів Spring Web MVC calc | WEB-INF | classes | SumController.class | lib | servlet-api.jar | spring-2.0.4.jar | . . . | web.xml | CalcS-servlet.xml | calc.jsp Spring
Деякі особливості Spring-проектів. Url- або request-mapping (з файлу . . .-servlet.xml) . . .
Деякі особливості Spring-проектів. ViewResolver (з файлу . . .-servlet.xml) . . . org.springframework.web.servlet.view.JstlView /WEB-INF/jsp/ .jsp . . . ModelAndView mav = new ModelAndView("calc"); calc --> /WEB-INF/jsp/ calc.jsp / Spring
Контролери для web-сторінок без форм (з файлу . . .-servlet.xml) . . . Об'єкт бізнес-рівня public class ReadMyNotesController extends AbstractController { private INoteManager noteManager; protected ModelAndView handleRequestInternal( HttpServletRequest request, HttpServletResponse response) throws Exception { . . . public void setNoteManager(INoteManager noteManager) { this.noteManager = noteManager; } . . . Spring
Контролери для web-сторінок з формами (з файлу . . .-servlet.xml) true userToLogin UserDto userLogin userStart.html Валідатор (перевіряє дані, що уводяться у формі) Spring
Контролери для web-сторінок з формами. UserLoginFormController public class UserLoginFormController extends SimpleFormController { public ModelAndView onSubmit(HttpServletRequest request, HttpServletResponse response, Object command, BindException e) throws ServletException { . . . } protected Object formBackingObject(HttpServletRequest request) throws ServletException { UserDto user = new UserDto(); return user; } private IUserManager userManager; public void setUserManager (IUserManager userManagerService) { this.userManager = userManager; } } Spring
Архітектурні рівні та об'єкти DataBase Layer Domain Object Data Access Object (DAO) Business Object Layer Business Object Data Transfer Object (DTO) User Interface Layer Spring
User.java public class User implements Serializable { private Long id; private String login; private Set notes = new HashSet(); private Set friends = new HashSet (); . . . public Long getId() { return id; } public void setId(Long id) { this.id = id; } . . . } Spring
Note.java public class Note implements Serializable { private Long id; private User user; private String content; . . . public Long getId() { return id; } public void setId(Long id) { this.id = id; } . . . } Spring
DB blog HeidiSQL– front-end MySQL Усі таблиці створюються автоматично, у т.ч. friends Spring
Схожі презентації
Категорії