Create Spring MVC Project
On the Eclipse, create a Spring MVC project in Spring Boot
Enter Project Information:
- Name: LearnSpringMVCWithRealApps
- Group: com.demo
- Artifact: LearnSpringMVCWithRealApps
- Description: Learn Spring MVC with Real Apps
- Package: com.demo
Select the technologies and libraries to be used:
- Web
Click Next button to show Site Information for project
Click Finish button to finish create Spring MVC project
Configure pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.demo</groupId>
<artifactId>LearnSpringMVCWithRealApps</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>LearnSpringMVCWithRealApps</name>
<description>Learn Spring MVC with Real Apps</description>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.2.RELEASE</version>
<relativePath /> <!-- lookup parent from repository -->
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
<dependencies>
<!-- Spring MVC -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- JSTL tag lib -->
<dependency>
<groupId>javax.servlet.jsp.jstl</groupId>
<artifactId>javax.servlet.jsp.jstl-api</artifactId>
<version>1.2.1</version>
</dependency>
<dependency>
<groupId>taglibs</groupId>
<artifactId>standard</artifactId>
<version>1.1.2</version>
</dependency>
<!-- Tomcat for JSP rendering -->
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-jasper</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
Configure application.properties
spring.mvc.view.prefix = /WEB-INF/views/
spring.mvc.view.suffix = .jsp
spring.mvc.static-path-pattern=/resources/**
server.port=9596
Create Resources
Images
Create new folder named images in src\main\resources\static folder. Copy images need show to this folder
Entities Class
Create new package, named com.demo.entities. In this package, create entities class as below:
Product Entity
Create new java class, named Product.java
package com.demo.entities;
public class Product {
private String id;
private String name;
private String photo;
private double price;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPhoto() {
return photo;
}
public void setPhoto(String photo) {
this.photo = photo;
}
public double getPrice() {
return price;
}
public void setPrice(double price) {
this.price = price;
}
public Product() {
}
public Product(String id, String name, String photo, double price) {
this.id = id;
this.name = name;
this.photo = photo;
this.price = price;
}
}
Item Entity
Create new java class, named Item.java
package com.demo.entities;
public class Item {
private Product product;
private int quantity;
public Product getProduct() {
return product;
}
public void setProduct(Product product) {
this.product = product;
}
public int getQuantity() {
return quantity;
}
public void setQuantity(int quantity) {
this.quantity = quantity;
}
public Item() {
}
public Item(Product product, int quantity) {
this.product = product;
this.quantity = quantity;
}
}
Models Class
Create new package, named com.demo.models. In this package, create ProductModel class as below:
package com.demo.models;
import java.util.ArrayList;
import java.util.List;
import com.demo.entities.Product;
public class ProductModel {
private List<Product> products;
public ProductModel() {
this.products = new ArrayList<Product>();
this.products.add(new Product("p01", "name 1", "thumb1.gif", 20));
this.products.add(new Product("p02", "name 2", "thumb2.gif", 21));
this.products.add(new Product("p03", "name 3", "thumb3.gif", 22));
}
public List<Product> findAll() {
return this.products;
}
public Product find(String id) {
for (Product product : this.products) {
if (product.getId().equalsIgnoreCase(id)) {
return product;
}
}
return null;
}
}
Create Controllers
Create new package named com.demo.controllers. In this package, create controllers as below:
ProductController
Create new java class, named ProductController.java
package com.demo.controllers;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import com.demo.models.ProductModel;
@Controller
@RequestMapping(value = "product")
public class ProductController {
@RequestMapping(method = RequestMethod.GET)
public String index(ModelMap modelMap) {
ProductModel productModel = new ProductModel();
modelMap.put("products", productModel.findAll());
return "product/index";
}
}
CartController
Create new java class, named CartController.java use manage Shopping Cart as below:
package com.demo.controllers;
import java.util.ArrayList;
import java.util.List;
import javax.servlet.http.HttpSession;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import com.demo.entities.Item;
import com.demo.models.ProductModel;
@Controller
@RequestMapping(value = "cart")
public class CartController {
@RequestMapping(value = "index", method = RequestMethod.GET)
public String index() {
return "cart/index";
}
@RequestMapping(value = "buy/{id}", method = RequestMethod.GET)
public String buy(@PathVariable("id") String id, HttpSession session) {
ProductModel productModel = new ProductModel();
if (session.getAttribute("cart") == null) {
List<Item> cart = new ArrayList<Item>();
cart.add(new Item(productModel.find(id), 1));
session.setAttribute("cart", cart);
} else {
List<Item> cart = (List<Item>) session.getAttribute("cart");
int index = this.exists(id, cart);
if (index == -1) {
cart.add(new Item(productModel.find(id), 1));
} else {
int quantity = cart.get(index).getQuantity() + 1;
cart.get(index).setQuantity(quantity);
}
session.setAttribute("cart", cart);
}
return "redirect:/cart/index";
}
@RequestMapping(value = "remove/{id}", method = RequestMethod.GET)
public String remove(@PathVariable("id") String id, HttpSession session) {
ProductModel productModel = new ProductModel();
List<Item> cart = (List<Item>) session.getAttribute("cart");
int index = this.exists(id, cart);
cart.remove(index);
session.setAttribute("cart", cart);
return "redirect:/cart/index";
}
private int exists(String id, List<Item> cart) {
for (int i = 0; i < cart.size(); i++) {
if (cart.get(i).getProduct().getId().equalsIgnoreCase(id)) {
return i;
}
}
return -1;
}
}
Create Views
Create new folders with path webapp\WEB-INF\views in src\main. In views folder, create jsp views as below:
Product View
Create new folders named product. Create new jsp file named index.jsp
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Product Page</title>
</head>
<body>
<h3>Products Page</h3>
<table cellpadding="2" cellspacing="2" border="1">
<tr>
<th>Id</th>
<th>Name</th>
<th>Photo</th>
<th>Price</th>
<th>Buy</th>
</tr>
<c:forEach var="product" items="${products }">
<tr>
<td>${product.id }</td>
<td>${product.name }</td>
<td><img src="${pageContext.request.contextPath }/resources/http://learningprogramming.net/wp-content/uploads/java/spring_mvc/${product.photo }" width="50"></td>
<td>${product.price }</td>
<td align="center">
<a href="${pageContext.request.contextPath }/cart/buy/${product.id}">Buy Now</a>
</td>
</tr>
</c:forEach>
</table>
</body>
</html>
Cart View
Create new folders named cart. Create new jsp file named index.jsp
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Cart Page</title>
</head>
<body>
<h3>Cart Page</h3>
<table cellpadding="2" cellspacing="2" border="1">
<tr>
<th>Option</th>
<th>Id</th>
<th>Name</th>
<th>Photo</th>
<th>Price</th>
<th>Quantity</th>
<th>Sub Total</th>
</tr>
<c:set var="total" value="0"></c:set>
<c:forEach var="item" items="${sessionScope.cart }">
<c:set var="total"
value="${total + item.product.price * item.quantity }"></c:set>
<tr>
<td align="center"><a
href="${pageContext.request.contextPath }/cart/remove/${item.product.id }"
onclick="return confirm('Are you sure?')">Remove</a></td>
<td>${item.product.id }</td>
<td>${item.product.name }</td>
<td><img src="${pageContext.request.contextPath }/resources/http://learningprogramming.net/wp-content/uploads/java/spring_mvc/${item.product.photo }"
width="50"></td>
<td>${item.product.price }</td>
<td>${item.quantity }</td>
<td>${item.product.price * item.quantity }</td>
</tr>
</c:forEach>
<tr>
<td colspan="6" align="right">Sum</td>
<td>${total }</td>
</tr>
</table>
<br>
<a href="${pageContext.request.contextPath }/product">Continue
Shopping</a>
</body>
</html>
Structure of Spring MVC Project
Run Application
Select LearnSpringMVCWithRealAppsApplication.java file in com.demo package, right click and select Run As/Spring Boot App menu
Access index method in product controller with following url: http://localhost:9596/product
Output
Click Buy Now link from product page to buy a product and show it in cart page
Output
Click Remove link from cart page to remove product inside cart
References
I recommend you refer to the books below to learn more about the knowledge in this article:
- Spring MVC Beginners Guide - Second Edition
- Spring MVC Cookbook
- Spring MVC Blueprints
- Mastering Spring MVC 4
- Spring Boot in Action
- Pro Spring Boot
- Constructing Usable Shopping Carts: Designing and Building Great E-Commerce Applications