持久层,服务层,表现层都涉及到了。
这个分得确实比DJANGO细致,
多体会,多注解。。:)
The domain layer
package com.packt.webstore.domain; import java.math.BigDecimal; public class Product { private String productId; private String name; private BigDecimal unitPrice; private String description; private String manufacturer; private String category; private long unitsInStock; private long unitsInOrder; private boolean discontinued; private String condition; public Product() { super(); } public Product(String productId, String name, BigDecimal unitPrice) { this.productId = productId; this.name = name; this.unitPrice = unitPrice; } public String getProductId() { return productId; } public void setProductId(String productId) { this.productId = productId; } public String getName() { return name; } public void setName(String name) { this.name = name; } public BigDecimal getUnitPrice() { return unitPrice; } public void setUnitPrice(BigDecimal unitPrice) { this.unitPrice = unitPrice; } public String getDescription() { return description; } public void setDescription(String description) { this.description = description; } public String getManufacturer() { return manufacturer; } public void setManufacturer(String manufacturer) { this.manufacturer = manufacturer; } public String getCategory() { return category; } public void setCategory(String category) { this.category = category; } public long getUnitsInStock() { return unitsInStock; } public void setUnitsInStock(long unitsInStock) { this.unitsInStock = unitsInStock; } public long getUnitsInOrder() { return unitsInOrder; } public void setUnitsInOrder(long unitsInOrder) { this.unitsInOrder = unitsInOrder; } public boolean isDiscontinued() { return discontinued; } public void setDiscontinued(boolean discontinued) { this.discontinued = discontinued; } public String getCondition() { return condition; } public void setCondition(String condition) { this.condition = condition; } @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + ((productId == null) ? 0 : productId.hashCode()); return result; } @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; Product other = (Product) obj; if (productId == null) { if (other.productId != null) return false; } else if (!productId.equals(other.productId)) return false; return true; } @Override public String toString() { return "Product [productId=" + productId + ", name=" + name + "]"; } }
The persistence layer
A persistence layer usually contains repository objects to
access domain objects. A repository object makes queries to the data source for the data,
thereafter maps the data from the data source to a domain object, and finally, persists the
changes in the domain object to the data source. So, a repository object is typically
responsible for CRUD operations ( Create , Read , Update , and Delete ) on domain objects.
The @Repository annotation ( org.springframework.stereotype.Repository ) is an
annotation that marks a specific class as a repository.
package com.packt.webstore.domain.repository; import java.util.List; import com.packt.webstore.domain.Product; public interface ProductRepository { List<Product> getAllProducts(); Product getProductById(String productId); }
package com.packt.webstore.domain.repository.impl; import java.math.BigDecimal; import java.util.ArrayList; import java.util.List; import org.springframework.stereotype.Repository; import com.packt.webstore.domain.Product; import com.packt.webstore.domain.repository.ProductRepository; @Repository public class InMemoryProductRepository implements ProductRepository { private List<Product> listOfProducts = new ArrayList<Product>(); public InMemoryProductRepository() { Product iphone = new Product("P1234","iPhone 5s", new BigDecimal(500)); iphone.setDescription("Apple iPhone 5s smartphone with 4.00-inch 640x1136 display and 8-megapixel rear camera"); iphone.setCategory("Smart Phone"); iphone.setManufacturer("Apple"); iphone.setUnitsInStock(1000); Product laptop_dell = new Product("P1235","Dell Inspiron", new BigDecimal(700)); laptop_dell.setDescription("Dell Inspiron 14-inch Laptop (Black) with 3rd Generation Intel Core processors"); laptop_dell.setCategory("Laptop"); laptop_dell.setManufacturer("Dell"); laptop_dell.setUnitsInStock(1000); Product tablet_Nexus = new Product("P1236","Nexus 7", new BigDecimal(300)); tablet_Nexus.setDescription("Google Nexus 7 is the lightest 7 inch tablet With a quad-core Qualcomm Snapdragon™ S4 Pro processor"); tablet_Nexus.setCategory("Tablet"); tablet_Nexus.setManufacturer("Google"); tablet_Nexus.setUnitsInStock(1000); listOfProducts.add(iphone); listOfProducts.add(laptop_dell); listOfProducts.add(tablet_Nexus); } public List<Product> getAllProducts() { return listOfProducts; } @Override public Product getProductById(String productId) { Product productById = null; for(Product product : listOfProducts) { if(product!=null && product.getProductId()!=null && product.getProductId().equals(productId)){ productById = product; break; } } if(productById == null){ throw new IllegalArgumentException("No products found with the product id: "+ productId); } return productById; } }
The service layer:
package com.packt.webstore.service; public interface OrderService { void processOrder(String productId, int count); }
package com.packt.webstore.service.impl; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import com.packt.webstore.domain.Product; import com.packt.webstore.domain.repository.ProductRepository; import com.packt.webstore.service.OrderService; @Service public class OrderServiceImpl implements OrderService { @Autowired private ProductRepository productRepository; @Override public void processOrder(String productId, int quantity) { Product productById = productRepository.getProductById(productId); if(productById.getUnitsInStock() < quantity){ throw new IllegalArgumentException("Out of Stock. Available Units in stock"+ productById.getUnitsInStock()); } productById.setUnitsInStock(productById.getUnitsInStock() - quantity); } }
Controller Layer:
package com.packt.webstore.controller; import java.math.BigDecimal; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.RequestMapping; import com.packt.webstore.domain.repository.ProductRepository; @Controller public class ProductController { @Autowired private ProductRepository productRepository; @RequestMapping("/products") public String list(Model model) { model.addAttribute("products", productRepository.getAllProducts()); return "products"; } }
package com.packt.webstore.controller; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.RequestMapping; import com.packt.webstore.service.OrderService; @Controller public class OrderController { @Autowired private OrderService orderService; @RequestMapping("/order/P1234/20") public String process() { orderService.processOrder("P1234", 20); return "redirect:/products"; } }
view 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" %> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> <link rel="stylesheet" href="//netdna.bootstrapcdn.com/bootstrap/3.0.0/css/bootstrap.min.css"> <title>Product</title> </head> <body> <section> <div class="jumbotron"> <div class="container"> <h1>Products</h1> <p>All the available products in our store</p> </div> </div> </section> <section class="container"> <div class="row"> <c:forEach items="${products}" var="product"> <div class="col-sm-6 col-md-3" style="padding-bottom: 15px"> <div class="thumbnail"> <div class="caption"> <h3>${product.name}</h3> <p>${product.description}</p> <p>$${product.unitPrice}</p> <p>Available ${product.unitsInStock} units in stock</p> </div> </div> </div> </c:forEach> </div> </section> </body> </html>
时间: 2024-10-08 00:10:58