- 开发工具:eclipse、tomcat、navicat、mysql8.0
- 开发技术:Java、html、css、JavaScript、jsp、springmvc。
源码地址:基于(springmvc+tomcat+JavaScript)实现化妆品商城系统-Javascript文档类资源-CSDN下载
功能实现:
项目描述:该化妆品销售系统可以实现顾客的注册、登录、浏览化妆品、查询化妆品、查看购物车、加入购物车、退出、主页。
一、eclipse中新建web项目。
创建Dynamic Web Project–动态web项目。
打开eclipse,在工具栏选在New–>Dynamic Web Project
二、建立如下图所示的工程目录,导入连接MySQL的jar包
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%2B8&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层。
1、模型:一个或多个javabean对象,用于存储数据和业务逻辑。
DataByPage.java
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 ;
}
}
Login,java
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;
}
}
2、控制器:一个或多个Servlet对象,根据视图提交的请求进行控制,即将请求转发给业务逻辑的javabean,并将处理记过存放到实体模型javabean中,输出给视图显示。
HandleBuyGoods.java
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%2B8&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){}
}
}
HandleDelete.java
package myservlet.control;
import mybean.data.Login;
import java.util.*;
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class HandleDelete extends HttpServlet {
public void init(ServletConfig config) throws ServletException {
super.init(config);
}
public void doPost(HttpServletRequest request,HttpServletResponse response)
throws ServletException,IOException {
request.setCharacterEncoding("gb2312");
String delete = request.getParameter("delete");
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");//重定向到登录页面
LinkedList<String> car = loginBean.getCar();
car.remove(delete);
}
catch(Exception exp){
response.sendRedirect("login.jsp");//重定向到登录页面
}
RequestDispatcher dispatcher=
request.getRequestDispatcher("lookShoppingCar.jsp");
dispatcher.forward(request, response);//转发
}
public void doGet(HttpServletRequest request,HttpServletResponse response)
throws ServletException,IOException {
doPost(request,response);
}
}
HandleExit.java
package myservlet.control;
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class HandleExit extends HttpServlet {
public void init(ServletConfig config) throws ServletException{
super.init(config);
}
public void doPost(HttpServletRequest request,HttpServletResponse response)
throws ServletException,IOException {
HttpSession session=request.getSession(true);
session.invalidate(); //销毁用户的session对象
response.sendRedirect("index.jsp"); //返回主页
}
public void doGet(HttpServletRequest request,HttpServletResponse response)
throws ServletException,IOException {
doPost(request,response);
}
}
四、功能实现及运行效果图
主页
注册页面
登录后的个人订单界面
购物车界面
订单界面
五、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返回响应给用户,到此一个流程结束。