JDBC+Servlet完成商品管理系统


title: "JDBC+Servlet"
date: 2019-08-19T15:06:02+08:00


本章内容为:《JDBC+Servlet完成商品管理系统》

作者:nuoccc

这篇文章是基于JDBC+Servlet来完成一个商品管理系统,是基于对上一篇文章《Servlet基础2》的加强版。

首先先对上一篇文章的结尾抛出的问题进行处理,首先是耦合度的问题,为了降低耦合度,我们现在一般是用三层来完成Java代码,分别为Dao层,Service层和Bean层。

Dao层叫数据访问层,全称为data access object,属于一种比较底层,比较基础的操作,具体到对于某个表、某个实体的增删改查,所以我们一般进行的对数据库的操作就封装到Dao层。

Service叫服务层,被称为服务,肯定是相比之下比较高层次的一层结构,相当于将几种操作封装起来。

Bean层叫做实体层,主要是某个实体类的属性定义。

然后解决了耦合度我们,我们再来解决一下Servlet太多的问题,我们之前是每一个页面一个Servlet,现在我们改成每一个对象一个Servlet,比如完成用户的登录,注册,增加,删除,我们就只创一个UserServlet,在一个Servlet中完成各自操作。接下来,完成一个商品管理系统的编写。

1.用户注册页面

首先还是我们用户注册页面,只有注册登录之后才能访问我们的管理系统。

然后还是先创建一个项目,然后放入我们的驱动,工具类之后,再创建一个注册的JSP文件

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    
    <title>注册页面</title>
    <meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
    <meta http-equiv="pragma" content="no-cache">
    <meta http-equiv="cache-control" content="no-cache">
    <meta http-equiv="expires" content="0">    
    <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
    <meta http-equiv="description" content="This is my page">
    <link href="css/common.css" rel="stylesheet" type="text/css" />
    <link href="css/style.css" rel="stylesheet" type="text/css" />
  </head>
  
  <body>
    <div class="wrap">
      <form action="UserServlet.do" method="post">
        <div class="zclf login logns">
          <h1 class="blue">用户注册</h1>
          <dl>
            <dd>
              <label> <small>*</small>用户名</label>
              <input type="text" class="inputh lf" name="name" />
                <input type="hidden" name="action" value="Register">
            
            </dd>
            <dd>
              <label> <small>*</small>密码</label>
              <input type="password" class="inputh lf" name="pwd" />
             
            </dd>
            <dd>
              <label> <small>*</small>身份证号</label>
              <input type="text" class="inputh lf" name="idCard" />
             
            </dd>
            <dd>
              <label> <small>*</small>电话</label>
              <input type="text" class="inputh lf" name="tel" />
             
            </dd>
            <dd>
              <label> <small>*</small>住址</label>
              <input type="text" class="inputh lf" name="address" />
            </dd>
            <dd>
              <label> <small>*</small>邮箱</label>
              <input type="text" class="inputh lf" name="email" />
            </dd>
            <dd class="hegas">
              <label>&nbsp;</label>
              <input type="submit" value="立即注册" class="spbg buttombg buttombgs f14 lf" />
              <input type="button" value="登录" class="spbg buttombg buttombgs f14 lf"/>
            </dd>
          </dl>
          <span style="color:red"></span>
        </div>
      </form>
    </div>
  </body>
</html>

之后我们再创建对应的数据库

Create table testJAS_user(
id int(4) primary key auto_increment,
username varchar(20) not null,
password varchar(20) not null,
idCard varchar(18) not null,
phonenumber varchar(13) not null,
address varchar(30) not null,
email varchar(20) not null
)engine=innodb default charset=utf8;

创建好数据库之后,我们来创建三层,首先创建Bean层

JAS1.png
public class UserBean {
    private long id;
    private String username;
    private String password;
    private String idcard;
    private String phonenumber;
    private String address;
    private String email;

    public UserBean() {

    }

    public UserBean(String username, String password) {
        this.username = username;
        this.password = password;
    }

    public UserBean(String username, String password, String idcard, String phonenumber, String address, String email) {
        this.username = username;
        this.password = password;
        this.idcard = idcard;
        this.phonenumber = phonenumber;
        this.address = address;
        this.email = email;
    }

    public long getId() {
        return id;
    }

    public void setId(long id) {
        this.id = id;
    }


    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }


    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }


    public String getIdcard() {
        return idcard;
    }

    public void setIdcard(String idcard) {
        this.idcard = idcard;
    }


    public String getPhonenumber() {
        return phonenumber;
    }

    public void setPhonenumber(String phonenumber) {
        this.phonenumber = phonenumber;
    }


    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }


    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    @Override
    public String toString() {
        return "User{" +
                "username='" + username + '\'' +
                ", password='" + password + '\'' +
                ", idcard='" + idcard + '\'' +
                ", phonenumber='" + phonenumber + '\'' +
                ", address='" + address + '\'' +
                ", email='" + email + '\'' +
                '}';
    }

}

然后再创建Dao层和Service层并创建对应的文件

JSA2.png

最后我们再创建一个Servlet包,来创建我们的Servlet

JAS3.png

然后我们不是说要把所以操作都放在一个Servlet里面来做,但如何实现呢?

我们是通过在jsp文件隐藏一个input框,根据它的值来判断进行什么操作

代码如下:

<input type="hidden" name="action" value="Register">

前面的jsp代码也加入了,可以仔细找找,有了这个我们就可以进行判断不同的操作,然后根据操作来实现不同的代码。

@WebServlet("/UserServlet.do")
public class UserServlet extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.setContentType("text/html;charset=utf-8");
        req.setCharacterEncoding("utf-8");
        //设置字符集
        UserServiceImp usi = new UserServiceImp();
        //创建Service实现类对象
        String action=req.getParameter("action");
        //获取隐藏表单的action属性值
        if("Register".equals(action)){
            //如果这个操作是注册操作
            String username = req.getParameter("username");
            String password = req.getParameter("password");
            String idCard = req.getParameter("idCard");
            String phonenumber = req.getParameter("phonenumber");
            String address = req.getParameter("address");
            String email = req.getParameter("email");
            //获取各个属性

            UserBean user = new UserBean(username,password,idCard,phonenumber,address,email);
            //封装到Bean层的对象内
            
            int count = usi.userRegister(user);
            /*然后调用Service实现类的注册方法,现在我们还没有就去创建一个这个方法。这个方法返回一个count,为1代表插入成功,为0代表插入失败*/
            if(count>0){
                resp.getWriter().write("<script>alert('登录成功');Location.herf='Login.jsp';</script>");
                //注册成功的话,提示注册成功,并跳往登录页面
            }else{
                resp.getWriter().write("<script>alert('登录失败');Location.herf='Register.jsp';</script>");
                //注册失败的话,提示注册失败,并重新注册
            }
           
        }
        
    }
}

写完Servlet我们发现还需要用Service的方法,于是我们去Service创建以下方法:

public class UserServiceImp implements UserService  {
    @Override
    public int userRegister(UserBean user) {
        UserDaoImp udi = new UserDaoImp();
        udi.userRegister(user);
        //调用Dao的方法,来实现数据库的操作
        
    }
}

同样的,我们要进行操作,就需要用Dao层来实现操作,所以我们还需要调用Dao层的方法,同样现在没有需要我们创建这样的方法,代码如下:

public class UserDaoImp extends BaseDao implements UserDao{

    @Override
    public int userRegister(UserBean user) {
        String sql = "insert into testjas_user value(null,?,?,?,?,?,?)";
        //数据库插入语句
        Object[] parms ={
                user.getUsername(),
                user.getPassword(),
                user.getIdcard(),
                user.getPhonenumber(),
                user.getAddress(),
                user.getEmail()
        };
        //获取具体的值
        int count = myExecuteUpdate(sql,parms);
        //执行插入语句
        return count;
    }
}

这样我们一个基于JDBC+Servlet的注册页面就完成了,我们之后来进行登录页面的完成。

2.用户登录页面

首先先创建一个Login.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
    <title>登录页面</title>
    <meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
    <meta http-equiv="pragma" content="no-cache">
    <meta http-equiv="cache-control" content="no-cache">
    <meta http-equiv="expires" content="0">
    <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
    <meta http-equiv="description" content="This is my page">
    <link href="css/common.css" rel="stylesheet" type="text/css" />
    <link href="css/style.css" rel="stylesheet" type="text/css" />
</head>

<body>
<div class="wrap">
    <div class="main">
        <div class="sidebar">
            <p><img src="images/img1.jpg" width="443" height="314" alt="" /></p>
        </div>
        <div class="sidebarg">
            <form action="UserServlet.do" method="post">
                <input type="hidden" name="action" value="Login">
                <div class="login">
                    <dl>
                        <dt class="blues">用户登录 <span style="color:red"></span></dt>
                        <dd>
                            <label for="name">用户名:</label>
                            <input type="text" name="username" class="inputh" id="name"/>
                        </dd>
                        <dd>
                            <label for="password">密 码:</label>
                            <input type="password" name="password" class="inputh"  id="password"/>
                        </dd>
                        <dd class="buttom">
                            <input name="" type="submit" value="登 录" class="spbg buttombg f14 lf" />
                            <input id="register" name="" type="button" value="注 册" class="spbg buttombg f14 lf" />
                            <div class="cl"></div>
                        </dd>
                    </dl>
                </div>
            </form>
        </div>
        <div class="cl"></div>
    </div>
</div>
</body>
</html>

然后就去我们的UserServlet完成逻辑代码。

JAS4.png

但是我们看之前的代码,如果我们再写一个if判断会显得代码很多,于是为了代码的整洁性,我们把代码抽取出来。

JAS5.png

当我们需要看那段代码时就可以收起来,这样代码就会看着简洁,也方便我们维护代码。

JAS6.png

然后我们继续我们Login的条件判断

    if("Login".equals(action)){
        //判断如果是登录操作
        String username = req.getParameter("username");
        String password = req.getParameter("password");
        //获取表单输入框内的数据
        UserBean user = new UserBean(username,password);
        //封装成一个user对象
        ResultSet rs = usi.userLogin(user);
        //返回一个结果集,如果结果集有值代表数据库有这么一行数据
        try {
            if(rs.next()){
                resp.getWriter().write("<script>alert('登录成功');Location.href='ProductServlet.do?action=Read';</script>");
                //登录成功跳转商品首页,为什么跳转地址要写这个接下来分析
            }else {
                resp.getWriter().write("<script>alert('登录失败');Location.href='Login.jsp';</script>");
                //失败跳转登录页面
            }
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
        }
}

然后去Service层userLogin方法

public class UserServiceImp implements UserService  {
    UserDaoImp udi = new UserDaoImp();
    @Override
    public int userRegister(UserBean user) {
       return  udi.userRegister(user);
    }

    @Override
    public ResultSet userLogin(UserBean user) {
        return udi.userLogin(user);
    }
    //Service层的登录方法,去调用Dao层的登录方法
}

然后去Dao层实现数据库的操作

    public ResultSet userLogin(UserBean user) {
        String sql = "select * from testjas_user where username=? and password=?";
        //数据库查询语言
        Object[] parms = {
                user.getUsername(),
                user.getPassword()
        };
        //获得用户名和密码
        ResultSet rs = myExecuteQuery(sql,parms);
        //执行数据库查询操作并返回一个结果集
        return rs;
    }

这样就完成我们的登录页面也就完成了,接下来就是我们的商品首页

3.商品添加功能

但在我们商品首页需要去展示所有的商品,现在还没有,所有我们需要先创建一个商品添加页面

由于商品是一个新的对象,所有我们需要先创建一个新的表已经Servelt,首先先创一个Product表

CREATE TABLE `testjas_product` (
  `id` int(4) NOT NULL AUTO_INCREMENT,
  `productname` varchar(20) NOT NULL,
  `inprice` double NOT NULL,
  `outprice` double NOT NULL,
  `uptime` date NOT NULL,
  `number` int(10) NOT NULL,
  `description` varchar(100) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

然后创建对应的ProductServlet,dao,bean,service,然后我们开始添加ProductAdd.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>

    <title>My JSP 'add.jsp' starting page</title>
    <meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
    <meta http-equiv="pragma" content="no-cache">
    <meta http-equiv="cache-control" content="no-cache">
    <meta http-equiv="expires" content="0">
    <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
    <meta http-equiv="description" content="This is my page">
    <link href="css/common.css" rel="stylesheet" type="text/css" />
    <link href="css/style.css" rel="stylesheet" type="text/css" />
</head>

<body>
<form action="ProductServlet.do" method="post">
    <div class="wrap">
        <div class="sale">
            <h1 class="lf">商品管理系统</h1>
            <div class="logout right"><a href="user.do?act=logout" title="注销">注销</a></div>
        </div>
        <div class="login logns produce">
            <h1 class="blues">添加商品信息</h1>
            <dl>
                <dd >
                    <label>名称:</label>
                    <input type="text" name="name" class="inputh lf"/>
                    <input type="hidden" name="action" value="ProductAdd">

                </dd>
                <dd>
                    <label>进货价:</label>
                    <input type="text" name="inPrice" class="inputh lf"/>
                </dd>
                <dd>
                    <label>售价:</label>
                    <input type="text" name="sellPrice" class="inputh lf"/>
                </dd>
                <dd>
                    <label>上架时间:</label>
                    <input type="text" name="upTime" class="inputh lf"/>

                </dd>
                <dd>
                    <label>数量:</label>
                    <input type="text" name="number" class="inputh lf" value=""/>

                </dd>
                <dd class="dds">
                    <label>商品描述:</label>
                    <textarea name="description" class="textarea"></textarea>
                </dd>
                <dd class="hegas">
                    <input type="submit" value="新 增" class="spbg buttombg buttombgs buttomb f14 lf" />
                    <input type="reset" value="取 消" class="spbg buttombg buttombgs buttomb f14 lf" onclick='history.go(-1)'/>
                </dd>
            </dl>
        </div>
    </div>
</form>
<span style="color:red"></span>
</body>
</html>

同样的别忘记加隐藏标签来区分操作

<input type="hidden" name="action" value="ProductAdd">

然后我们现在来ProductServlet进行判断以及后续操作

@WebServlet("/ProductServlet.do")
public class ProductServlet extends HttpServlet {

    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        req.setCharacterEncoding("utf-8");
        resp.setContentType("text/html;charser=utf-8");
        //设置字符集
        ProductServiceImp psi = new ProductServiceImp();
        //获得Service层对象
        String action = req.getParameter("action");
        //获取操作

        if("ProductAdd".equals(action)){
            //如果是添加商品功能
           String name =  req.getParameter("name");
           String inprice =  req.getParameter("inprice");
           String outprice =  req.getParameter("outprice");
           String uptime = req.getParameter("uptime");
           String number =  req.getParameter("number");
           String description =  req.getParameter("description");
            //获取属性

           ProductBean product = new ProductBean(name,Double.parseDouble(inprice),Double.parseDouble(outprice), Date.valueOf(uptime),Integer.parseInt(number),description);
            //封装成Product对象
           int count = psi.productAdd(product);
            //调用Service层的添加商品方法,并返回一个count为1代表成功,为0失败
           if(count>0){
               resp.getWriter().write("<script>alert('添加成功');location.href='ProductAdd.jsp'</script>");
           }else {
               resp.getWriter().write("<script>alert('添加失败');location.href='ProductAdd.jsp'</script>");
           }
        }
    }
}

然后我们去Service层创建productAdd方法

public class ProductServiceImp implements ProductService {
    ProductDaoImp  pdi= new ProductDaoImp();
    @Override
    public int productAdd(ProductBean product) {
        return pdi.productAdd(product);
        //调用Dao层对象完成数据库的操作
    }
}

然后我们再去Dao层创建productAdd方法来实现数据库的操作

public class ProductDaoImp  extends BaseDao implements ProductDao {
    @Override
    public int productAdd(ProductBean product) {
        String sql = "insert into testjas_product value(null,?,?,?,?,?,?)";
        //数据库插入语言
        String name = product.getName();
        Double inprice = product.getInprice();
        Double outprice = product.getOutprice();
        Date uptime = product.getUptime();
        long number = product.getNumber();
        String description = product.getDescription();
        //获取属性
        Object[] parms = {name,inprice,outprice,uptime,number,description};
        int count = myExecuteUpdate(sql,parms) ;
        //数据库执行插入语句
        return count;
    }
}

这样我们一个商品新增功能就完成了,然后现在我们数据库有了商品内容我们就可以去实现我们的首页展示了

4.商品首页展示

首先我们来创建一个ProductRead.jsp也就是商品首页的jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
    <title>商品首页</title>
    <meta http-equiv="pragma" content="no-cache">
    <meta http-equiv="cache-control" content="no-cache">
    <meta http-equiv="expires" content="0">
    <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
    <meta http-equiv="description" content="This is my page">
    <link href="css/common.css" rel="stylesheet" type="text/css" />
    <link href="css/style.css" rel="stylesheet" type="text/css" />

    <script>
        function  deleteProduct(id) {
            if(confirm("是否删除数据")){
                location.href="ProductServlet.do?action=productDelete&id="+id;
                console.log(id);
            }
        }
    </script>
</head>

<body>
<form method="post" action="/ProductServlet.do?" id="pageForm">
    <input type="hidden" name="pn" id="pageNo" value="1"/>
    <div class="wrap">
        <div class="sale">
            <h1 class="lf">商品管理系统</h1>
            <div class="logout right"><a href="user.do?act=logout" title="注销">注销</a></div>
        </div>
        <div class="forms">


            <input type="button" value="添加" class="spbg buttombg f14  sale-buttom buttomb" onclick="window.location.href='productAdd.jsp'"/>
            <input type="hidden" name="action" value="ProductRead">

        </div>
        <div class="items">

            <ul class="rows even strong">
                <li>名称</li>
                <li>进货价</li>
                <li>售价</li>
                <li>上架时间</li>
                <li>数量</li>
                <li>商品描述</li>
                <li class="borderno">操作</li>
            </ul>

            <%
                //从转发过来的request中把值取出来,获取出来默认是Object 需要转换类型
                List<ProductBean> list= (List<ProductBean>)request.getAttribute("pros");
                if(list!=null){
                    for(ProductBean p:list){
            %>

            <ul class="rows">
                <li><%=p.getName()%></li>
                <li>¥<%=p.getInprice()%></li>
                <li>¥<%=p.getOutprice()%></li>
                <li><%=p.getUptime()%></li>
                <li><%=p.getNumber()%></li>
                <li><%=p.getDescription()%></li>
                <li class="borderno red">
                    <a href="/ProductServlet.do?action=gotoUpdate&id=<%=p.getId()%>">修改</a>|
                    <a href="javaScript:deleteProduct(<%=p.getId()%>);">删除</a>
                </li>
            </ul>

            <%
                    }
                }
            %>

        </div>
    </div>
</form>
</body>
</html>

这个jsp跟之前的不同,这个是要首先去获得动态数据,不再像我们之前的页面是一个死页面,所以我们之前写登录成功之后的页面跳转页没有直接写ProductRead.jsp,然后我们再来详细分析一下这个jsp为什么这么写。这里有一个小知识点就是例如ProductSevrlet.do?action=ProductRead,这里?后面的代表的是属性

首先还是先来完成我们的Sevrlet,因为我们先要去便历我们的商品

   if("ProductRead".equals(action)){
       //如果是查询所有商品
           ResultSet rs =  psi.productRead();
       //调用Service层的查询所有商品,如果查到了就返回一个结果集
            try {
                List<ProductBean> ls = new ArrayList<ProductBean>();
                    //创建一个集合
                while(rs.next()){
                    //便历这个结果集
                    int id = rs.getInt(1);
                    String name = rs.getString(2);
                    double inprice = rs.getDouble(3);
                    double outprice = rs.getDouble(4);
                    Date uptime = rs.getDate(5);
                    Long number = rs.getLong(6);
                    String description = rs.getString(7);
                    ProductBean p  = new ProductBean(id,name,inprice,outprice,uptime,number,description);
                    ls.add(p);
                    //把结果集的所有数据封装成商品对象,并添加到集合中
                }
                  req.setAttribute("productRead",ls);
                    //请求设置一个名为productRead的属性,值为集合
                    req.getRequestDispatcher("ProductRead.jsp").forward(req,resp);
                    //最后再跳转到有数据的页面
            } catch (SQLException e) {
                e.printStackTrace();
            } finally {
            }
        }

然后我们再去Service层去实现方法

public ResultSet productRead() {
        return pdi.productRead();
    }

然后去Dao层完成具体的实现

 @Override
    public ResultSet productRead() {
        String sql = "select * from testjas_product";
        ResultSet rs =myExecuteQuery(sql,null);
        return  rs;
    }

现在我们得到了数据,然后我们就回到一开始的为什么要那么设计jsp

因为我们只是Sevrlet获得到了数据,但要怎么让这个数据传到jsp呢?这时候就是 req.setAttribute("productRead",ls);这段代码起的作用,请求对象设置了一个属性并存了一个值,所以在我们的jsp页面中响应对象就能去获取这个值,也就是下面这段代码

 <%
                //从转发过来的request中把值取出来,获取出来默认是Object 需要转换类型
                List<ProductBean> list= (List<ProductBean>)request.getAttribute("pros");
                if(list!=null){
                    for(ProductBean p:list){
            %>

            <ul class="rows">
                <li><%=p.getName()%></li>
                <li>¥<%=p.getInprice()%></li>
                <li>¥<%=p.getOutprice()%></li>
                <li><%=p.getUptime()%></li>
                <li><%=p.getNumber()%></li>
                <li><%=p.getDescription()%></li>
                <li class="borderno red">
                    <a href="ProductServlet.do?action=gotoUpdate&id=<%=p.getId()%>">修改</a>|
                    <a href="javaScript:deleteProduct(<%=p.getId()%>);">删除</a>
                </li>
            </ul>

            <%
                    }
                }
            %>

我们再来分析一下这段代码,首先是这样的

 <%
                //从转发过来的request中把值取出来,获取出来默认是Object 需要转换类型
                List<ProductBean> list= (List<ProductBean>)request.getAttribute("pros");
                if(list!=null){
                    for(ProductBean p:list){
           
                    }
                }
            %>

首先我们响应对象拿到了这个属性的值,同样的需要一个一个集合来接受值,然后我们便历这个集合,便历这个集合干嘛呢?我每便历一次创建一条内容。所以我们把这段代码拆分成了两份,然后再中间放上我们的内容,这样一个动态的jsp页面就生成了。有了主页然后我们就要进行主页上的修改操作

5.商品修改

首先我们需要思考我们怎么来确定,我们选择的到底是哪一个商品,不知道前面的商品首页jsp页面有一段代码注意了没有

<a href="ProductServlet.do?action=gotoUpdate&id=<%=p.getId()%>">修改</a>|

这段代码,我给修改加了一个id,这样我每一个修改其实都是独立的,那我为什么在action后面加的是gotoUpdate而不是ProductUpdate.jsp页面呢?这是我们知道我们平常点修改,是不是修改页面要有我们需要修改的数据,如果直接是Update的页面,那是一个死页面,只有Input框,所以我们这里需要一个过渡操作,先把首页商品的内容传到ProductUpdate页面里面,所以我们需要通过id再去访问一次数据库拿到所有数据再放到Update页面里面,首先还是创建productUpdate.jsp,才知道我们到底需要什么内容。

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>

    <title>My JSP 'add.jsp' starting page</title>
    <meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
    <meta http-equiv="pragma" content="no-cache">
    <meta http-equiv="cache-control" content="no-cache">
    <meta http-equiv="expires" content="0">
    <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
    <meta http-equiv="description" content="This is my page">
    <link href="css/common.css" rel="stylesheet" type="text/css" />
    <link href="css/style.css" rel="stylesheet" type="text/css" />
</head>
<%
    ProductBean p = (ProductBean) request.getAttribute("gotoUpdate");
%>

<body>
<form action="ProductServlet.do?action=ProductUpdate" method="post">
    <div class="wrap">
        <div class="sale">
            <h1 class="lf">商品管理系统</h1>
            <div class="logout right"><a href="user.do?act=logout" title="注销">注销</a></div>
        </div>
        <div class="login logns produce">
            <h1 class="blues">修改商品信息</h1>
            <dl>
                <dd >
                    <label>名称:</label>
                    <input type="text" name="name" class="inputh lf" value="<%=p.getName()%>"/>
                    <input type="hidden" name="id" value="<%=p.getId()%>">

                </dd>
                <dd>
                    <label>进货价:</label>
                    <input type="text" name="inprice" class="inputh lf" value="<%=p.getInprice()%>"/>
                </dd>
                <dd>
                    <label>售价:</label>
                    <input type="text" name="outprice" class="inputh lf" value="<%=p.getOutprice()%>"/>
                </dd>
                <dd>
                    <label>上架时间:</label>
                    <input type="text" name="intime" class="inputh lf" value="<%=p.getUptime()%>"/>

                </dd>
                <dd>
                    <label>数量:</label>
                    <input type="text" name="number" class="inputh lf" value="<%=p.getNumber()%>"/>

                </dd>
                <dd class="dds">
                    <label>商品描述:</label>
                    <textarea name="description" class="textarea"><%=p.getDescription()%></textarea>
                </dd>
                <dd class="hegas">
                    <input type="submit" value="修 改" class="spbg buttombg buttombgs buttomb f14 lf" />
                    <input type="reset" value="取 消" class="spbg buttombg buttombgs buttomb f14 lf" onclick='history.go(-1)'/>
                </dd>
            </dl>
        </div>
    </div>
</form>
<span style="color:red"></span>
</body>
</html>

然后我们需要先去获得数据,同意的先在Sevrlet进行操作判断

        if("gotoUpdate".equals(action)){
            //如果是跳转更新页面的操作
            ProductBean p = null;
            //创建一个空对象
            String id = req.getParameter("id");
            //获取商品的id
            ResultSet rs = psi.gotoUpdate(id);
            //去获取需要更新的数据,并返回一个结果集
            try {
                if(rs.next()){
                    //如果通过id找到了这一行数据
                    String name = rs.getString(2);
                    double inprice = rs.getDouble(3);
                    double outprice = rs.getDouble(4);
                    Date uptime = rs.getDate(5);
                    Long number = rs.getLong(6);
                    String description = rs.getString(7);
                    //获得这一行数据的各个值
                    p  = new ProductBean(Integer.parseInt(id),name,inprice,outprice,uptime,number,description);
                    //封装成商品对象
                }
                req.setAttribute("gotoUpdate",p);
                //然后请求对象把对象储存在gotoUpdate里面
            } catch (SQLException e) {
                e.printStackTrace();
            } finally {
            }
        }

然后我们去Service层创建gotoUpdate方法

   @Override
    public ResultSet gotoUpdate(String id) {
        return pdi.gotoUpdate(id);
    }

然后去Dao层实现数据库的操作

@Override
    public ResultSet gotoUpdate(String id) {
        String sql = "select * from testjas_product where id =?";
        Object[] parms={id};
        ResultSet rs = myExecuteQuery(sql,parms);
        return rs;
    }

这样我们就得到了数据,然后我们再显示在数据框,前面jsp代码已经实现了,然后我们修改完数据之后,再进行数据的更新提交更新传递给数据库。但是更新我们要保持id的一致,所以别忘了藏一个id标签

 <input type="hidden" name="id" value="<%=p.getId()%>">

然后我们到Servlet进行真正的数据库更新操作

        if("ProductUpdate".equals(action)){
        //如果是数据库更新操作
            String id = req.getParameter("id");
            String name = req.getParameter("name");
            String inprice = req.getParameter("inprice");
            String outprice = req.getParameter("outprice");
            String uptime = req.getParameter("uptime");
            String number = req.getParameter("number");
            String description = req.getParameter("description");
            //获取各个属性
            ProductBean product = new ProductBean(Integer.parseInt(id),name,Double.parseDouble(inprice),Double.parseDouble(outprice),Date.valueOf(uptime),Integer.parseInt(number),description);
            //封装成商品对象
            int count = psi.productUpdate(product);
            //调用Sevrice层方法,更新商品成功返回1失败返回0
            if(count>0){
                resp.getWriter().write("<script>alert('修改成功');location.herf='ProductSevlet.do/action=ProductRead';</script>");
            }else{
                resp.getWriter().write("<script>alert('修改失败');location.herf='ProductSevlet.do/action=gotoUpdate&id='id;</script>");
            }
            //注意重定向时,一定要定向带数据的页面,不要跳转死页面
        }

然后我们去Service层实现数据库更新方法

 @Override
    public int productUpdate(ProductBean product) {
        return pdi.productUpdate(product);
    }

然后Dao层去实现数据库操作

 @Override
    public int productUpdate(ProductBean product) {
        String sql = "Update  testjas_product set name=?,inprice=?,outprice=?,uptime=?,name=?,description=? where id=?";
        Object[] parms={
                product.getName(),
                product.getInprice(),
                product.getOutprice(),
                product.getUptime(),
                product.getNumber(),
                product.getDescription(),
                product.getId()
        };
        int count = myExecuteUpdate(sql,parms);
        return count;
    }

这样我们的更新就完成了,最后就是我们的删除操作

6. 商品删除

同样的我们删除商品的时候,需要获取这个商品的id,但是与更新不同的是,删除的时候其实会有个弹窗怕用户误操作不小心删了,所以在首页的删除操作我是这么实现的,前面jsp也写了的

<a href="javaScript:deleteProduct(<%=p.getId()%>);">删除</a>

然后再javascript代码中进行提醒

<script>
        function  deleteProduct(id) {
            if(confirm("是否删除数据")){
                location.href="ProductServlet.do?action=productDelete&id="+id;
                console.log(id);
            }
        }
    </script>

如果用户确实要进行删除操作,这时候我们就在Servlet来进行操作

    if("ProductDelete".equals(action)){
            String id = req.getParameter("id");
            int count = psi.productDelete(id);
            try {
                if (count>0) {
                    resp.getWriter().write("<script>alert('删除成功');location.herf='ProductSevlet.do/action=ProductRead';</script>");
                }else{
                    resp.getWriter().write("<script>alert('删除失败');location.herf='ProductSevlet.do/action=ProductRead';</script>");
                }
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
        }
        }

然后再Servicec层创建productDelete删除方法

@Override
    public int productDelete(String id) {
        return pdi.productDelete(id);
    }

然后我们再到Dao层完成数据库的操作

@Override
    public int productDelete(String id) {
       String sql = "delete from testjas_product where id=?";
       Object[] parms = {id};
       int count = myExecuteUpdate(sql,parms);
       return  count;

    }

这样我们的删除操作也完成了,整个商品系统最基础的登录注册CRUD也就完成了。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,524评论 5 460
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,869评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,813评论 0 320
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,210评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,085评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,117评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,533评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,219评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,487评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,582评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,362评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,218评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,589评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,899评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,176评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,503评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,707评论 2 335

推荐阅读更多精彩内容