基于JSP+Serlvet+JDBC的开发(5)-- 商品功能

在type-index.jsp中点击商品类型可以进入到该商品类型的所有商品。

 

商品类型为ITC10的商品信息

View层:

goods-index.jsp

 1 <html>
 2 <head>
 3 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 4 <%@ include file="top.jsp"%>
 5 <title>商品展示</title>
 6 </head>
 7 <body>
 8     <div class="main">
 9         <div>
10             <a href="${root}/send?url=goods-save.jsp">添加商品</a>
11         </div>
12         <table>
13             <tr>
14                 <td>序号</td>
15                 <td>商品名称</td>
16                 <td>商品价格</td>
17             </tr>
18             <c:forEach items="${entities}" var="obj" varStatus="status">
19                 <tr>
20                     <td>${status.index + 1 }</td>
21                     <td>${obj.name}</td>
22                     <td>${obj.price}</td>
23                 </tr>
24             </c:forEach>
25         </table>
26     </div>
27 </body>
28 </html>

Controller层(Serlvet):

 1 package action;
 2
 3 import java.io.IOException;
 4 import java.util.List;
 5
 6 import javax.servlet.RequestDispatcher;
 7 import javax.servlet.ServletException;
 8 import javax.servlet.http.HttpServlet;
 9 import javax.servlet.http.HttpServletRequest;
10 import javax.servlet.http.HttpServletResponse;
11
12 import model.Goods;
13 import service.GoodsService;
14 import service.impl.GoodsServiceImpl;
15
16 public class GoodsAction extends HttpServlet {
17     private static final long serialVersionUID = 1L;
18
19     private static final String[] action = { "tid", "save", "delete", "update" };
20     private GoodsService goodsService = new GoodsServiceImpl();
21
22     protected void doGet(HttpServletRequest request, HttpServletResponse response)
23             throws ServletException, IOException {
24         doPost(request, response);
25     }
26
27     protected void doPost(HttpServletRequest request, HttpServletResponse response)
28             throws ServletException, IOException {
29         // 获取action
30         String actionName = request.getParameter("action") != null ? request.getParameter("action") : "";
31         int actionIndex = 0;
32         for (int i = 0; i < action.length; i++) {
33             if (action[i].equals(actionName)) {
34                 actionIndex = i;
35                 break;
36             }
37         }
38         // 保存action操作结果[d/r, url]
39         String[] r = null;
40         // 根据actionIndex调用对应的方法
41         switch (actionIndex) {
42         case 0:
43             r = tip(request, response);
44             break;
45         case 1:
46             r = save(request, response);
47         }
48
49         // 根据action操作结果执行相应的操作
50         if ("d".equals(r[0])) {// 转发
51             RequestDispatcher rd = request.getRequestDispatcher(r[1]);
52             rd.forward(request, response);
53         } else {// 重定向
54             response.sendRedirect(r[1]);
55         }
56     }
57
58     // 根据类似ID获取商品
59     private String[] tip(HttpServletRequest request, HttpServletResponse response) {
60         Long tid = Long.parseLong(request.getParameter("tid"));
61         List<Goods> gList = goodsService.findByTid(tid);
62         request.setAttribute("entities", gList);
63         return new String[] { "d", "WEB-INF/jsp/goods-index.jsp" };
64     }
65
66     // 保存商品
67     private String[] save(HttpServletRequest request, HttpServletResponse response) {
68         String name = request.getParameter("name");
69         String price = request.getParameter("price");
70         boolean isNull = false;
71         if (name == null || "".equals(name)) {
72             request.setAttribute("msg-name", "商品名称不能为空");
73             isNull = true;
74         }
75         if (price == null || "".equals(price)) {
76             request.setAttribute("msg-price", "商品价格不能为空");
77             isNull = true;
78         }
79         try {
80             Double.parseDouble(price);
81         } catch (Exception e) {
82             request.setAttribute("msg-price", "商品价格不能为字符");
83             isNull = true;
84         }
85
86         if (isNull) {
87             return new String[] { "d", "WEB-INF/jsp/goods-save.jsp" };
88         }
89         // 保存实体
90         Goods g = new Goods();
91         g.setName(name);
92         g.setPrice(Double.parseDouble(price));
93         g.setTid(Long.parseLong(request.getParameter("tid")));
94         goodsService.save(g);
95         String root = request.getContextPath();
96         return new String[] { "r", root + "/type" };
97     }
98
99 }

Service层(这里GoodsService除了基本的增删查改外,还有自己的一个业务,就是根据商品类型ID获取所有该类型的商品):

1 public interface GoodsService extends BaseServcice<Long, Goods>{
2
3     // 根据类型ID查询所有商品
4     List<Goods> findByTid(Long tid);
5 }

Service的实现(直接调用DAO层)

 1 public class GoodsServiceImpl extends BaseServiceImpl<Long, Goods> implements GoodsService{
 2
 3     private GoodsDAO goodsDAO = new GoodsDAOImpl();
 4
 5     @Override
 6     protected BaseDAO<Long, Goods> getBaseDAO() {
 7         return goodsDAO;
 8     }
 9
10     @Override
11     public List<Goods> findByTid(Long tid) {
12         return goodsDAO.findByTid(tid);
13     }
14 }

DAO层:

1 public interface GoodsDAO extends BaseDAO<Long, Goods>{
2
3     // 根据商品类型查询所有商品
4     List<Goods> findByTid(Long tid);
5 }

DAO的实现(由于DAO继承了BaseDAOImpl,所有普通的增删查改就不用实现了,只要实现自己的就可以了。)

 1 public class GoodsDAOImpl extends BaseDAOImpl<Long, Goods> implements GoodsDAO{
 2
 3     @Override
 4     public List<Goods> findByTid(Long tid) {
 5         String findSQL = "select * from tb_goods where tid = ?";
 6         List<Goods> gList = new ArrayList<Goods>();
 7         try {
 8             conn = DBUtil.getConn();
 9             pstmt = conn.prepareStatement(findSQL);
10             pstmt.setLong(1, tid);
11             rs = pstmt.executeQuery();
12
13             Goods g = null;
14             while (rs.next()) {
15                 g = new Goods();
16                 g.setName(rs.getString("name"));
17                 g.setPrice(rs.getDouble("price"));
18                 gList.add(g);
19             }
20         } catch (Exception e) {
21             LogUtil.log(e.getMessage());
22             throw new RuntimeException(e);
23         }
24         return gList;
25     }
26 }

这里除了展示商品外依然提供了添加商品的连接:

 1 <html>
 2 <head>
 3 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 4 <%@ include file="top.jsp"%>
 5 <title>添加商品</title>
 6 </head>
 7 <body>
 8     <form action="${root}/goods?action=save" method="post">
 9         <table>
10             <caption>添加商品</caption>
11             <tr>
12                 <td>商品名称:</td>
13                 <td><input type="text" name="name"/></td>
14                 <td>${msg}</td>
15             </tr>
16             <tr>
17                 <td>商品价格:</td>
18                 <td><input type="text" name="price"/></td>
19                 <td>${msg}</td>
20             </tr>
21             <tr>
22                 <td>商品类型:</td>
23                 <td id="type-select">
24                 </td>
25                 <td>${msg}</td>
26             </tr>
27             <tr>
28                 <td colspan="3"><input type="submit" value="添加"/></td>
29             </tr>
30         </table>
31     </form>
32
33     <script type="text/javascript" src="${root}/resources/js/jquery-1.11.1.js"></script>
34     <script type="text/javascript" src="${root}/resources/js/goods-save.js"></script>
35 </body>
36 </html>

需要注意的是,这里的下拉框是在页面加载完后,异步向后台查询并添加的。这里使用了jQuery发送异步请求。

$(function() {
    $.ajax({
        url : "type?action=ajax-type",
        dataType : "json",
        success : function(r) {
            // "<select><option value>"
            var html = "<select name=‘tid‘>";
            for (var i = 0; i < r.total; i++) {
                html += "<option value=‘" + r.data[i].id + "‘>"
                        + r.data[i].name + "</option>";
            }
            html += "<select>";
            $("#type-select").html(html);
        }
    })
});

后台实现type这个Serlvet中的ajaxType方法负责这个请求并拼凑返回JSON数据:

 1 // 异步拉取type数据
 2     private String[] ajaxType(HttpServletRequest request, HttpServletResponse response) {
 3         List<Type> tList = typeService.find();
 4         StringBuffer json = new StringBuffer("{ \"total\" : ").append(tList.size()).append(", \"data\" : [");
 5         if (!tList.isEmpty()) {
 6             for (int i = 0, size = tList.size(); i < size - 1; i++) {
 7                 json = json.append("{\"id\" : ").append(tList.get(i).getId()).append(", \"name\" : \"")
 8                         .append(tList.get(i).getName()).append("\"},");
 9             }
10             json = json.append("{\"id\" : ").append(tList.get(tList.size() - 1).getId()).append(", \"name\" : \"")
11                     .append(tList.get(tList.size() - 1).getName()).append("\"}");
12         }
13         json = json.append("]}");
14
15         return new String[] { "", json.toString() };
16     }

这里的返回数组的第一个对象是“”,不是“r”,也不是“d”,所以第二个对象json.toString()会被直接输出都客户端,相关代码如下:

 1     // 根据action操作结果执行相应的操作
 2         if ("d".equals(r[0])) {// 转发
 3             RequestDispatcher rd = request.getRequestDispatcher(r[1]);
 4             rd.forward(request, response);
 5         } else if ("r".equals(r[0])) {// 重定向
 6             response.sendRedirect(r[1]);
 7         } else {// 直接输出r[1]的内容
 8             PrintWriter out = response.getWriter();
 9             out.println(r[1]);
10             out.flush();
11             out.close();
12         }

这样基本的功能都实现了,接下来的改善地方就是利用Filter统一解决乱码问题,利用Listener项目启动就加载类型并放在application中(这样项目就不会每个人访问的都去数据库查一次类型了,毕竟类型改变的几率很少,即使改变了,重新加载一次就可以了。)还有一点改善的地方就是自定义注解解决表名的约定。

昨天忙了一晚上还落枕了,脖子一天都不舒服,坑爹。好了周末又过了。

时间: 2024-08-27 04:15:30

基于JSP+Serlvet+JDBC的开发(5)-- 商品功能的相关文章

基于JSP+Serlvet+JDBC的开发(1)

好久没用JSP+Servlet+JDBC这种组合,可以说自从没有这种作业后就没有这种方式开发了.最近也没怎么学东西,感觉计划都乱了,趁着这个周末写点东西找找感觉. 这次想利用JSP+Servlet+JDBC写个小小的商品展示平台DEMO.功能很简单,就是能够展示商品的类型,然后根据类型展示所属类型的商品就可以了,说是小小的商品展示平台还不如说是一个增删查改的DEMO. 下图是整个项目的结构: 为了方便解耦,使用MVC模式进行开发,这里介绍各个包的作用: action 存放的servlet类,负责

基于JSP+Serlvet+JDBC的开发(2)- Servlet类的实现

上一篇我把项目的整个结构搭好了,这里写一下Servlet的实现. 利用Servlet开发有一个弊端就是每一个请求URL都要有对应的Servlet与之对应,但是这样会造成Servlet臃肿,在web.xml中也会出现一大堆Servlet配置信息.为了解决这个问题,我这里利用给Servlet传一个action参数来使一个Servlet处理一类请求. 具体实现如下: 在Serlvet中创建一个数组,记录所有请求这个Servlet的操作, 1 private static final String[]

基于JSP+Serlvet+JDBC的开发(4)-- 继续TypeSerlvet的save功能

在type-index.jsp中展示了所有类型,同时也可以添加类型,如下JSP代码: 1 <html> 2 <head> 3 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 4 <%@ include file="top.jsp"%> 5 <title>商品展示平台</title> 6 &

基于JSP+Serlvet+JDBC的开发(3)-- Service、DAO层实现

这里为了使不必在所有Service和DAO都写基础的增删查改,我写了两个基类接口,BaseService和BaseDAO BaseDAO.java (这里使用了泛型,PK 是主键,T是实体类型),这样其他DAO只要继承这个DAO就可以实现基础增删查改了. 1 package dao; 2 3 import java.io.Serializable; 4 import java.util.List; 5 6 /* 7 * 所有DAO接口继承此接口获取基本的增删查改规范 8 */ 9 public

java -------简单的基于jsp+servlet+jdbc登录

1 2 项目结构以及数据库表图片 3 4 5 package com.jmi.booklibmanage.service; 6 7 import java.sql.Connection; 8 import java.sql.DriverManager; 9 import java.sql.ResultSet; 10 import java.sql.SQLException; 11 import java.sql.Statement; 12 13 14 15 public class Studen

基于JSP的病历管理系统开发与设计,源码下载

大家好,我是全微毕设团队的创始人,本团队擅长JAVA(SSM,SSH,SPRINGBOOT).PYTHON.PHP.C#.安卓等多项技术. 今天将为大家分析一个病历管理系统(指出传统病案管理模式存在的问题,从新旧病案归档整理.电子病案的使用等方面介绍电子病案管理系统的实施,阐明实施电子病案管理的意义,包括节省存储空间,提高检索效率.病案质量与规范管理等.),该项目使用框架为SSM(MYECLIPSE),选用开发工具为MYECLIPSE.病历管理系统为一个 后台项目. 为了完成该系统,我们首先需要

JSP+Servlet+JDBC+Mysql实现的博客系统

本文存在视频版本,请知悉 项目简介 项目来源于:https://gitee.com/nanpingping/jsp-blog 这次分享个人博客系统,界面简洁大气,功能齐全,是不可多得的比较容易的系统,非常适合毕业设计或者课程设计. 本系统基于JSP+Servlet+JDBC+Mysql.涉及技术少,易于理解,适合JavaWeb初学者学习使用. 难度等级:简单 技术栈 编辑器 IntelliJ IDEA 2019.1.1 (Ultimate Edition) 前端技术 基础:html+css+Ja

JSP+Struts2+JDBC+Mysql实现的校园宿舍管理系统

项目简介 项目来源于:https://gitee.com/passenger134/javaweb-sushe 本系统基于JSP+Struts2+JDBC+Mysql的校园宿舍管理系统.该系统没有使用全套的SSH框架,只使用了跳转层Struts2,非常适合学习Struts2时使用. 难度等级:中等 技术栈 编辑器 Eclipse Version: 2019-12 (4.14.0) 前端技术 基础:html+css+JavaScript 框架:无 后端技术 JSP+Struts2+JDBC 数据库

基于Servlet、JSP、JDBC、MySQL的一个简单的用户注册模块(附完整源码)

最近看老罗视频,做了一个简单的用户注册系统.用户通过网页(JSP)输入用户名.真名和密码,Servlet接收后通过JDBC将信息保存到MySQL中.虽然是个简单的不能再简单的东西,但麻雀虽小,五脏俱全,在此做一归纳和整理.下面先上源码: 一.index.jsp <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%> <% String path =