- 开发工具:eclipse、tomcat、navicat、mysql8.0
- 开发技术:Java、html、css、JavaScript、jsp、springmvc。
- 项目描述:该化妆品销售系统可以实现顾客的注册、登录、浏览化妆品、查询化妆品、查看购物车、加入购物车、退出、主页。
- 源码地址:https://download.csdn.net/download/m0_51152186/85262700
一、eclipse中新建web项目。
创建Dynamic Web Project–动态web项目。
打开eclipse,在工具栏选在New–>Dynamic Web Project
在打开的Dynamic Web Project窗口,输入项目名。选择tomcat,其他默认,然后Next。
这时你可以把Context directory名改为WebRoot,也可以默认为WebContent,完成。这样就在eclipse的左边窗口生成了一个名为dynamic_web_project_01的web项目,至此web项目创建完毕。
二、建立如下图所示的工程目录,导入连接MySQL的jar包
编写mvc中属于view的jsp代码
login.jsp(登录)
<%@ page contentType="text/html;charset=GB2312" %><jsp:useBean id="loginBean" class="mybean.data.Login" scope="session"/><HTML><HEAD><%@ include file="head.txt" %></HEAD><BODY background=image/back.jpg><font size=2><div align="center"><table border=2><tr> <th>登录</th></tr><FORM action="loginServlet" Method="post"><tr><td>登录名称:<Input type=text name="logname"></td></tr><tr><td>输入密码:<Input type=password name="password"></td></tr></table><Input type=submit name="g" value="提交"></FORM></div ><div align="center" >登录反馈信息:<jsp:getProperty name="loginBean" property="backNews"/><br>登录名称:<jsp:getProperty name="loginBean" property="logname"/><div ></font></BODY></HTML>
index.jsp(首页)
<%@ page contentType="text/html;charset=GB2312" %><HTML> <BODY><HEAD><%@ include file="head.txt" %></HEAD><title>首页</title><CENTER> <h1><font Size=4 color=blue> 欢迎光临“青山不老绿水无忧”化妆品销售网 </font></h1><img src="image/welcome.jpg" width=600 height=200 ></img></CENTER></BODY></HTML>
inputRegisterMess.jsp(注册)
<%@ page contentType="text/html;charset=GB2312" %><jsp:useBean id="userBean" class="mybean.data.Register" scope="request"/><HEAD><%@ include file="head.txt" %></HEAD><title>注册页面</title><HTML><BODY background=image/back.jpg><Font size=2><div align="center"><FORM action="registerServlet" method="post" name=form><table> 用户名由字母、数字、下划线构成,*注释的项必须填写。 <tr><td>*用户名称:</td><td><Input type=text name="logname" ></td> <td>*用户密码:</td><td><Input type=password name="password"> </td></tr> <tr><td>*重复密码:</td><td> <Input type=password name="again_password"></td> <td>联系电话:</td><td><Input type=text name="phone"></td></tr> <tr><td>邮寄地址:</td><td><Input type=text name="address"></td> <td>真实姓名:</td><td><Input type=text name="realname"></td> <td><Input type=submit name="g" value="提交"></td> </tr></table></Form></div ><div align="center"><p> 注册反馈:<jsp:getProperty name="userBean" property="backNews" /> <table border=3> <tr><td>会员名称:</td> <td><jsp:getProperty name="userBean" property="logname"/></td> </tr> <tr><td>姓名:</td> <td><jsp:getProperty name="userBean" property="realname"/></td> </tr> <tr><td>地址:</td> <td><jsp:getProperty name="userBean" property="address"/></td> </tr> <tr><td>电话:</td> <td><jsp:getProperty name="userBean" property="phone"/></td> </tr></table></div ></Body></HTML>
lookCosmetic.jsp(浏览化妆品)
<%@ page contentType="text/html;charset=GB2312" %><%@ page import="java.sql.*" %><HTML><HEAD><%@ include file="head.txt" %></HEAD><BODY background=image/back.jpg><font size=2><div align="center"><% try { Class.forName("com.mysql.cj.jdbc.Driver"); } catch(Exception e){} String uri="jdbc:mysql://localhost/shop?user=root&password=123456&useSSL=false&serverTimezone=GMT+8&characterEncoding=utf-8&autoReconnect=true"; Connection con; Statement sql; ResultSet rs; try { con=DriverManager.getConnection(uri); sql=con.createStatement(); //读取classify表,获得分类: rs=sql.executeQuery("SELECT * FROM classify "); out.print("<form action='queryServlet' method ='post'>") ; out.print("<select name='fenleiNumber'>") ; while(rs.next()){ int id = rs.getInt(1); String name = rs.getString(2); out.print("<option value ="+id+">"+name+"</option>"); } out.print("</select>"); out.print("<input type ='submit' value ='提交'>"); out.print("</form>"); con.close(); } catch(SQLException e){ out.print(e); }%></div></font></BODY></HTML>
searchCosmetic.jsp(查询化妆品)
<%@ page contentType="text/html;charset=GB2312" %><HTML><HEAD><%@ include file="head.txt" %></HEAD><BODY background=image/back.jpg><font size=2><div align="center"><br>查询时可以输入化妆品的版本号或化妆品名称及价格。<br>化妆品名称支持模糊查询。<br>输入价格是在2个值之间的价格,格式是:价格1-价格2<br>例如 258-689 <FORM action="searchByConditionServlet" Method="post" > <br>输入查询信息:<Input type=text name="searchMess"><br> <Input type =radio name="radio" value="cosmetic_number">化妆品版本号 <Input type =radio name="radio" value="cosmetic_name" checked="ok">化妆品名称 <Input type =radio name="radio" value="cosmetic_price">化妆品价格 <br><Input type=submit name="g" value="提交"></Form></div></Font></BODY></HTML>
lookShoppingcar.jsp(查看购物车)
<%@ page contentType="text/html;charset=GB2312" %><%@ page import="mybean.data.Login" %><%@ page import="java.util.*" %><jsp:useBean id="loginBean" class="mybean.data.Login" scope="session"/><HTML><HEAD><%@ include file="head.txt" %></HEAD><BODY background=image/back.jpg><font size=2><div align="center"><% if(loginBean==null){ response.sendRedirect("login.jsp");//重定向到登录页面 } else { boolean b =loginBean.getLogname()==null|| loginBean.getLogname().length()==0; if(b) response.sendRedirect("login.jsp");//重定向到登录页面 } LinkedList car =loginBean.getCar(); if(car==null) out.print("<h2> 购物车没有物品.</h2>"); else { Iterator<String> iterator=car.iterator(); StringBuffer buyGoods = new StringBuffer(); int n=0; double priceSum =0; out.print("购物车中的物品:<table border=2>"); while(iterator.hasNext()) { String goods=iterator.next(); String showGoods=""; n++; //购车车物品的后缀是“#价格数字",比如“化妆品价格3989 #3989” int index=goods.lastIndexOf("#"); if(index!=-1){ priceSum+=Double.parseDouble(goods.substring(index+1)); showGoods = goods.substring(0,index); } buyGoods.append(n+":"+showGoods); String del="<form action='deleteServlet' method = 'post'>"+ "<input type ='hidden' name='delete' value= "+goods+">"+ "<input type ='submit' value='删除' ></form>"; out.print("<tr><td>"+showGoods+"</td>"); out.print("<td>"+del+"</td></tr>"); } out.print("</table>"); String orderForm = "<form action='buyServlet' method='post'>"+ " <input type ='hidden' name='buy' value= "+buyGoods+" >"+ " <input type ='hidden' name='price' value= "+priceSum+" >"+ "<input type ='submit' value='生成订单'></form>"; out.print(orderForm); } %></div></font></BODY></HTML>
三、编写mvc中的moudle层和control层。
package mybean.data;import com.sun.rowset.*; public class DataByPage{ CachedRowSetImpl rowSet=null; //存储表中全部记录的行集对象 int pageSize=1; //每页显示的记录数 int totalPages=1; //分页后的总页数 int currentPage =1 ; //当前显示页 public void setRowSet(CachedRowSetImpl set){ rowSet=set; } public CachedRowSetImpl getRowSet(){ return rowSet; } public void setPageSize(int size){ pageSize=size; } public int getPageSize(){ return pageSize; } public int getTotalPages(){ return totalPages; } public void setTotalPages(int n){ totalPages=n; } public void setCurrentPage(int n){ currentPage =n; } public int getCurrentPage(){ return currentPage ; }}
package mybean.data;import java.util.*;public class Login { String logname="", backNews="未登录"; LinkedList<String> car; //用户的购物车 public Login() { car = new LinkedList<String>(); } public void setLogname(String logname){ this.logname = logname; } public String getLogname(){ return logname; } public void setBackNews(String s) { backNews = s; } public String getBackNews(){ return backNews; } public LinkedList<String> getCar() { return car; }}
package mybean.data;public class Register{ String logname="" , phone="", address="",realname="",backNews="请输入信息"; public void setLogname(String logname){ this.logname=logname; } public String getLogname(){ return logname; } public void setPhone(String phone){ this.phone=phone; } public String getPhone(){ return phone; } public void setAddress(String address){ this.address=address; } public String getAddress(){ return address; } public void setRealname(String realname){ this.realname=realname; } public String getRealname(){ return realname; } public void setBackNews(String backNews){ this.backNews=backNews; } public String getBackNews(){ return backNews; }}
package myservlet.control;import mybean.data.Login;import java.sql.*;import java.util.*;import java.io.*;import javax.servlet.*;import javax.servlet.http.*;public class HandleBuyGoods extends HttpServlet { public void init(ServletConfig config) throws ServletException { super.init(config); try{ Class.forName("com.mysql.cj.jdbc.Driver"); } catch(Exception e){} } public void doPost(HttpServletRequest request,HttpServletResponse response) throws ServletException,IOException { request.setCharacterEncoding("gb2312"); String buyGoodsMess = request.getParameter("buy"); if(buyGoodsMess==null||buyGoodsMess.length()==0) { fail(request,response,"购物车没有物品,无法生成订单"); return; } String price = request.getParameter("price"); if(price==null||price.length()==0) { fail(request,response,"没有计算价格和,无法生成订单"); return; } float sum = Float.parseFloat(price); Login loginBean=null; HttpSession session=request.getSession(true); try{ loginBean=(Login)session.getAttribute("loginBean"); boolean b =loginBean.getLogname()==null|| loginBean.getLogname().length()==0; if(b) response.sendRedirect("login.jsp");//重定向到登录页面 } catch(Exception exp){ response.sendRedirect("login.jsp");//重定向到登录页面 } String uri="jdbc:mysql://localhost/shop?user=root&password=123456&useSSL=false&serverTimezone=GMT+8&characterEncoding=utf-8&autoReconnect=true"; Connection con; PreparedStatement sql; try{ con=DriverManager.getConnection(uri); String insertCondition="INSERT INTO orderform VALUES (?,?,?,?)"; sql=con.prepareStatement(insertCondition); sql.setInt(1,0); //订单序号会自定增加 sql.setString(2,loginBean.getLogname()); sql.setString(3,buyGoodsMess); sql.setFloat(4,sum); sql.executeUpdate(); LinkedList car=loginBean.getCar(); car.clear(); //清空购物车 success(request,response,"生成订单成功"); } catch(SQLException exp){ fail(request,response,"生成订单失败"+exp); } } public void doGet(HttpServletRequest request,HttpServletResponse response) throws ServletException,IOException { doPost(request,response); } public void success(HttpServletRequest request,HttpServletResponse response, String backNews) { response.setContentType("text/html;charset=GB2312"); try { PrintWriter out=response.getWriter(); out.println("<html><body>"); out.println("<h2>"+backNews+"</h2>") ; out.println("返回主页<br>"); out.println("<br><a href =index.jsp>主页</a>"); out.println("查看订单<br>"); out.println("<br><a href =lookOrderForm.jsp>查看订单</a>"); out.println("</body></html>"); } catch(IOException exp){} } public void fail(HttpServletRequest request,HttpServletResponse response, String backNews) { response.setContentType("text/html;charset=GB2312"); try { PrintWriter out=response.getWriter(); out.println("<html><body>"); out.println("<h2>"+backNews+"</h2>") ; out.println("返回主页:"); out.println("<a href =index.jsp>主页</a>"); out.println("</body></html>"); } catch(IOException exp){} }}
四、运行截图
五、spingmvc总结
springmvc运行原理
核心架构的具体流程步骤如下:
1、 首先用户发送请求——>DispatcherServlet,前端控制器收到请求后自己不进行处理,而是委托给其他的解析器进行处理,作为统一访问点,进行全局的流程控制;
2、DispatcherServlet——>HandlerMapping,HandlerMapping将会把请求映射为HandlerExecutionChain对象(包含一个Handler处理器(页面控制器)对象、多个HandlerInterceptor拦截器)对象,通过这种策略模式,很容易添加新的映射策略;
3、 DispatcherServlet——>HandlerAdapter,HandlerAdapter将会把处理器包装为适配器,从而支持多种类型的处理器,即适配器设计模式的应用,从而很容易支持很多类型的处理器;
4、 HandlerAdapter——>处理器功能处理方法的调用,HandlerAdapter将会根据适配的结果调用真正的处理器的功能处理方法,完成功能处理;并返回一个ModelAndView对象(包含模型数据、逻辑视图名);
5、 ModelAndView的逻辑视图名——> ViewResolver, ViewResolver将把逻辑视图名解析为具体的View,通过这种策略模式,很容易更换其他视图技术;
6、 View——>渲染,View会根据传进来的Model模型数据进行渲染,此处的Model实际是一个Map数据结构,因此很容易支持其他视图技术;
7、返回控制权给DispatcherServlet,由DispatcherServlet返回响应给用户,到此一个流程结束。