Java自学第11课:电商项目(4)重新建立项目

经过前几节的学习,我们已经找到之前碰到的问题的原因了。那么下面接着做项目学习。

1 新建dynamic web project

建立时把web.xml也生成下,省的右面再添加。

会询问是否改为java ee环境?no就行,其实改过来也是可以的。这个不重要。

新建完毕后,看下当前的web.xml

欢迎界面不需要,删除即可。

2 流程图

我们开始写代码之前,还是重点关注下这个逻辑流程图,之前编程序都没注意这个,所以才发生错误不知道怎么回事。

web.xml很重要,这里配置了这个工程的入口。我们这个程序实际上是一个servlet程序,前端配合jsp网页展示。所以,入口就是规定servlet的名称及url。当部署在服务器后,我们的页面首先要访问servlet,之后拦截请求后,处理请求并获取参数,之后再传给前端的jsp网页去呈现。

在编写代码时,可以先写servlet,也可以先配置web.xml,也可以先写jsp文件,从逻辑上将,我们先去配置servlet的web.xml更好。

3 配置servlet

这里主要是配置servlet信息,如下:

<?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_4_0.xsd" id="WebApp_ID" version="4.0"><display-name>eb1</display-name>
<servlet><servlet-name>index</servlet-name><servlet-class>com.xxx.xx</servlet-class>
</servlet>
<servlet-mapping><servlet-name>index</servlet-name><url-pattern>/index</url-pattern>
</servlet-mapping>
</web-app>

主要是servlet及其mapping,然后各有两个项。

其中名称需要一致,类就指向之后要新建的类。然后url也可以随便指定,部署后就从这里进入。

4 引入类库

这些类库都是配置好的,直接放入lib即可。放入后,所有类库需要buildpath,项目会自动加入reference libraries.

5 创建实体类

实体类根据数据库的表来创建。对于导航栏,有两个表需要用到:大类表和标签表。

实体类可放入vo包里。由于大类型包含小类型,所以小类型也得建类。

下面是具体实现:

tagl类:

package com.xx.vo;
/***  标签类**/
public class Tag {private int id;private String name;private String url;public Tag() {// TODO Auto-generated constructor stub}public Tag(int id, String name, String url) {super();this.id = id;this.name = name;this.url = url;}public int getId() {return id;}public void setId(int id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getUrl() {return url;}public void setUrl(String url) {this.url = url;}@Overridepublic String toString() {return "Tag [id=" + id + ", name=" + name + ", url=" + url + "]";}}

bigtype类

package com.xx.vo;import java.util.ArrayList;
import java.util.List;public class ProductBigType {private int id;private String name;private String remarks;private List<ProductSmallType> smallTypeList = new ArrayList<ProductSmallType>();public ProductBigType() {// TODO Auto-generated constructor stub}public ProductBigType(int id, String name, String remarks, List<ProductSmallType> smallTypeList) {super();this.id = id;this.name = name;this.remarks = remarks;this.smallTypeList = smallTypeList;}public int getId() {return id;}public void setId(int id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getRemarks() {return remarks;}public void setRemarks(String remarks) {this.remarks = remarks;}public List<ProductSmallType> getSmallTypeList() {return smallTypeList;}public void setSmallTypeList(List<ProductSmallType> smallTypeList) {this.smallTypeList = smallTypeList;}@Overridepublic String toString() {return "ProductBigType [id=" + id + ", name=" + name + ", remarks=" + remarks + ", smallTypeList="+ smallTypeList + "]";}}

smalltype类

package com.xx.vo;public class ProductSmallType {private int id;private String name;private String remarks;private int bigTypeId;public ProductSmallType() {// TODO Auto-generated constructor stub}public ProductSmallType(int id, String name, String remarks, int bigTypeId) {super();this.id = id;this.name = name;this.remarks = remarks;this.bigTypeId = bigTypeId;}public int getId() {return id;}public void setId(int id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getRemarks() {return remarks;}public void setRemarks(String remarks) {this.remarks = remarks;}public int getBigTypeId() {return bigTypeId;}public void setBigTypeId(int bigTypeId) {this.bigTypeId = bigTypeId;}@Overridepublic String toString() {return "ProductSmallType [id=" + id + ", name=" + name + ", remarks=" + remarks + ", bigTypeId=" + bigTypeId+ "]";}}

其中,大类里用到了List和ArrayList,需要引导util包。

6 创建数据库交互类

数据库交互主要是连接,关闭数据库,需要做成静态的,这样就一直存在。

DBUtil类

package com.xx.util;import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;/*** 数据库交互类**/
public class DBUtil {// 主方法 用于测试public static void main(String[] args) {try {DBUtil.getConn();System.out.println("conn ok...");} catch (Exception e) {System.out.println("conn error...");e.printStackTrace();}}// 加载驱动static {try {Class.forName("com.mysql.jdbc.Driver"); // 反射机制加载驱动} catch (ClassNotFoundException e) {System.out.println("error in forName...");e.printStackTrace();}}// 获取连接public static Connection getConn() {Connection conn = null;try {conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/ebuys?useUnicode=true&characterEncoding=utf8","root","1234");} catch (SQLException e) {System.out.println("error in DriverManager");e.printStackTrace();}return conn;}// 完整关闭public static void closeAll(Connection conn, PreparedStatement pstmt, ResultSet rs) {closeResult(rs);closeState(pstmt);closeConn(conn);}// 关闭连接private static void closeConn(Connection conn) {if(null != conn) {try {conn.close();} catch (SQLException e) {System.out.println("error in close...");e.printStackTrace();}}}// 关闭管道private static void closeState(PreparedStatement pstmt) {if(null != pstmt) {try {pstmt.close();} catch (SQLException e) {System.out.println("error in pstmt...");e.printStackTrace();}}}// 关闭结果private static void closeResult(ResultSet rs) {if(null != rs) {try {rs.close();} catch (SQLException e) {System.out.println("error in rs...");e.printStackTrace();}}}}

这里可以用main主方法来测试下是否能够连接,注意这些都是需要类库支持的,要是忘记引入,会发生错误。

7 创建servlet

现在来编写刚才web.xml规定的servlet,作用是将数据库内的信息传入页面。这里需要进行间接的数据库操作。

package com.xx.controller;import java.io.IOException;
import java.util.List;import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;import com.xx.service.ProductBigTypeService;
import com.xx.service.TagService;
import com.xx.service.impl.ProductBigTypeServiceImpl;
import com.xx.service.impl.TagServiceImpl;
import com.xx.vo.ProductBigType;
import com.xx.vo.Tag;public class InitController extends HttpServlet {private static final long serialVersionUID = 1L;// 通过接口及其实例化来降低耦合度 让程序容易拓展private ProductBigTypeService bigTypeService = new ProductBigTypeServiceImpl();private TagService tagService = new TagServiceImpl();@Overrideprotected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {// 查询类别List<ProductBigType> bigTypeList = bigTypeService.findAllBigType();// 查询标签List<Tag> tagList = tagService.findAll();// 查询结果放入作用域req.setAttribute("bigTypeList", bigTypeList);req.setAttribute("tagLiat", tagList);//req.getRequestDispatcher("/index.jsp").forward(req, resp);}}

这个类的思路是重写service来处理请求,并转发到index.jsp。处理过程用到了大类列表和标签列表,这就涉及到查询,这个查询是封装在服务的方法里的。

这里涉及的概念较多,服务被写为了接口,也就是可以理解为纯虚函数。具体在impl里实现方法。

大类列表是通过大类服务的获取大类方法实现的,标签列表是通过标签服务的获取标签方法实现的。两者思路是相同的,需要具体实现。

实现的过程中,大类还包括了小类,因此也需要相应的实现小类的服务和方法。

标签的较为简单,是单层的,先看标签的接口

package com.xx.service;import java.util.List;import com.xx.vo.Tag;public interface TagService {// 查询标签List<Tag> findAll();
}

其实现是

package com.xx.service.impl;import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;import com.xx.service.TagService;
import com.xx.util.DBUtil;
import com.xx.vo.Tag;public class TagServiceImpl implements TagService {@Overridepublic List<Tag> findAll() {List<Tag> list = new ArrayList<Tag>();Connection conn = null;PreparedStatement pstmt = null;ResultSet rs = null;try {conn = DBUtil.getConn();String sql = "SELECT * FROM T_TAG";pstmt = conn.prepareStatement(sql);rs = pstmt.executeQuery();while(rs.next()) {Tag tag = new Tag();tag.setId(rs.getInt("id"));tag.setName(rs.getString("name"));tag.setUrl(rs.getString("url"));list.add(tag);}return list;} catch (SQLException e) {System.out.println("error in tagServiceImpl...");e.printStackTrace();} finally {DBUtil.closeAll(conn, pstmt, rs);}return null;}}

再来看大类接口

package com.xx.service;import java.util.List;import com.xx.vo.ProductBigType;public interface ProductBigTypeService {// 查询大类信息List<ProductBigType> findAllBigType();
}

其实现为

package com.xx.service.impl;import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;import com.xx.service.ProductBigTypeService;
import com.xx.service.ProductSmallTypeService;
import com.xx.util.DBUtil;
import com.xx.vo.ProductBigType;
import com.xx.vo.ProductSmallType;public class ProductBigTypeServiceImpl implements ProductBigTypeService {private ProductSmallTypeService smallTypeService = new ProductSmallTypeServiceImpl();@Overridepublic List<ProductBigType> findAllBigType() {List<ProductBigType> list = new ArrayList<ProductBigType>();Connection conn = null;PreparedStatement pstmt = null;ResultSet rs = null;try {conn = DBUtil.getConn();String sql = "SELECT * FROM T_BIGTYPE";pstmt = conn.prepareStatement(sql);rs = pstmt.executeQuery();while(rs.next()) {ProductBigType pbt = new ProductBigType();pbt.setId(rs.getInt("id"));pbt.setName(rs.getString("name"));pbt.setRemarks(rs.getString("remarks"));List<ProductSmallType> pst = smallTypeService.findByBigTypeId(rs.getInt("id"));pbt.setSmallTypeList(pst);list.add(pbt);}return list;} catch (SQLException e) {System.out.println("error in bigTypeServiceImpl...");e.printStackTrace();} finally {DBUtil.closeAll(conn, pstmt, rs);}return null;}}

在组合列表时,用到了小类接口,这里需要传入大类的id

package com.xx.service;import java.util.List;import com.xx.vo.ProductSmallType;public interface ProductSmallTypeService {// 查询当前大类id对应的所有小类List<ProductSmallType> findByBigTypeId(int bigTypeId);
}

对应的实现是

package com.xx.service.impl;import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;import com.xx.service.ProductSmallTypeService;
import com.xx.util.DBUtil;
import com.xx.vo.ProductSmallType;public class ProductSmallTypeServiceImpl implements ProductSmallTypeService {@Overridepublic List<ProductSmallType> findByBigTypeId(int bigTypeId) {List<ProductSmallType> list = new ArrayList<ProductSmallType>();Connection conn = null;PreparedStatement pstmt = null;ResultSet rs = null;try {		conn = DBUtil.getConn();String sql = "SELECT * FROM T_SMALLTYPE WHERE BIGTYPEID = ?";pstmt = conn.prepareStatement(sql);pstmt.setInt(1, bigTypeId);rs = pstmt.executeQuery();while(rs.next()) {ProductSmallType pst = new ProductSmallType();pst.setId(rs.getInt("id"));pst.setName(rs.getString("name"));pst.setRemarks(rs.getString("remarks"));pst.setBigTypeId(bigTypeId);list.add(pst);}return list;} catch (SQLException e) {System.out.println("error in ProductSmallTypeServiceImpl...");e.printStackTrace();} finally {DBUtil.closeAll(conn, pstmt, rs);}return null;}}

这里用到个知识点,就是怎么用通配符写sql语句。

8 写index.jsp

接下来,就可以写jsp了。首先引入css和图片资源,之后新建index.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>eb1</title>
<link rel="stylesheet" type="text/css" href="css/style.css">
</head>
<body><div id="header" class="wrap"><jsp:include page="common/top.jsp"/></div><div id="footer"><jsp:include page="common/footer.jsp"/></div>
</body>
</html>

这里用到了jsp里的include指令。分别指向top和footer,先来看footer

<%@ page language="java" contentType="text/html; charset=UTF-8"pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>Copyright &copy; 2019 xx inc. All rights reserved.
</body>
</html>

再来看top,使用div来构建出导航栏。

<%@ page language="java" contentType="text/html; charset=UTF-8"pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<link rel="stylesheet" type="text/css" href="css/style.css">
</head>
<body><div id="logo"><img src="images/logo.gif" /></div><div class="help"></div><div class="navbar"><ul class="clearfix"><li class="current"><a href="index">首页</a></li><c:forEach items="${bigTypeList}" var="bType"><li><a href="productServlet?oper=productType&id=${bType.id}">${bType.name}</a></li></c:forEach></ul></div>
</body>
</html>

这里先实现了主导航栏,用了c:foreach的写法。

8 效果展示

下面看下实现效果,使用tomcat部署,打开网页:

也就是说前面写的都是正确的。今天的课程就到这里,接下来接着完善jsp页面和servlet类。

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

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

相关文章

基于springboot实现福聚苑社区团购平台系统项目【项目源码】

基于springboot实现福聚苑社区团购平台系统演示 Javar技术 Java是一种网络脚本语言&#xff0c;广泛运用于web应用开发&#xff0c;可以用来添加网页的格式动态效果&#xff0c;该语言不用进行预编译就直接运行&#xff0c;可以直接嵌入HTML语言中&#xff0c;写成js语言&…

【KVM-4】硬件虚拟化技术(详)

前言 大家好&#xff0c;我是秋意零。 经过前面章节的介绍&#xff0c;已经知道KVM虚拟化必须依赖于硬件辅助的虚拟化技术&#xff0c;本节就来介绍一下硬件虚拟化技术。 &#x1f47f; 简介 &#x1f3e0; 个人主页&#xff1a; 秋意零&#x1f525; 账号&#xff1a;全平…

从替代走向引领,永洪科技迈向全球化

对于数据分析领域而言&#xff0c;这是一个最好的时代。 《全球数字经济白皮书&#xff08;2023年&#xff09;》介绍&#xff0c;2016年-2022年&#xff0c;中国数字经济年均复合增长率为14.2%&#xff0c;数字经济发展增速和规模兼具。随着数字基础实施持续夯实、数字应用不…

前端面试系列之工程化篇

如果对前端八股文感兴趣&#xff0c;可以留意公重号&#xff1a;码农补给站&#xff0c;总有你要的干货。 前端工程化 Webpack 概念 本质上&#xff0c;webpack 是一个用于现代 JavaScript 应用程序的静态模块打包工具。当 webpack 处理应用程序时&#xff0c;它会在内部从一个…

MyBatis 反射工具箱:带你领略不一样的反射设计思路

反射是 Java 世界中非常强大、非常灵活的一种机制。在面向对象的 Java 语言中&#xff0c;我们只能按照 public、private 等关键字的规范去访问一个 Java 对象的属性和方法&#xff0c;但反射机制可以让我们在运行时拿到任何 Java 对象的属性或方法。 有人说反射打破了类的封装…

企业微信开发教程一:添加企微应用流程图解以及常见问题图文说明

最近在前辈的基础上新添加了一个企微应用&#xff0c;过程中遇到了一些卡点&#xff0c;这里一一通过图片标注与注释的方式记录一下&#xff0c;希望能给后来人提供一些清晰明了的帮助&#xff0c;话不多说&#xff0c;大家直接看图吧。 &#xff08;文中包括一些本项目独有的配…

matlab背景部分最小化算法人脸检测

1、内容简介 略 18-可以交流、咨询、答疑 matlab背景部分最小化算法人脸检测 2、内容说明 matlab人脸检测 matlab人脸检测&#xff0c;背景部分最小化算法 3、仿真分析 略. 4、参考论文 略 链接&#xff1a;https://pan.baidu.com/s/1yQ1yDfk-_Qnq7tGpa23L7g 提取码&…

双H桥直流马达步进电机驱动芯片SS8833E

由工采网代理的率能SS8833E是一款适用于有刷直流或双极步进电机的集成电机驱动芯片&#xff1b;采用eTSSOP16封装&#xff1b;该器件集成了两个PNMOS H桥和电流调节电路&#xff1b;电机输出电流可以由外部脉宽调制器&#xff08;PWM&#xff09;或内部PWM电流控制器控制。 工…

家庭安全计划 挑战赛| 溺水预防

溺水预防 从了解到行动 家庭安全计划 | 少年急救官 地震避险逃生该怎么做&#xff1f; 起火了该如何应对&#xff1f; 哪些行为容易导致溺水&#xff1f; 家庭风险隐患有哪些&#xff1f; 家庭逃生演练四步骤你会吗&#xff1f; 国际救助儿童会&#xff08;英国&#xff…

虚拟化服务器+华为防火墙+kiwi_syslog访问留痕

一、适用场景 1、大中型企业需要对接入用户的访问进行记录时&#xff0c;以前用3CDaemon时&#xff0c;只能用于小型网络当中&#xff0c;记录的数据量太大时&#xff0c;本例采用破解版的kiwi_syslog。 2、当网监、公安查到有非法访问时&#xff0c;可提供基于五元组的外网访…

kubernetes--Pod进阶

目录 一、资源限制&#xff1a; 1. 资源限制的两种规范&#xff1a; 2. Pod 和 容器 的资源请求和限制&#xff1a; 3. CPU 资源单位&#xff1a; 4. 内存资源单位 &#xff1a; 5. 资源限制示例&#xff1a; 二、健康检查&#xff1a;探针&#xff08;Probe&#xff09; 1. 探…

Git Gui的使用及ssh协议-IEDA使用git

目录 一.Git Gui的使用 二.ssh协议 2.1 什么是ssh key 2.2 配置用户名和邮箱&#xff08;如果已经配置&#xff0c;就跳过&#xff09; 2.3 生成(或删除)秘钥 ​编辑 2.4 远程仓库绑定公钥 三.IEDA使用git 3.1 idea配置Git 3.2 项目上传Git 3.3 演示 一.Git Gu…

python打包部署脚本

linux可使用expect来实现自动交互&#xff0c;windows想要写出同样的功能脚本&#xff0c;只能使用python或者安装ActiveTcl 1、安装python Microsoft Store搜索python直接安装&#xff0c;默认会直接添加到环境变量https://www.python.org/官网下载&#xff0c;点击安装时会提…

lua 时间差功能概略

简介 在进行程序设计过程中&#xff0c;经常需要对某些函数、某些程序片断从开始运行到运行结束所耗费的时间进行一些量化。这种量化实际上就是计算时间差。 获取函数耗时情景如下&#xff1a; function time_used() --开始计时-- do something at here. --结束计时--时间差&…

tomcat下载与使用教程

1. tomcat下载 官网&#xff1a;https://tomcat.apache.org/ 镜像地址&#xff1a;https://mirrors.huaweicloud.com/apache/tomcat/ 1、选择一个版本下载&#xff0c;官网下载速度缓慢&#xff0c;推荐镜像 2、对压缩包进行解压&#xff0c;无需进行安装&#xff0c;解压放…

Java 算法篇-深入了解单链表的反转(实现:用 5 种方式来具体实现)

&#x1f525;博客主页&#xff1a; 小扳_-CSDN博客 ❤感谢大家点赞&#x1f44d;收藏⭐评论✍ 文章目录 1.0 单链表的反转说明 2.0 单链表的创建 3.0 实现单链表反转的五种方法 3.1 实现单链表反转 - 循环复制&#xff08;迭代法&#xff09; 3.2 实现单链表反转 - 头插法 3…

OpenGL_Learn10(颜色)

1. 颜色 我们在现实生活中看到某一物体的颜色并不是这个物体真正拥有的颜色&#xff0c;而是它所反射的(Reflected)颜色。换句话说&#xff0c;那些不能被物体所吸收(Absorb)的颜色&#xff08;被拒绝的颜色&#xff09;就是我们能够感知到的物体的颜色。例如&#xff0c;太阳光…

计算机提示“找不到emp.dll,无法继续执行代码”,这几种解决办法都可以解决

在计算机使用过程中&#xff0c;我们可能会遇到各种问题&#xff0c;其中之一就是系统文件丢失。emp.dll文件是Windows操作系统中的一个重要组件&#xff0c;如果丢失或损坏&#xff0c;可能会导致系统运行不稳定甚至无法正常启动。本文将详细介绍emp.dll文件丢失恢复的4个方法…

【中间件篇-Redis缓存数据库04】Redis底层原理持久化、分布式锁

Redis底层原理 持久化 Redis虽然是个内存数据库&#xff0c;但是Redis支持RDB和AOF两种持久化机制&#xff0c;将数据写往磁盘&#xff0c;可以有效地避免因进程退出造成的数据丢失问题&#xff0c;当下次重启时利用之前持久化的文件即可实现数据恢复。 RDB RDB持久化是把当…

C语言--1,5,10人民币若干,现在需要18元,一共有多少种?

今天小编给大家分享一下穷举法的一道典型例题 一.题目描述 1,5,10人民币若干,现在需要18元,一共有多少种? 二.思路分析 总共有18块钱&#xff0c;设1元有x张&#xff0c;5元有y张&#xff0c;10元有z张&#xff0c;则有表达式&#xff1a;x5y10z18&#xff0c;穷举法最重要的…