# Vice_School_ShopWeb **Repository Path**: chen_shu_ming/Vice_School_ShopWeb ## Basic Information - **Project Name**: Vice_School_ShopWeb - **Description**: 这是JSP课堂的大作业。2020年大二下上的一门课。 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2020-05-27 - **Last Updated**: 2020-12-19 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # web项目 校园二手交易网站代码解释 ## 项目用到的bean和Servlet ![bean,servlet](https://images.gitee.com/uploads/images/2020/0610/114335_c8d3a661_5421588.png "屏幕截图.png") web目录下的结构: ![web目录结构](https://images.gitee.com/uploads/images/2020/0610/114433_790dab06_5421588.png "image-20200610081614695.png") ## member 模块 有四个文件: 登录页面 login.jsp, 注册页面register.jsp, 注册成功提示页面add_success.jsp,离开页面exit.jsp. ![member模块结构](https://images.gitee.com/uploads/images/2020/0610/114525_70e28955_5421588.png "image-20200609232649227.png") ### login页面 主要内容是一个表单,样式和跳转的我就不展开了 ```jsp

Login

``` 提交到一个叫Login的servlet(其实项目名称是HandleLogin). ![HandleLogin](https://images.gitee.com/uploads/images/2020/0610/114605_a11d7ad0_5421588.png "image-20200609233016844.png") HandleLogin接受来自表单的数据: ```java String logname=request.getParameter("logname").trim(), password=request.getParameter("password").trim(); ``` 然后建立连接的代码(下面连接数据库的代码就不提了): ```java Connection con; Statement sql; con=DriverManager.getConnection(uri); // 查询数据库有没有这个账户名的密码,经检验,sql注入无效 String condition="select * from acount where username = '"+logname+ "' and password ='"+password+"'"; sql=con.createStatement(); ``` 获取/设置session的方法: ```java Account_Bean loginBean = new Account_Bean(); HttpSession session = request.getSession(); session.setAttribute("LoginBean", loginBean); ``` 这里用到的bean是 mybean.data.Account_Bean; ```java package mybean.data; public class Account_Bean { String username = ""; String password = ""; public Account_Bean(){ // } 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; } } ``` ### Register页面 同样一个表单,然后被一个AccountAdd的Servlet接收. 往session里设置bean: ```java Account_Bean resultBean = null; try { resultBean = (Account_Bean) request.getAttribute("resultBean"); if (resultBean == null) { resultBean = new Account_Bean(); //创建Javabean对象 HttpSession session = request.getSession(); session.setAttribute("resultBean", resultBean); } } catch (Exception exp) { resultBean = new Account_Bean(); //创建Javabean对象 HttpSession session = request.getSession(); session.setAttribute("resultBean", resultBean); } ``` 获取相关参数: ```java String dataBase = request.getParameter("dataBase"); String tableName = request.getParameter("tableName"); String username = request.getParameter("username"); String pass = request.getParameter("pass"); String surePass = request.getParameter("surePass"); ``` 要执行的插入语句: ```java String condition = MessageFormat.format( "INSERT INTO {0}(username,password) VALUES ({1},{2})", tableName, str_username, str_pass); ``` 这里由于用户名唯一,所以插入前要先判断一下用户名的唯一性: ```java try { String uri = "jdbc:mysql://127.0.0.1/" + dataBase + "?" + "user=root&password=root&characterEncoding=gb2312"; con = DriverManager.getConnection(uri); // 判断一下是否唯一 String only = "select * from acount where username = '"+username+ "'"; sql=con.createStatement(); ResultSet only_rs =sql.executeQuery(only); boolean m= only_rs.next(); if(m == true){ fail(request, response, "用户名已存在,请换一个用户名吧"); } else { try { sql = con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_READ_ONLY); sql.executeUpdate(condition); response.sendRedirect("/Vice_School_ShopWeb_war_exploded/member/add_success.jsp"); } catch (SQLException e){ System.out.println(e); fail(request, response, "添加记录失败:" + e.toString()); } } } catch (SQLException e) { System.out.println(username + "该用户名已经存在!"); } ``` 这里失败的情况我抽象成一个函数,其实后面很多servlet我也这样做了.然后后面的我就不列举了. ```java public void fail(HttpServletRequest request, HttpServletResponse response, String backNews) { response.setContentType("text/html;charset=GB2312"); try { PrintWriter out = response.getWriter(); out.println(""); out.println(""); out.println(""); out.println("

" + backNews + "

"); out.println("返回"); out.println("注册页面"); out.println(""); } catch (IOException exp) { } } ``` 添加成功会去到add_success.jsp。由于这里前端部分不是重点,感兴趣的读者可以自行看看源代码部分。 ### add_success.jsp页面 会提示你注册情况: ```html

恭喜,注册账户成功

用户名: 密码: 请妥善保官好用户名和密码~~ ``` ### exit.jsp页面 就是注销掉session: ```jsp <% session.invalidate(); String site = new String("http://127.0.0.1:8080/Vice_School_ShopWeb_war_exploded/index.jsp"); response.setStatus(response.SC_MOVED_TEMPORARILY); response.setHeader("Location", site); %> ``` ## shop_module模块 ![sho_module结构](https://images.gitee.com/uploads/images/2020/0610/114641_281f50d8_5421588.png "image-20200610081428958.png") 这个模块主要有商品列表页面shopList.jsp, 商品展示页面shopShow.jsp,发布商品修改商品删除商品的页面a_u_d_Servlet.jsp,用于展示特定用户商品的q_user_shopShow.jsp。 ### shopList.jsp 主要是一个个表单,虽然通向的都是shopContent_Servlet,但是他们的名为tableName的隐藏的输入框的值却是不同的. ```html
``` 这里从商品列表到商品详情页面要判断一下用户是否登录了,防止网站被盗链。 ```java //判断当前是否是登录状态 if(LoginBean.getUsername().equals("") || LoginBean.getPassword().equals("")){ fail(request, response, "请您先登录在查看丰富的商品"); //没有登录, 不给查看 return; } ``` 这里实现讲内容放到一个Bean中的操作,后续查询特定用户发布的商品也同理。 ```java Statement sql=con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_READ_ONLY); ResultSet rs=sql.executeQuery("SELECT * FROM "+tableName); ResultSetMetaData metaData = rs.getMetaData(); int columnCount = metaData.getColumnCount(); //得到结果集的列数 String []columnName = new String[columnCount]; for(int i=0;i


当前显示的内容是: <% String[][] table = pageBean.getTableRecord(); if (table == null) { out.print("没有记录"); return; } String[] columnName = pageBean.getColumnName(); if (columnName != null) { out.print(""); for (int i = 0; i < columnName.length; i++) { out.print(""); } out.print(""); } int totalRecord = table.length; out.println("全部记录数" + totalRecord); //全部记录数 int pageSize = pageBean.getPageSize(); //每页显示的记录数 int totalPages = pageBean.getTotalPages(); if (totalRecord % pageSize == 0) totalPages = totalRecord / pageSize;//总页数 else totalPages = totalRecord / pageSize + 1; pageBean.setPageSize(pageSize); pageBean.setTotalPages(totalPages); if (totalPages >= 1) { if (pageBean.getCurrentPage() < 1) pageBean.setCurrentPage(pageBean.getTotalPages()); if (pageBean.getCurrentPage() > pageBean.getTotalPages()) pageBean.setCurrentPage(1); int index = (pageBean.getCurrentPage() - 1) * pageSize; int start = index; //table的currentPage页起始位置 for (int i = index; i < pageSize + index; i++) { if (i == totalRecord) break; out.print(""); for (int j = 0; j < columnName.length; j++) { out.print(""); } out.print(""); } } %>
" + columnName[i] + "
" + table[i][j] + "

每页最多显示 条信息
当前显示第 页,共有 页。
每页显示 条记录
输入页码:

发布,修改,删除商品

商品列表

``` ### a_u_d_Servlet.jsp 这里用到四个Servlet,分别是添加操作productAdd, 修改操作productUpdate, 删除操作productDelete, productQuery. productAdd执行的sql语句: ```java String condition = MessageFormat.format( "INSERT INTO {0}(username, sname, sdetail, contact_way) VALUES ({1},{2},{3},{4})", tableName, str_username, str_sname, str_sdetail, str_contact_way); ``` productUpdate执行的sql语句: ```java String condition = MessageFormat.format( "UPDATE {0} set " + "username = {1}, sname = {2}, sdetail = {3}, contact_way = {4} " + "where sid = {5}", tableName, str_username, str_sname, str_sdetail, str_contact_way, int_sid); ``` 然后update执行之前必须判断一下是否该用户名下存在着该商品: ```java String only = MessageFormat.format( "select * from {0} where username = {1} and sid = {2}", tableName, str_username, int_sid ); sql=con.createStatement(); ResultSet only_rs =sql.executeQuery(only); boolean m= only_rs.next(); if(m == false){ fail(request, response, "在您的名下没有这个商品哦"); } else { //执行删除操作,此处省略 } ``` 然后判断有无该商品使用用户名和商品编号: 商品编号的话,由于数据库表中是int,所以要判断一下: ```java long l_sid = Long.parseLong(TDsid); if(l_sid > Integer.MAX_VALUE || l_sid < 0){ fail(request, response, "商品id输入有误"); //有误下面的都不用做了 return; } int int_sid = (int)l_sid; ``` productDelete执行的sql语句:(同样delete前也要判断一下有没有该商品) ```java String condition = MessageFormat.format( "DELETE FROM {0} where sid = {1}", tableName, int_sid); ``` productQuery执行的sql语句: ```java String query = MessageFormat.format( "SELECT * FROM {0} where username = {1}", tableName, query_user); ``` ## system_operate模块 ![system_operate模块](https://images.gitee.com/uploads/images/2020/0610/114827_99fb5f2f_5421588.png "image-20200610081448983.png") 这个模块主要有super_login.jsp管理员登录页面,管理员功能主页super_index.jsp,暂时不用到oper_acount.jsp页面,删除用户或商品的页面delete_u_s.jsp。 ### super_login.jsp 登录页面和普通用户登录页面差不多,只不过指向super_login的Servlet,然后super_login查询的数据表示superaccount. ```java String condition="select * from superAccount where username = '"+logname+ "' and password ='"+password+"'"; ``` ### super_index.jsp 这个页面和商品列表页面样式差不多。 然后上面显示用户名或者退出登录或者登录的操作: ```jsp <% if (superLoginBean.getUsername().equals("")) { out.print("请登录管理员账号"); } else { %> <% out.print(MessageFormat.format("管理员: {0}", superLoginBean.getUsername())); out.print("退出登录"); }%> ``` ### delete_u_s.jsp 删除用户指向super_d_user的Servlet和删除物品指向super_d_shop的Servlet. 他们都需要: ```java //管理员信息的bean try { managerBean = (super_manager_Bean) session.getAttribute("superLoginBean"); if (managerBean == null) { managerBean = new super_manager_Bean(); //创建Javabean对象 session.setAttribute("superLoginBean", managerBean); } } catch (Exception exp) { managerBean = new super_manager_Bean(); session.setAttribute("superLoginBean", managerBean); } ``` ```java //判断当前是否是管理员登录状态 if (managerBean.getUsername().equals("") || managerBean.getPassword().equals("")) { fail(request, response, "请您先登录管理员账号再删除普通用户"); //没有登录, 不给删除 return; } ``` 删除用户前需要判断用户是否存在: ```java String only = MessageFormat.format( "select * from {0} where username = {1}", tableName, str_TDUser ); sql=con.createStatement(); ResultSet only_rs =sql.executeQuery(only); boolean m= only_rs.next(); if(m == false){ fail(request, response, "此用户不存在哦"); } else { // 删除用户操作 } ``` 删除用户 ```java String condition = MessageFormat.format( "DELETE FROM {0} where username = {1}", tableName, str_TDUser); ``` 删除用户名下的产品: ```java //删除该用户发布的商品记录sql语句 String[] d_list = {"stationery", "sports", "cosmetics","costume", "electronic" , "daily_supplies"}; String [] d_sql = new String[d_list.length]; for(int i = 0; i < d_list.length; i++){ d_sql[i] = MessageFormat.format( "DELETE FROM {0} where username = {1}", d_list[i], str_TDUser ); } ``` 删除商品: ```java String condition = MessageFormat.format( "DELETE FROM {0} where sid = {1}", tableName, int_sid); ``` ## 结语 由于初次用JSP开发小型web网站,可能代码有些臃肿,还需不断学习。感谢观看~ ## 参考文献 [1] JSP实用教程(第三版) 耿祥义,张跃平编著 清华大学出版社