# 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

web目录下的结构:

## member 模块
有四个文件: 登录页面 login.jsp, 注册页面register.jsp, 注册成功提示页面add_success.jsp,离开页面exit.jsp.

### login页面
主要内容是一个表单,样式和跳转的我就不展开了
```jsp
```
提交到一个叫Login的servlet(其实项目名称是HandleLogin).

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模块

这个模块主要有商品列表页面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("| " + columnName[i] + " | ");
}
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("| " + table[i][j] + " | ");
}
out.print("
");
}
}
%>
每页最多显示
条信息
当前显示第
页,共有
页。
发布,修改,删除商品
商品列表
```
### 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模块

这个模块主要有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实用教程(第三版) 耿祥义,张跃平编著 清华大学出版社