这个项目主要是加深一下对于servlet和jsp知识相关的了解以及简单业务逻辑的处理。

用户更新的逻辑:

1.点击修改用户的那一行可以获取到用户的id

2.跳转到一个servlet,去查询该用户的基本信息

3.查询到后去到一个回显用户修改之前的基本信息的页面

4.用户点击修改完成,跳转一个servlet中去获取修改信息

5.信息修改格式是否正确去调用一个服务层的方法

6.正确到用户列表那一栏,错误到用户修改界面。

 分页的实现:

    /**
* 查询所有用户
* @return
*/
public static List<User> selAllUser(int pageNow,int showNum,String keyword) {
Connection conn=null;
PreparedStatement pstm=null;
List<User> users = new ArrayList<>();
//声明结果集
ResultSet rs = null;
//获取连接对象
try {
conn = BaseDao.getConn();
String sql="";
if(keyword!=null){
sql="select * from user where USERNAME like ? order by USERBIRTHDAY limit ?,?";
pstm=conn.prepareStatement(sql);
pstm.setString(1,"%"+keyword+"%");
//(当前页数-1)*一页要展示多少条记录(当前页最开始的下标)
pstm.setInt(2,(pageNow-1)*showNum);
pstm.setInt(3,showNum);
}else{
sql="select * from user order by USERBIRTHDAY limit ?,?";
pstm=conn.prepareStatement(sql);
pstm.setInt(1,(pageNow-1)*showNum);
pstm.setInt(2,showNum);
} rs=pstm.executeQuery();
while(rs.next()){
User user = new User(
rs.getString("USERID"),
rs.getString("USERNAME"),
rs.getString("USERPASSWORD"),
rs.getString("USERSEX"),
rs.getString("USERBIRTHDAY"),
rs.getString("USERIDENITYCODE"),
rs.getString("USEREMAIL"),
rs.getString("USERMOBILE"),
rs.getString("USERADDRESS"),
rs.getInt("USERSTATUS")
);
users.add(user);
}
} catch (SQLException e) {
e.printStackTrace();
}finally {
BaseDao.closeall(rs,pstm,conn);
} return users;
}
    /**
* arr[0]表示总记录条数、arr[1]表示总页数
* @param showNum
* @return arr
*/
public static int[] totalPage(int showNum,String keyword){ int []arr = {0,0};
Connection conn = null;
PreparedStatement pstm=null;
ResultSet rs=null; try {
conn=BaseDao.getConn();
String sql="";
if(keyword!=null){
sql = "select count(*) from user where USERNAME like ?";
pstm = conn.prepareStatement(sql);
pstm.setString(1, "%"+keyword+"%");
}else{
sql="select count(*) from user";
pstm=conn.prepareStatement(sql);
} rs=pstm.executeQuery();
while(rs.next()){
arr[0]=rs.getInt(1);
if(arr[0]%showNum==0){
arr[1]=arr[0]/showNum;
}else{
arr[1]=(arr[0]/showNum)+1;
}
}
} catch (SQLException e) {
e.printStackTrace();
}finally {
BaseDao.closeall(rs,pstm,conn);
} return arr; }

文件上传部分代码:

package com.zyb.servlet.product;

import com.jspsmart.upload.*;
import com.zyb.pojo.product;
import com.zyb.service.ProductService; 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 java.io.IOException;
import java.io.Writer; @WebServlet("/manage/admin_doproductadd")
public class DoProductAdd extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //创建Smartupload对象
SmartUpload smartUpload = new SmartUpload();
//初始化
smartUpload.initialize(this.getServletConfig(),request,response);
//上传过程
try {
smartUpload.upload();
} catch (SmartUploadException e) {
e.printStackTrace();
}
//获取上传文件对象
Files files=smartUpload.getFiles();
//获取第一个
File file=files.getFile(0); //获取上传文件名
String fileName=file.getFileName();
System.out.println(fileName); try {
smartUpload.save("images/product");
} catch (SmartUploadException e) {
e.printStackTrace();
}
//获取上传的请求对象
Request req=smartUpload.getRequest(); String name=req.getParameter("productName");
//name=new String(name.getBytes("gbk"),"gbk");
String id=req.getParameter("parentId");
String price=req.getParameter("productPrice");
String desc=req.getParameter("productDesc");
//desc=new String(desc.getBytes("gbk"),"utf-8");
String stock=req.getParameter("productStock"); System.out.println("产品名称"+name);
product p = new product(
0,
name,
desc,
Integer.parseInt(price),
Integer.parseInt(stock),
Integer.parseInt(id.split("-")[0] ),
Integer.parseInt(id.split("-")[1] ),
fileName
);
Writer out=response.getWriter();
int mark = ProductService.insertProduct(p);
if(mark>0){
out.write("<script>");
out.write("alert('添加成功');");
out.write("location.href='admin_productsel';");
out.write("</script>");
out.close();
}else{
out.write("<script>");
out.write("alert('添加失败');");
out.write("location.href='admin_doproductadd';");
out.write("</script>");
out.close();
}
} }

Dao层对jdbc的简单封装:

package com.zyb.dao;

import java.sql.*;

public class BaseDao {

    static {
try {
Class.forName("com.mysql.cj.jdbc.Driver");
} catch (ClassNotFoundException e) {
e.printStackTrace();
} } public static Connection getConn() throws SQLException { Connection conn= DriverManager.getConnection("jdbc:mysql://localhost:3306/shop?useSSL=false&serverTimezone=UTC","root","root");
return conn;
} public static int exeCRUD(String sql,Object []params){
int cnt=0;
PreparedStatement pstm=null;
Connection conn = null; try {
conn= BaseDao.getConn();
pstm = conn.prepareStatement(sql);
for(int i=0; i<params.length; i++) {
pstm.setObject(i+1, params[i]);
}
cnt = pstm.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
}finally {
BaseDao.closeall(null, pstm, conn);
}
return cnt;
}
public static void closeall(ResultSet rs, PreparedStatement ps, Connection conn) { try {
if(rs!=null) rs.close();
if(ps!=null)
ps.close(); if(conn!=null)
conn.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}

二级目录实现:

Category结构:

分类id           分类名                          分类的父id

(注意如果是以及目录它的父id就是0)

产品结构:

大概思想就是一个双重循环,如果当前分类的父id==上层循环的id,就将该分类作为外面循环分类的子分类。

项目结构:

项目相关截图:

前台展示:

前台结算界面:

 后台图书管理界面:

 后台账号管理界面:

 二级目录界面:

最新文章

  1. iOS 支付宝第三方使用步骤
  2. Android IOS WebRTC 音视频开发总结(五七)-- 网络传输上的一种QoS方案
  3. .net如何判断网页是否由搜索引擎蜘蛛访问?
  4. 实例:ABAP Tree Control 使用与ALV Grid对象关联
  5. Centos环境下Tomcat启动缓慢
  6. PHP去除空白字符
  7. 使用URLConnection获取网页信息的基本流程
  8. Map,HashMap,TreeMap
  9. Java NIO Channel通道
  10. SQLServer之创建全文索引
  11. 自己动手写处理器之第二阶段(1)——可编程逻辑器件与PLD电路设计流程
  12. (28)django的中间件(自定义中间件和防范跨站请求伪造攻击)-重要的概念
  13. libgdx学习记录20——多线程MultiThread资源处理
  14. django的mysql设置和mysql服务器闲置时间设置
  15. 转:ClickOnce部署Winform程序的方方面面
  16. R向量匹配match和pmatch
  17. POJ1269:Intersecting Lines(判断两条直线的关系)
  18. C#线程和异步
  19. 《C#多线程编程实战》2.8 Barrier
  20. java计算两个日期之间的相隔天数

热门文章

  1. 如何在Access中使用SQL语句
  2. Bugku-CTF之login1(SKCTF) [SQL约束攻击]
  3. Sql Server跨服务器操作数据
  4. 干了这杯Java,让你的Idea比eclipse好用
  5. Jquery插件validate使用一则
  6. java并发框架--Fork-Join
  7. 读书小记--&lt;态度&gt;
  8. 吴裕雄 PYTHON 神经网络——TENSORFLOW 单隐藏层自编码器设计处理MNIST手写数字数据集并使用TensorBord描绘神经网络数据
  9. lambda表达式在解决java后台分组排序时的应用
  10. 部署etcd中使用ansible进行变量初始化