【Jsp】第三课 Servlet常用对象(综合案例)

2024-05-11 17:18

本文主要是介绍【Jsp】第三课 Servlet常用对象(综合案例),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

概述

本次文章基于第三章的ServletConfig,ServletContext,HttpServletRequest,HttpServletResponse对象完成一个图书订阅系统的购买图书和查看图书购买记录功能。

搭建项目主页面

创建一个动态网站项目,在src中新建包com.book.servlet.

在包中,新建HomeServlet作为主页。效果图如下:

为了让一访问项目根路径地址就默认进入HomeServlet,这里需要将 HomeServlet的虚拟地址写入web.xml文件中作为默认的首页地址。

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1"><display-name>Day07Jsp</display-name><welcome-file-list><welcome-file>HomeServlet</welcome-file></welcome-file-list>
</web-app>

HomeServlet中要完成超链接的显示,这里需要在该Servlet中定义两个静态数据,使用java注解的方式进行定义,代码如下:

package com.book.servlet;import java.io.IOException;
import java.io.PrintWriter;import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebInitParam;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;/*** Servlet implementation class HomeServlet*/
@WebServlet(urlPatterns = "/HomeServlet",
initParams = {@WebInitParam(name = "buy",value = "购买图书"),@WebInitParam(name = "selectOrder",value = "查看订单")
})
public class HomeServlet extends HttpServlet {private static final long serialVersionUID = 1L;/*** @see HttpServlet#HttpServlet()*/public HomeServlet() {super();// TODO Auto-generated constructor stub}/*** @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)*/protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {}/*** @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)*/protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {// TODO Auto-generated method stubdoGet(request, response);}}

然后在类中的空白处,重写init方法,用于加载两个静态数据,因这两个静态数据需要在其他方法中被使用,因此定义成全局变量。代码如下:

再重写init方法,并通过两个静态数据,存储至全局变量。

@Overridepublic void init(ServletConfig config) throws ServletException {buy=config.getInitParameter("buy");selectOrder=config.getInitParameter("selectOrder");}

 因浏览器访问服务器默认使用Get请求,这里我们在diGet方法中编写两个超链接发送给浏览器上显示:

/*** @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)*/protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//当浏览器访问该Servlet的时候,servlet将静态数据发给浏览器显示response.setContentType("text/html");response.setCharacterEncoding("UTF-8");PrintWriter pw=response.getWriter();pw.append("<div align='center'>");pw.append("<a href=''>"+buy+"</a>&nbsp;");pw.append("<a href=''>"+selectOrder+"</a>&nbsp;");pw.append("</div>");}

这里运行以后,可看到以上的效果图所示的页面。

定义图书实体类

因为我们需要展示多本图书供用户进行购买,而每一本图书都需要包含,书名,作者,单价,出版社,购买时间等等数据,因此为采用定义实体类的方式用于分别存储每一本书的这些数据信息。

接着我们在src文件夹中定义包com.book.entity,用于存储创建的所有实体类,点右键新建class类,类名为Book,在Book中定义五个全局变量用于存储以上五个信息,并对其进行数据封装,代码如下:

package com.book.entity;
/*** 图书的实体类* @author teacher*	2021/10/14*/
public class Book {//java类的封装private String bookName;//书名private String author;//作者private String price;//单价private String address;//出版社private String buyTime;//购买时间public String getBookName() {return bookName;}public void setBookName(String bookName) {this.bookName = bookName;}public String getAuthor() {return author;}public void setAuthor(String author) {this.author = author;}public String getPrice() {return price;}public void setPrice(String price) {this.price = price;}public String getAddress() {return address;}public void setAddress(String address) {this.address = address;}public String getBuyTime() {return buyTime;}public void setBuyTime(String buyTime) {this.buyTime = buyTime;}//生成所有变量的get和set方法//构造方法的作用://1.用于创建这个类的对象//2.用于快速给变量进行赋值//生成无参构造方法public Book() {// TODO Auto-generated constructor stub}//生成有参构造方法public Book(String bookName, String author, String price, String address, String buyTime) {super();this.bookName = bookName;this.author = author;this.price = price;this.address = address;this.buyTime = buyTime;}@Overridepublic String toString() {return "Book [bookName=" + bookName + ", author=" + author + ", price=" + price + ", address=" + address+ ", buyTime=" + buyTime + "]";}//生成toString方法,为了在做功能的时候,//查看检查这个对象中是否有数据}

定义临时图书库工具类

这里我们使用List集合临时将多本图书信息存储起来,用于显示在页面上供用户进行购买,这里我们在src文件夹中新建包com.book.util,在包中新建类BookDBUtil,在类中定义方法,创建多本图书信息,并将多本图书存储至List集合,代码如下:

package com.book.util;
/*** 图书信息的工具类* @author teahcer*	2021/10/14*用于临时存储一些图书信息*/import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;import com.book.entity.Book;public class BookDataUtil {//定义方法,用于存储多本书的信息public List<Book> getBooks(){Book book1=new Book("Java编程思想", "马云", "120.0元", "人民邮电出版社", "");Book book2=new Book("MySQL数据库教程", "任正非", "89.0元", "清华大学出版社", "");Book book3=new Book("Java疯狂讲义", "马化腾", "108.0元", "电子工业出版社", "");Book book4=new Book("Python爬虫技术", "李彦宏", "66.0元", "新华出版社", "");Book book5=new Book("C语言从入门到放弃", "李云龙", "56.0元", "江西出版社", "");//创建List用于存储以上五本书List<Book> oBooks=new ArrayList<Book>();oBooks.add(book1);oBooks.add(book2);oBooks.add(book3);oBooks.add(book4);oBooks.add(book5);return oBooks;}//获得当前实时时间public static String getNowTime() {//获得的现在实时时间是毫秒计算的Date date=new Date();//简单日期格式类  2021年10月20 日  13:55:30SimpleDateFormat sdf=new SimpleDateFormat("yyyy年MM月dd日  HH:mm:ss");//按照设定的格式进行格式化String time=sdf.format(date);return time;}
}

创建图书信息列表页面供用户购买图书

即多本图书已准备好,这里需要创建Servlet完成图书信息列表页面,类名为ShowBookInfoServlet,这里我们需要先从工具类中获得所有图书信息,并将该图书已表格的形式发送给浏览器上显示出来,其代码如下:

package com.book.servlet;import java.io.IOException;
import java.io.PrintWriter;
import java.util.List;import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;import com.book.entity.Book;
import com.book.util.BookDataUtil;/*** Servlet implementation class ShowBookInfoServlet*/
@WebServlet("/ShowBookInfoServlet")
public class ShowBookInfoServlet extends HttpServlet {private static final long serialVersionUID = 1L;/*** @see HttpServlet#HttpServlet()*/public ShowBookInfoServlet() {super();// TODO Auto-generated constructor stub}/*** @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)*/protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//获得所有图书信息BookDataUtil util=new BookDataUtil();List<Book> oBooks=util.getBooks();response.setContentType("text/html");response.setCharacterEncoding("UTF-8");PrintWriter pw=response.getWriter();pw.append("<div align='center'>");pw.append("<table border='1' style='width:800px;text-align:center;'>");//写标题pw.append("<tr>");pw.append("<td>书名</td>");pw.append("<td>作者</td>");pw.append("<td>单价</td>");pw.append("<td>出版社</td>");pw.append("<td>操作</td>");pw.append("</tr>");for (int i=0;i<oBooks.size();i++) {pw.append("<tr>");pw.append("<td>"+oBooks.get(i).getBookName()+"</td>");pw.append("<td>"+oBooks.get(i).getAuthor()+"</td>");pw.append("<td>"+oBooks.get(i).getPrice()+"</td>");pw.append("<td>"+oBooks.get(i).getAddress()+"</td>");pw.append("<td><a href='BuyBookServlet?index="+i+"'><input type='button' "+ "style='background-color:green;' "+ "value='购买'></a></td>");pw.append("</tr>");}pw.append("</table>");pw.append("</div>");}/*** @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)*/protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {// TODO Auto-generated method stubdoGet(request, response);}}

并在HomeServlet的首页的购买图书的超链接上添加图书信息列表页面的虚拟地址。

其运行后,点击购买图书即课跳转至图书信息列表页面,效果如下:

完成存储用户购买的图书记录信息

当用户点击任意一本图书进行购买的时候,这里我们采取发送给图书的下标给服务器的方式,能尽快的获取用户要购买的图书信息,这里新建一个Servlet类,类名为BuyBookServlet,用于接收用户将要购买的图书的下标,并查找出该图书,并通过方法获得当前购买图书的下单的实时时间,存储至该购买的图书中,然后将该图书存储至List集合,因为用户可能会购买多本图书,最后将所哟购买的图书记录信息存储至ServletContext对象中。

package com.book.servlet;import java.io.IOException;
import java.util.ArrayList;
import java.util.List;import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;import com.book.entity.Book;
import com.book.util.BookDataUtil;/*** Servlet implementation class BuyBookServlet*/
@WebServlet("/BuyBookServlet")
public class BuyBookServlet extends HttpServlet {private static final long serialVersionUID = 1L;/*** @see HttpServlet#HttpServlet()*/public BuyBookServlet() {super();// TODO Auto-generated constructor stub}/*** @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)*/protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//获得用于点击购买按钮发送过来的请求//获得浏览器发送过来的图书的下标String index=request.getParameter("index");//将接收的字符串类型转换成int类型int i=Integer.parseInt(index);//根据用户发送过来的下标,去查找用户将要购买的书籍List<Book> oBooks=new BookDataUtil().getBooks();Book book=oBooks.get(i);//当用户购买图书的时候,需要获得当前实时时间book.setBuyTime(BookDataUtil.getNowTime());//获得ServletContext对象ServletContext sc=getServletContext();//判断ServletContext是否存在List集合Object object=sc.getAttribute("orders");List<Book> oList=null;if (object==null) {//说明以前从来没有购买过书oList=new ArrayList<Book>();oList.add(book);}else {//以前有购买书,只需要拿到List集合继续添加购买记录即可//不需要重新创建List集合oList=(List<Book>) object;oList.add(book);}//保存完购买记录,之后存储至ServletContext对象sc.setAttribute("orders", oList);//购买成功之后,跳转至提示页面//使用请求转发跳转,因为请求转发可以携带数据跳转页面request.setAttribute("book", book);request.getRequestDispatcher("AlertServlet").forward(request, response);}/*** @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)*/protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {// TODO Auto-generated method stubdoGet(request, response);}}

 创建提示信息页面

在图书记录信息存储后,需要提示用户购买的图书下单完成,是否需要继续购买的提示,这里新建一个Servlet类,类名为:AlertServlet

package com.book.servlet;import java.io.IOException;
import java.io.PrintWriter;import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;import com.book.entity.Book;/*** Servlet implementation class AlertServlet*/
@WebServlet("/AlertServlet")
public class AlertServlet extends HttpServlet {private static final long serialVersionUID = 1L;/*** @see HttpServlet#HttpServlet()*/public AlertServlet() {super();// TODO Auto-generated constructor stub}/*** @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)*/protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {Book book=(Book) request.getAttribute("book");String info="您的《"+book.getBookName()+"》购买成功,"+ "如果继续购买请<a href='ShowBookInfoServlet'>点击这里</a>,"+ "或者5秒之后自动跳回首页";response.setHeader("refresh", "5;url=HomeServlet");response.setContentType("text/html");response.setCharacterEncoding("UTF-8");PrintWriter pw=response.getWriter();pw.print(info);}/*** @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)*/protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {// TODO Auto-generated method stubdoGet(request, response);}}

效果如下:

完成查看图书记录信息列表页面

用户在购买完图书信息之后,需要查看当前购买的所有图书的记录信息,这里我们新建Servlet类,类名为:SelectOrderServlet,从ServletContext类中获得所有的图书记录信息,展示在表格上,并需要判断是否有购买图书记录信息,其代码如下:

package com.book.servlet;import java.io.IOException;
import java.io.PrintWriter;
import java.util.List;import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;import com.book.entity.Book;/*** Servlet implementation class SelectOrderServlet*/
@WebServlet("/SelectOrderServlet")
public class SelectOrderServlet extends HttpServlet {private static final long serialVersionUID = 1L;/*** @see HttpServlet#HttpServlet()*/public SelectOrderServlet() {super();// TODO Auto-generated constructor stub}/*** @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)*/protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//因为用户购买的图书信息被存储在ServletContext对象中//要展示用户的购买记录,需要先获得ServletContext对象ServletContext sc=getServletContext();//从该对象中获得存储图书记录的List集合Object object=sc.getAttribute("orders");response.setContentType("text/html");response.setCharacterEncoding("UTF-8");PrintWriter pw=response.getWriter();List<Book> oBooks=null;if (object!=null) {oBooks=(List<Book>) object;pw.append("<div align='center'>");pw.append("<table border='1' style='width:800px;text-align:center;'>");//写标题pw.append("<tr>");pw.append("<td>书名</td>");pw.append("<td>作者</td>");pw.append("<td>单价</td>");pw.append("<td>出版社</td>");pw.append("<td>购买时间</td>");pw.append("</tr>");for (int i=0;i<oBooks.size();i++) {pw.append("<tr>");pw.append("<td>"+oBooks.get(i).getBookName()+"</td>");pw.append("<td>"+oBooks.get(i).getAuthor()+"</td>");pw.append("<td>"+oBooks.get(i).getPrice()+"</td>");pw.append("<td>"+oBooks.get(i).getAddress()+"</td>");pw.append("<td>"+oBooks.get(i).getBuyTime()+"</td>");pw.append("</tr>");}pw.append("</table>");pw.append("</div>");}else {pw.print("当前还没有购买图书的记录,请先购买再查看!!!");}}/*** @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)*/protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {// TODO Auto-generated method stubdoGet(request, response);}}

并把给Servlet的虚拟地址添加至主页面的第二个超链接上,

其运行的效果如下:

本次文章就到这里,初学者可根据代码完成以上功能,可自行扩展修改图书信息以及删除购买记录的功能等等。 

这篇关于【Jsp】第三课 Servlet常用对象(综合案例)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/980161

相关文章

HarmonyOS学习(七)——UI(五)常用布局总结

自适应布局 1.1、线性布局(LinearLayout) 通过线性容器Row和Column实现线性布局。Column容器内的子组件按照垂直方向排列,Row组件中的子组件按照水平方向排列。 属性说明space通过space参数设置主轴上子组件的间距,达到各子组件在排列上的等间距效果alignItems设置子组件在交叉轴上的对齐方式,且在各类尺寸屏幕上表现一致,其中交叉轴为垂直时,取值为Vert

JS常用组件收集

收集了一些平时遇到的前端比较优秀的组件,方便以后开发的时候查找!!! 函数工具: Lodash 页面固定: stickUp、jQuery.Pin 轮播: unslider、swiper 开关: switch 复选框: icheck 气泡: grumble 隐藏元素: Headroom

Hadoop企业开发案例调优场景

需求 (1)需求:从1G数据中,统计每个单词出现次数。服务器3台,每台配置4G内存,4核CPU,4线程。 (2)需求分析: 1G / 128m = 8个MapTask;1个ReduceTask;1个mrAppMaster 平均每个节点运行10个 / 3台 ≈ 3个任务(4    3    3) HDFS参数调优 (1)修改:hadoop-env.sh export HDFS_NAMENOD

性能分析之MySQL索引实战案例

文章目录 一、前言二、准备三、MySQL索引优化四、MySQL 索引知识回顾五、总结 一、前言 在上一讲性能工具之 JProfiler 简单登录案例分析实战中已经发现SQL没有建立索引问题,本文将一起从代码层去分析为什么没有建立索引? 开源ERP项目地址:https://gitee.com/jishenghua/JSH_ERP 二、准备 打开IDEA找到登录请求资源路径位置

深入探索协同过滤:从原理到推荐模块案例

文章目录 前言一、协同过滤1. 基于用户的协同过滤(UserCF)2. 基于物品的协同过滤(ItemCF)3. 相似度计算方法 二、相似度计算方法1. 欧氏距离2. 皮尔逊相关系数3. 杰卡德相似系数4. 余弦相似度 三、推荐模块案例1.基于文章的协同过滤推荐功能2.基于用户的协同过滤推荐功能 前言     在信息过载的时代,推荐系统成为连接用户与内容的桥梁。本文聚焦于

综合安防管理平台LntonAIServer视频监控汇聚抖动检测算法优势

LntonAIServer视频质量诊断功能中的抖动检测是一个专门针对视频稳定性进行分析的功能。抖动通常是指视频帧之间的不必要运动,这种运动可能是由于摄像机的移动、传输中的错误或编解码问题导致的。抖动检测对于确保视频内容的平滑性和观看体验至关重要。 优势 1. 提高图像质量 - 清晰度提升:减少抖动,提高图像的清晰度和细节表现力,使得监控画面更加真实可信。 - 细节增强:在低光条件下,抖

【C++】_list常用方法解析及模拟实现

相信自己的力量,只要对自己始终保持信心,尽自己最大努力去完成任何事,就算事情最终结果是失败了,努力了也不留遗憾。💓💓💓 目录   ✨说在前面 🍋知识点一:什么是list? •🌰1.list的定义 •🌰2.list的基本特性 •🌰3.常用接口介绍 🍋知识点二:list常用接口 •🌰1.默认成员函数 🔥构造函数(⭐) 🔥析构函数 •🌰2.list对象

常用的jdk下载地址

jdk下载地址 安装方式可以看之前的博客: mac安装jdk oracle 版本:https://www.oracle.com/java/technologies/downloads/ Eclipse Temurin版本:https://adoptium.net/zh-CN/temurin/releases/ 阿里版本: github:https://github.com/

30常用 Maven 命令

Maven 是一个强大的项目管理和构建工具,它广泛用于 Java 项目的依赖管理、构建流程和插件集成。Maven 的命令行工具提供了大量的命令来帮助开发人员管理项目的生命周期、依赖和插件。以下是 常用 Maven 命令的使用场景及其详细解释。 1. mvn clean 使用场景:清理项目的生成目录,通常用于删除项目中自动生成的文件(如 target/ 目录)。共性规律:清理操作

【区块链 + 人才服务】可信教育区块链治理系统 | FISCO BCOS应用案例

伴随着区块链技术的不断完善,其在教育信息化中的应用也在持续发展。利用区块链数据共识、不可篡改的特性, 将与教育相关的数据要素在区块链上进行存证确权,在确保数据可信的前提下,促进教育的公平、透明、开放,为教育教学质量提升赋能,实现教育数据的安全共享、高等教育体系的智慧治理。 可信教育区块链治理系统的顶层治理架构由教育部、高校、企业、学生等多方角色共同参与建设、维护,支撑教育资源共享、教学质量评估、