第十六站:Java珊瑚红——Web开发的活力之源

Java在Web开发领域扮演着极其重要的角色,其生态系统提供了多种技术来构建高效、可维护的Web应用程序。下面我们将通过源代码示例,来探讨Servlet、JSP、Spring MVC和RESTful API在Java Web开发中的应用。

Servlet

Servlet是Java EE规范的一部分,它提供了一种运行在服务器端的Java程序,可以处理客户端请求并生成动态响应。以下是一个简单的Servlet示例,它返回一个简单的HTTP响应:

import javax.servlet.*;
import javax.servlet.http.*;
import java.io.IOException;public class HelloWorldServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {response.setContentType("text/html");response.setCharacterEncoding("UTF-8");response.getWriter().write("<h1>Hello, World!</h1>");}
}

在这个例子中,HelloWorldServlet继承了HttpServlet类,并覆盖了doGet方法来处理GET请求。

JSP

JSP(JavaServer Pages)允许将Java代码嵌入到HTML页面中,使得页面能够根据Java代码的执行结果动态生成内容。以下是一个简单的JSP页面示例:

<!DOCTYPE html>
<html>
<head><title>JSP Example</title>
</head>
<body><h1>Hello, JSP!</h1><% String message = "Welcome to JSP!";out.println(message);%>
</body>
</html>

在这个JSP页面中,我们使用<% %>标签包裹Java代码,这段代码将在服务器端执行,并将结果输出到客户端浏览器。

Spring MVC

Spring MVC是一个用于构建Web应用程序的框架,它提供了一种模型-视图-控制器(MVC)的实现。以下是一个Spring MVC控制器的示例:

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;@Controller
public class MyController {@GetMapping("/greeting")public String greeting(Model model) {model.addAttribute("message", "Hello, Spring MVC!");return "greeting";}
}

在这个控制器中,我们定义了一个处理/greeting路径GET请求的方法。它向模型添加一个属性,然后返回视图名称。

对应的视图(HTML页面)可能如下所示:

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head><title>Greeting Page</title>
</head>
<body><h1 th:text="${message}">Hello, World!</h1>
</body>
</html>

这里使用了Thymeleaf模板引擎来动态插入模型中的message属性。

RESTful API

RESTful API是一种设计风格,它使用标准的HTTP方法来执行CRUD操作。以下是一个使用Spring Boot创建的RESTful控制器示例:

import org.springframework.web.bind.annotation.*;
import java.util.concurrent.atomic.AtomicLong;@RestController
public class GreetingController {private static final String template = "Hello, %s!";private final AtomicLong counter = new AtomicLong();@GetMapping("/greeting")public Greeting greeting(@RequestParam(value = "name", defaultValue = "World") String name) {return new Greeting(counter.incrementAndGet(), String.format(template, name));}static class Greeting {private final long id;private final String content;public Greeting(long id, String content) {this.id = id;this.content = content;}// Getters and Setters}
}

在这个控制器中,我们定义了一个处理/greeting路径GET请求的方法,它接受一个name参数,并返回一个包含问候语的JSON对象。

这些示例展示了Java在Web开发中的多样性和灵活性。Servlet和JSP为传统的服务器端Web应用程序提供了基础,而Spring MVC和RESTful API则为构建现代Web应用程序提供了强大的支持。通过这些技术,Java开发者可以构建出高效、可维护、易于扩展的Web服务。

让我们通过一个更具体的案例来进一步阐释Java在Web开发中的应用,特别是结合Spring MVC和RESTful API来构建一个实际的Web服务。

案例:在线图书商店

案例背景

假设我们正在开发一个在线图书商店的Web应用程序,它允许用户浏览图书、查看详情、添加到购物车以及进行购买。

Spring MVC应用

1. 图书列表页面控制器

首先,我们创建一个Spring MVC控制器来处理对图书列表页面的请求:

@Controller
public class BookController {@GetMapping("/books")public String listBooks(Model model, @RequestParam(value = "category", required = false) String category) {List<Book> books = bookService.findBooksByCategory(category); // 假设bookService已实现model.addAttribute("books", books);model.addAttribute("category", category);return "booksList";}
}

在这个控制器中,listBooks方法根据请求的分类参数来获取图书列表,并将其添加到模型中,然后返回视图名称booksList

2. 图书详情页面控制器

接下来,我们创建另一个控制器方法来显示单个图书的详细信息:

@GetMapping("/books/{id}")
public String bookDetails(@PathVariable Long id, Model model) {Book book = bookService.findBookById(id); // 假设bookService已实现if (book != null) {model.addAttribute("book", book);return "bookDetails";} else {return "bookNotFound"; // 未找到图书时的视图}
}

这个方法使用@PathVariable来获取URL中的图书ID,并根据ID获取图书详情。

3. 视图页面

对于booksList视图,我们可能会有一个Thymeleaf模板,如下所示:

<html>
<head><title>Book List</title></head>
<body><h1>Book List</h1><form action="/books" method="get"><input type="text" name="category" placeholder="Search by category"><button type="submit">Search</button></form><div th:each="book : ${books}"><h2 th:text="${book.title}"></h2><p th:text="${book.author}"></p><!-- 其他图书信息 --></div>
</body>
</html>

RESTful API应用

1. 图书资源控制器

现在,让我们创建一个RESTful API控制器来提供图书的RESTful服务:

@RestController
@RequestMapping("/api/books")
public class BookApiController {@GetMappingpublic ResponseEntity<List<Book>> getAllBooks(@RequestParam(value = "category", required = false) String category) {List<Book> books = bookService.findBooksByCategory(category); // 假设bookService已实现return ResponseEntity.ok(books);}@GetMapping("/{id}")public ResponseEntity<Book> getBookById(@PathVariable Long id) {Book book = bookService.findBookById(id); // 假设bookService已实现if (book != null) {return ResponseEntity.ok(book);} else {return ResponseEntity.notFound().build();}}
}

这个控制器提供了两个方法:一个用于获取所有图书的列表,另一个用于通过ID获取单个图书的详细信息。返回类型是ResponseEntity,它允许我们自定义响应的状态。

2. 请求和响应示例

客户端可以使用HTTP GET请求来获取图书列表:

GET /api/books?category=fiction

服务器响应可能是:

[{"id": 1,"title": "Fiction Book One","author": "Author A"},{"id": 2,"title": "Fiction Book Two","author": "Author B"}
]

对于单个图书的详细信息,客户端请求可能是:

GET /api/books/1

服务器响应可能是:

{"id": 1,"title": "Fiction Book One","author": "Author A","description": "A thrilling fiction novel...","price": 19.99
}

如果没有找到图书,服务器将返回404状态码。

结论

通过这个案例,我们展示了如何使用Spring MVC和RESTful API来构建一个在线图书商店的Web应用程序。Spring MVC控制器用于生成服务器端渲染的页面,而RESTful API控制器提供了轻量级的、易于消费的数据接口,适合于各种客户端,包括Web页面、移动应用和第三方服务。这种分离的架构不仅提高了应用程序的灵活性和可维护性,而且也适应了现代Web开发的需要。

让我们继续扩展在线图书商店的案例,这次我们将添加购物车和订单处理的功能,以及相应的RESTful API。

购物车和订单处理

1. 购物车控制器

首先,我们创建一个控制器来管理用户的购物车:

@Controller
public class ShoppingCartController {@GetMapping("/cart")public String showCart(Model model, @AuthenticationPrincipal Customer customer) {List<Book> cartItems = customer.getShoppingCart().getBooks();model.addAttribute("cartItems", cartItems);return "cart";}@PostMapping("/cart/add")public String addToCart(@RequestParam("bookId") Long bookId, @AuthenticationPrincipal Customer customer) {Book book = bookService.findBookById(bookId); // 假设bookService已实现if (book != null) {customer.getShoppingCart().addBook(book);}return "redirect:/cart";}
}

在这个控制器中,showCart方法显示购物车中的书籍,而addToCart方法允许用户将书籍添加到购物车中。

2. 购物车RESTful API控制器

接下来,我们创建一个RESTful API控制器来提供购物车的操作:

@RestController
@RequestMapping("/api/cart")
public class ShoppingCartApiController {@PostMapping("/add/{bookId}")public ResponseEntity<?> addToCart(@PathVariable Long bookId, @AuthenticationPrincipal Customer customer) {Book book = bookService.findBookById(bookId); // 假设bookService已实现if (book != null) {customer.getShoppingCart().addBook(book);return ResponseEntity.ok().build();} else {return ResponseEntity.notFound().build();}}@GetMappingpublic ResponseEntity<List<Book>> getCartItems(@AuthenticationPrincipal Customer customer) {List<Book> cartItems = customer.getShoppingCart().getBooks();return ResponseEntity.ok(cartItems);}
}

这个控制器提供了添加书籍到购物车和获取购物车中所有书籍的API。

3. 订单控制器

然后,我们创建一个控制器来处理订单:

@Controller
public class OrderController {@PostMapping("/order")public String placeOrder(@AuthenticationPrincipal Customer customer, Model model) {List<Book> cartItems = customer.getShoppingCart().getBooks();Order order = orderService.createOrder(customer, cartItems); // 假设orderService已实现model.addAttribute("order", order);customer.getShoppingCart().clear(); // 清空购物车return "orderConfirmation";}
}

placeOrder方法创建一个订单并清空用户的购物车。

4. 订单RESTful API控制器

最后,我们创建一个RESTful API控制器来处理订单:

@RestController
@RequestMapping("/api/order")
public class OrderApiController {@PostMappingpublic ResponseEntity<Order> placeOrder(@AuthenticationPrincipal Customer customer) {List<Book> cartItems = customer.getShoppingCart().getBooks();Order order = orderService.createOrder(customer, cartItems); // 假设orderService已实现customer.getShoppingCart().clear(); // 清空购物车return ResponseEntity.ok(order);}
}

这个控制器提供了创建订单的API。

5. 视图页面

对于购物车视图,我们可能会有一个Thymeleaf模板,如下所示:

<html>
<head><title>Shopping Cart</title></head>
<body><h1>Shopping Cart</h1><div th:each="item : ${cartItems}"><h2 th:text="${item.title}"></h2><p th:text="'Price: ' + ${item.price}"></p><!-- 其他图书信息 --></div><form method="post" th:action="@{/order}"><button type="submit">Place Order</button></form>
</body>
</html>

结论

通过这个案例,我们展示了如何在在线图书商店的Web应用程序中添加购物车和订单处理功能。我们使用了Spring MVC控制器来生成用户界面,并使用RESTful API控制器来提供与前端应用交互的接口。这种设计允许我们构建一个既适用于传统服务器端渲染页面,也适用于现代单页应用(SPA)或移动应用的Web服务。通过这种方式,我们可以为用户提供丰富且一致的购物体验。

让我们继续以在线图书商店的案例为基础,深入探讨购物车和订单处理的实现,包括后端服务的伪代码示例。

购物车服务

首先,我们定义一个简单的ShoppingCart类,用于存储购物车中的书籍和用户信息:

public class ShoppingCart {private List<Book> books;private Customer customer;public ShoppingCart(Customer customer) {this.customer = customer;this.books = new ArrayList<>();}public void addBook(Book book) {books.add(book);}public List<Book> getBooks() {return books;}public void clear() {books.clear();}// 可能还有其他方法,例如计算总价等
}

然后,我们创建一个Customer类,代表用户,并包含购物车:

public class Customer {private String id;private String name;private ShoppingCart shoppingCart;public Customer(String id, String name) {this.id = id;this.name = name;this.shoppingCart = new ShoppingCart(this);}public ShoppingCart getShoppingCart() {return shoppingCart;}// 省略其他属性和方法
}

订单服务

接下来,我们定义一个Order类,用于表示用户的订单:

public class Order {private Long orderId;private Customer customer;private List<Book> books;private Date orderDate;private double totalAmount;public Order(Customer customer, List<Book> books) {this.orderId = generateOrderId(); // 假设这个方法生成唯一的订单IDthis.customer = customer;this.books = new ArrayList<>(books);this.orderDate = new Date();this.totalAmount = calculateTotalAmount();}private double calculateTotalAmount() {return books.stream().mapToDouble(Book::getPrice).sum();}// 省略其他属性和方法
}

然后,我们创建一个OrderService类,用于处理订单逻辑:

@Service
public class OrderService {// 假设bookService已注入并实现@Autowiredprivate BookService bookService;public Order createOrder(Customer customer, List<Long> bookIds) {List<Book> books = bookService.findBooksByIds(bookIds);return new Order(customer, books);}
}

书籍服务

我们还需要一个BookService类来处理与书籍相关的逻辑:

@Service
public class BookService {// 假设有一个repository来访问数据库@Autowiredprivate BookRepository bookRepository;public List<Book> findBooksByCategory(String category) {// 根据分类查询书籍return bookRepository.findByCategory(category);}public Book findBookById(Long id) {// 根据ID查询书籍return bookRepository.findById(id);}public List<Book> findBooksByIds(List<Long> ids) {// 根据ID列表查询书籍return bookRepository.findByIds(ids);}
}

数据访问层

最后,我们定义一个BookRepository接口,用于访问数据库:

public interface BookRepository extends JpaRepository<Book, Long> {List<Book> findByCategory(String category);// 其他可能的查询方法
}

请注意,上述代码示例中的服务和存储库方法都是伪代码,实际实现将依赖于具体的技术栈和业务需求。例如,JpaRepository是Spring Data JPA的一部分,它提供了一种声明式的方式来处理数据库操作。

通过这些服务和类,我们的在线图书商店应用程序能够处理用户的购物车和订单。用户可以浏览书籍,将书籍添加到购物车,查看购物车内容,然后下单购买。这些操作可以通过Spring MVC控制器和RESTful API控制器来触发,从而为不同的客户端提供服务。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/34451.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数据处理神器Elasticsearch_Pipeline:原理、配置与实战指南

文章目录 &#x1f4d1;引言一、Elasticsearch Pipeline的原理二、Elasticsearch Pipeline的使用2.1 创建 Pipeline2.2 使用 Pipeline 进行索引2.3 常用的 Processor 三、实际应用场景3.1 日志数据处理3.2 数据清洗和标准化3.3 数据增强 四、最佳实践4.1 性能优化4.2 错误处理4…

Java面试题:Redis为什么速度快

Redis为什么速度快 Redis是纯内存操作 采用单线程,避免不必要的上下文切换可竞争条件 多线程还要考虑线程的安全问题 使用I/O多路复用模型,非阻塞IO I/O多路复用模型 因为Redis是纯内存操作,执行速度非常快,性能的瓶颈是网络延迟而非执行速度 I/O多路复用模型主要就是实…

全球视角下的网络安全法规

在全球范围内&#xff0c;网络安全法规的发展已成为各国政府关注的焦点。随着互联网的快速发展和信息技术的广泛应用&#xff0c;网络安全问题日益凸显&#xff0c;为此&#xff0c;各国纷纷出台了相应的网络安全法律法规&#xff0c;以应对不断演变的网络威胁并维护网络空间的…

Fusion WAN:企业出海与全球组网的数字网络底座

众多中国企业与品牌正将目光投向海外市场&#xff0c;积极寻求发展新机遇&#xff0c;并且在这一过程中取得了显著的成果。"出海"战略已经成为一些企业转型升级的关键选择。 随着国内市场的竞争日益激烈&#xff0c;越来越多的企业开始寻求海外市场的拓展&#xff0c…

@NestedConfigurationProperty注解嵌入配置类不生效

问题 在SmsProperties中嵌入AliyunSmsProperties&#xff0c;在代码中通过SmsProperties读取AliyunSmsProperties的配置为null导致无法启动。两个配置类如下&#xff1a; Data ConfigurationProperties(prefix "sms") public class SmsProperties {NestedConfigur…

11年之约 聚焦上海 | 亚信科技邀您相约2024 MWC上海展

关于亚信安慧AntDB数据库 AntDB数据库始于2008年&#xff0c;在运营商的核心系统上&#xff0c;服务国内24个省市自治区的数亿用户&#xff0c;具备高性能、弹性扩展、高可靠等产品特性&#xff0c;峰值每秒可处理百万笔通信核心交易&#xff0c;保障系统持续稳定运行超十年&a…

深入理解PHP命名空间

在PHP项目中&#xff0c;命名空间&#xff08;namespace&#xff09;是一个非常重要的特性。它不仅帮助开发者组织代码&#xff0c;还能避免类、函数、常量等命名冲突问题。本文将详细介绍PHP命名空间的概念、使用方法和最佳实践。 一、什么是命名空间&#xff1f; 命名空间…

淘客返利平台的前端架构与优化

淘客返利平台的前端架构与优化 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01; 在当前互联网时代&#xff0c;淘客返利平台已经成为电商生态的重要组成部分。为…

windows@局域网或蓝牙文件传输@共享文件夹@就近共享

文章目录 windows系统下的简单共享文件方案&#x1f47a;就近共享设置共享文件夹(推荐)方法1:使用shrpubw程序引导创建方法2:使用图形界面创建右键设置共享文件夹 查看所有已经共享的文件夹&#x1f47a;停止某个文件的共享 共享文件夹的访问控制补充匿名访问问题&#x1f60a;…

10个国内免费AI绘画网站汇总【2024最新】

迎战MidJourney和Stable Diffusion&#xff1a;10款国产AI绘画神器&#xff0c;让你轻松创作出超凡艺术品&#xff01;不论你是初学者还是资深艺术家&#xff0c;这些AI绘画平台都能帮你轻松入门。快来探索这些AI绘画网站&#xff0c;释放你的创意潜能&#xff01; 1、AI绘画创…

MapStruct参数拷贝

我们先看看前面的部分代码 Override public UserDto getUserById(Integer userId) {User user userDaoService.getById(userId);UserDto userDto new UserDto();BeanUtils.copyProperties(user, userDto);return userDto; } 我们上面代码里面可以看到&#xff0c;处理参数和…

【Android】AppCompatSeekBar只扩大触摸区域而外观不变

实现方案&#xff1a; 首先&#xff0c;SeekBar布局如下&#xff0c;不直接调整SeekBar的尺寸&#xff0c;而是为其添加一个包裹的FrameLayout作为透明覆盖层。 <FrameLayoutandroid:id"id/touch_overlay"android:layout_width"wrap_content" <!--…

flex属性中的flex-grow、flex-shrink、flex-basis

flex-grow 属性 flex-grow 属性用于设置或检索弹性盒子的扩展比率。 默认值为0&#xff0c;表示不伸展。 flex-grow属性值为0时&#xff0c;不伸展&#xff1a; <!doctype html> <html lang"en"><head><style>.d-flex {display: flex;width…

python学习 - 设计模式 - 组合模式

组合模式 Composite , 将对象组组合成树形结构以表示’部分-整体’ 的层次结构.组合模式使得用户对单个对象的组合对象的使用具有一致性 #!/usr/bin/python # -*- coding:UTF-8 -*- # File : d1.py # Software: PyCharm""" 组合模式 Composite , 将对象组组…

C语言——链表专题

乐观学习&#xff0c;乐观生活&#xff0c;才能不断前进啊&#xff01;&#xff01;&#xff01; 我的主页&#xff1a;optimistic_chen 我的专栏&#xff1a;c语言 点击主页&#xff1a;optimistic_chen和专栏&#xff1a;c语言&#xff0c; 创作不易&#xff0c;大佬们点赞鼓…

IP地址定位技术的广泛应用

IP地址定位技术是一种通过分析网络设备所使用的IP地址来确定其地理位置的地址技术手段。 IP地址定位技术基于互联网服务提供商&#xff08;ISP&#xff09;所分配的IP地址范围以及相关的地理信息数据库。当一个设备连接到网络并使用特定的IP地址进行通信时&#xff0c;IP地址定…

mac安装opencv并在vscode中配置c++环境调试推理YOLOv8网络模型

OpenCV(Open Source Computer Vision Library)是一个开源的计算机视觉库,提供了丰富的图像处理和计算机视觉算法。它支持多平台(包括 Windows、Linux、macOS)和多种编程语言(如 C++、Python、Java),使其成为研究、开发和部署计算机视觉应用的重要工具之一。 步骤 1: 创…

上海慢病管理app开发的意义及功能

近年来&#xff0c;随着经济与科技的不断发展&#xff0c;人们对慢性疾病的重视程度也不断提高。大家不再满足于周期较长的定期检查&#xff0c;而是渴求能够进行短期、实时的病情预防与监测&#xff0c;为了满足人们的需求&#xff0c;帮助大家更好的干预病情&#xff0c;上海…

Linux内核 -- 汇编结合ko案例之PMU获取周期技术

ARMv7汇编实现周期计数读取与清空 本文档详细描述了如何在ARMv7平台上使用汇编语言编写周期计数器读取与清空函数&#xff0c;如何在内核模块中导出这些函数供其他模块调用&#xff0c;以及如何使用Netlink接口供用户态程序进行调用。 1. 汇编函数实现 首先&#xff0c;编写…

Java OA系统邮件管理模块

## 使用Spring Boot和Hibernate开发OA系统邮件管理模块 使用Spring Boot和Hibernate开发一个OA系统的邮件管理模块。该模块将支持邮件发送、接收、存储、查找、分类、标签管理&#xff0c;以及附件的上传和接收。前端部分使用Thymeleaf模板引擎&#xff0c;数据库选择MySQL。 …