项目功能:
前台:登陆注册,用户中心,公告查看,购物车,商品购买,评论
后台:商品管理 ,类别管理,公告管理,评论管理,用户管理,订单管理
项目目录分析:
项目采用MVC设计模式(model view controler)使用servlet作为控制器,servicec层实现业务逻辑,dao层负责数据库操作。util作为工具类,其中对数据库的jdbc操作进行了封装,使我们对数据库的增删改查更加方便,页面的分页也是通过这个来实现的。
详细目录分析
项目的service与dao层的都是接口,具体实现分别在serviceimpl与daoimpl类中
该系统使用JavaWeb语言实现,其实质使完成的是一个对于数据库的增删改查功能,具体的实现方式类似,下面给出示例:
具体实现示例:
添加商品实例:
首先是找到添加商品的按钮:
代码位于admin文件夹下的menus.jsp
<td colspan="1" height="20" align="right"><span><a href="${pageContext.request.contextPath}/MenuServlet?action=addshop">
<button type="button" class="btn btn-info">添加商品</button>
</a></span></td>
点击按钮后,可以看到跳转到MenuServlet中,并传递了一个action=addshop的参数
MenuServlet.java
超链接的形式,接收使用的是doGet方法,在这里我们看到其参数实际上是告诉我们要去执行哪个方法。去执行addshop方法,我们找到addshop方法:
private void addshop(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
List<Types> types=typeservice.getTypesAll();
request.setAttribute("types", types);
request.getRequestDispatcher("/admin/addmenu.jsp").forward(request, response);
}
可以看到,其方法执行了一个查询所有类别的功能后便跳转到了addmenu.jsp
那么,为什么要查询类别呢,这个方法有什么用呢?
我们看一下getTypeAll的具体实现了什么?
它的最终实现是在TypeDaoImpl.java文件中
public List<Types> getTypesAll() {
// TODO Auto-generated method stub
String sql="select * from type";
List list=null;
try {
list=dbutil.getQueryList(Types.class, sql, null);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return list;
}
他执行了一个查询所有类别的方法,其中getQueryList便是我们工具类中封装的查询方法,用于简化数据库查询中需要加载数据库驱动,创建执行对象等步骤。
再返还到addmenu.jsp中,我们便知道为何要查询所有类别了
我们需要在添加商品时进行商品类别选择,那么这块在jsp页面是如何实现的呢?
<select class="form-control" style="width:400px" name="typename" id="typename">
<c:forEach items="${requestScope.types }" var="type">
<option value="${type.type }" selected="selected">${
type.type }</option>
</c:forEach>
使用一个下拉列表,将查询的方法输出显示出来,使用的是el表达式来实现
那么在这个页面中我们输入相应的商品信息后执行跳转:
<form action="${pageContext.request.contextPath}/MenuServlet?action=add" method="post"
name="form1" enctype="multipart/form-data">
表单提交,跳转到MenuServlet中执行add方法
response.setContentType("text/html;charset=utf-8");
request.setCharacterEncoding("utf-8");
PrintWriter out=response.getWriter();
//创建SmartUpLoad对象
SmartUpload smartUpload=new SmartUpload();
//执行上传初始化
smartUpload.initialize(this.getServletConfig(),request, response);
try {
//执行上传
smartUpload.upload();
//4获取用户输入的菜品信息
//注意:在使用了该插件后,要这样获取数据
String name = smartUpload.getRequest().getParameter("menuname");
String detail = smartUpload.getRequest().getParameter("description");
String typename = smartUpload.getRequest().getParameter("typename");
String price = smartUpload.getRequest().getParameter("price");
//获取上传的文件对象
SmartFile file = smartUpload.getFiles().getFile(0);//获取第一个文件,因为只能上传一个文件
//获取上传文件的名称
String imgpath = "img/" + file.getFilePathName();
//对Menus对象赋值
Menu shop=new Menu();
shop.setName(name);
shop.setDescription(detail);
shop.setImage(imgpath);
shop.setType(typename);
shop.setPrice(price);
int result = menuservice.addShop(shop);
if (result == 1) {
//保存上传文件
smartUpload.save("/img");
out.write("<script>"+"alert('add successful');"
+"window.location.href='"+request.getContextPath()+"/MenuServlet?action=findAll&&curPage=1'; "
+"</script>");
} else {
out.write("<script>"+"alert('add failed');"
+"window.location.href='"+request.getContextPath()+"/MenuServlet?action=findAll&&curPage=1'; "
+"</script>");
}
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
实现上传的代码较多,在这里我们用到了一个上传插件,我们的servlet本身是没有上传文件处理的功能的,因此我们使用了这个插件
在这里,其将我们的输入数据封装到Menu对象中,执行了添加的数据库操作
在MenuDaoImpl.java中:
public int addShop(Menu shop) {
// TODO Auto-generated method stub
String sql="insert into menu (name,image,description,price,type) values(?,?,?,?,?)";
Object[] objs={
shop.getName(),shop.getImage(),shop.getDescription(),shop.getPrice(),shop.getType()};
int result=0;
try {
result=dbutil.execute(sql, objs);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return result;
}
可以看到,由于我们的工具类封装,添加数据的操作也极为简单,需要的是sql语句与相应的参数即可,在执行完数据库插入数据操作后,其会返还数据受影响行数,当返还1时说明插入成功。此时便会再次返回到方法调用处,将该方法的返回值给result,判断是否插入成功。
至此,关于商品的添加操作便实现了,其他功能也是沿用相同的方法,需要对应不同的sql语句即可。