SMBMS超市订单管理系统的网站源码

MVC三层架构(代码整体以此分层编写)

整体的流程与代码编写思路:

建议是从后往前写,便于调试与debug,先编写Dao层,主要负责与数据库交互,编写sql语句等。然后编写Servicce层,主要负责调用Dao层,再编写Servlet层,其也是主要调用Service和前端的一些数据交互,比如resquet和response等。

基本架构

项目搭建准备工作

1- 4

5 创建项目包结构

6-7


8 导致静态资源

放在webapp目录下,因为是网站资源

登录功能实现

1.编写前端页面 login.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head lang="en">
    <meta charset="UTF-8">
    <title>系统登录 - 超市订单管理系统</title>
    <link type="text/css" rel="stylesheet" href="${pageContext.request.contextPath }/css/style.css" rel="external nofollow"  />
    <script type="text/javascript">
	/* if(top.location!=self.location){
	      top.location=self.location;
	 } */
    </script>
</head>
<body class="login_bg">
    <section class="loginBox">
        <header class="loginHeader">
            <h1>超市订单管理系统</h1>
        </header>
        <section class="loginCont">
	        <form class="loginForm" action="${pageContext.request.contextPath }/login.do"  name="actionForm" id="actionForm"  method="post" >
				<div class="info">${error }</div>
				<div class="inputbox">
                    <label for="userCode">用户名:</label>
					<input type="text" class="input-text" id="userCode" name="userCode" placeholder="请输入用户名" required/>
				</div>
				<div class="inputbox">
                    <label for="userPassword">密码:</label>
                    <input type="password" id="userPassword" name="userPassword" placeholder="请输入密码" required/>
                </div>
				<div class="subBtn">

                    <input type="submit" value="登录"/>
                    <input type="reset" value="重置"/>
                </div>
			</form>
        </section>
    </section>
</body>
</html>

2.设置首页

<!--设置欢迎界面-->
    <welcome-file-list>
        <welcome-file>login.jsp</welcome-file>
    </welcome-file-list>

3.编写Dao层用户登录的接口

Dao层(数据持久层)负责操作数据库,业务(比如用户登录,比对账号密码)有业务层负责。

public User getLoginUser(Connection connection, String userCode)throws Exception;

4.编写Dao接口实现类

public User getLoginUser(Connection connection, String userCode) throws Exception {
		// TODO Auto-generated method stub
		PreparedStatement pstm = null;
		ResultSet rs = null;
		User user = null;
		if(null != connection){
			String sql = "select * from smbms_user where userCode=?";
			Object[] params = {userCode};
			rs = BaseDao.execute(connection, pstm, rs, sql, params);
			if(rs.next()){
				user = new User();
				user.setId(rs.getInt("id"));
				user.setUserCode(rs.getString("userCode"));
				user.setUserName(rs.getString("userName"));
				user.setUserPassword(rs.getString("userPassword"));
				user.setGender(rs.getInt("gender"));
				user.setBirthday(rs.getDate("birthday"));
				user.setPhone(rs.getString("phone"));
				user.setAddress(rs.getString("address"));
				user.setUserRole(rs.getInt("userRole"));
				user.setCreatedBy(rs.getInt("createdBy"));
				user.setCreationDate(rs.getTimestamp("creationDate"));
				user.setModifyBy(rs.getInt("modifyBy"));
				user.setModifyDate(rs.getTimestamp("modifyDate"));
			}
			//connection设成null不让其关闭,是因为后面业务层还需要数据库连接。
			BaseDao.closeResource(null, pstm, rs);
		}
		return user;
	}

5.业务层接口

业务层都会调用Dao层,来获取业务所需的数据。

public interface UserService {
	 //用户登录
	public User login(String userCode, String userPassword);
}

6.业务层实现类

  • 因为业务层要调用Dao层(来获取数据库的数据),调用Dao层,就需要给它传参数,则connection此时传给Dao层,所以connection对象在业务层创建。
  • 业务层存在事务,失败了会回滚。,所以connection对象在业务层创建。
public class UserServiceImpl implements UserService{

	private UserDao userDao;
	public UserServiceImpl(){
		userDao = new UserDaoImpl();
	}
	public User login(String userCode, String userPassword) {
		// TODO Auto-generated method stub
		Connection connection = null;
		User user = null;
		try {
			connection = BaseDao.getConnection();
			user = userDao.getLoginUser(connection, userCode);
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}finally{
			BaseDao.closeResource(connection, null, null);
		}

		//匹配密码
		if(null != user){
			if(!user.getUserPassword().equals(userPassword))
				user = null;
		}

		return user;
	}
}

7.编写servlet

  • servlet是控制层,用来调用业务层
  • 控制层的作用:接受用户的请求交给业务层去做,这里用户的请求是登录(输入用户名和密码请求登录),业务层要做的是在数据库中匹配输入的用户名和密码。
public class LoginServlet extends HttpServlet {
    //servlet:控制层,接收用户的请求,调用业务层代码。

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //从前端获取用户名和密码(接收用户的请求)
        String userCode = req.getParameter("userCode");
        String userPassword = req.getParameter("userPassword");

        //接收请求后需处理业务,业务是:和数据库中的数据进行对比,所以需调用业务层
        UserServiceImpl userService = new UserServiceImpl();
        User user = userService.login(userCode, userPassword);//这里已经把登录的人给查出来了

        if(user != null){//查有此人,可以登录
            //将用户的信息放入Session中
            req.getSession().setAttribute(Constant.USER_SESSION , user);
            //跳转主页(跳转到另一个页面,地址变了,所以用重定向)
            resp.sendRedirect("jsp/frame.jsp");

        }else{//查无此人,无法登录
            //转发会登录页面,顺带提示它,用户名或密码错误。((跳转到本页面,只是在本页面加了些信息(用户名或密码错误),地址没变,所以用请求转发))
            req.setAttribute("error" , "用户名或密码错误");//请求可以携带数据
            req.getRequestDispatcher("login.jsp").forward(req , resp);

        }

    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}

8.注册servlet

<!--servlet-->
    <servlet>
        <servlet-name>LoginServlet</servlet-name>
        <servlet-class>com.tong.servlet.user.LoginServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>LoginServlet</servlet-name>
        <url-pattern>/login.do</url-pattern>
    </servlet-mapping>

整体流程

前端一启动,执行login.jsp(设置成了首页),直接到web.xml中设置的login.do(servlet映射),调用对应的控制器servlet(LoginServlet),servlet中会调用业务(UserServiceImpl),然后业务会调用想用的Dao(UserDaoImpl)来获取数据。

登录功能优化

注销功能:

思路:移除session,返回登录界面;

LogoutServlet

public class LogoutServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        req.getSession().removeAttribute(Constant.USER_SESSION);
        resp.sendRedirect(req.getContextPath() + "/login.jsp");
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}

注册

<!--注销-->
    <servlet>
        <servlet-name>LogoutServlet</servlet-name>
        <servlet-class>com.tong.servlet.user.LogoutServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>LogoutServlet</servlet-name>
        <url-pattern>/jsp/logout.do</url-pattern>
    </servlet-mapping>

登陆拦截优化

为什么要登陆拦截优化

  • 正常登陆后,将登录界面的网址复制下来,在注销后的登录界面,黏贴复制的网址,在没填用户名和密码的前提下,进入了系统。所以需要登录拦截
  • 拦截判断的条件是 session中有无user这个属性,因为在用户注销,或还没登录的情况下,session中没有user这个属性,如果没有,说明不是正常登录,进行拦截;只有当正常登录时,会创建session中user这个属性,此时可以正常登录。


注销后,黏贴网址,依然能登录进来,需进行拦截。

具体步骤

编写一个过滤器,并注册

public class SysFilter implements Filter {
    public void init(FilterConfig filterConfig) throws ServletException {

    }

    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws IOException, ServletException {
        HttpServletRequest request = (HttpServletRequest) req;
        HttpServletResponse response = (HttpServletResponse) resp;

        //过滤器,从session中获取用户
        User user = (User) request.getSession().getAttribute(Constant.USER_SESSION);
        if(user == null){//session已经被移除,或者用户注销,或还没登录
            response.sendRedirect("error.jsp");
        }else{
            chain.doFilter(req , resp);
        }
    }

    public void destroy() {

    }
}
<!--用户登录过滤器-->
    <filter>
        <filter-name>SysFilter</filter-name>
        <filter-class>com.tong.filter.SysFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>SysFilter</filter-name>
        <url-pattern>/jsp/*</url-pattern>
    </filter-mapping>

密码修改

密码修改,需要和数据库打交道,所以还需要走dao层、service层、servlet层这一条线。

  • Dao层:根据用户ID修改用户密码(update语句);
  • service层:接收传过来的密码和调用Dao获取后台的密码,作对比。
  • servlet层:把框里输入的新旧密码拿到,交给业务层。

1.导入前端素材

2.写项目,建议从下向上写

3.编写Dao层修改当前用户密码接口

public interface UserDao

    //修改当前用户密码
	//增删改返回的都是int类型,查找返回对应的实体类;
	public int updatePwd(Connection connection, int id, String pwd)throws Exception;

4.编写Dao接口实现类

public class UserDaoImpl implements UserDao

public int updatePwd(Connection connection, int id, String pwd)
			throws Exception {
		// TODO Auto-generated method stub
		int flag = 0;
		PreparedStatement pstm = null;
		if(connection != null){
			String sql = "update smbms_user set userPassword= ? where id = ?";
			Object[] params = {pwd,id};
			flag = BaseDao.execute(connection, pstm, sql, params);
			BaseDao.closeResource(null, pstm, null);
		}
		return flag;
	}

5.业务层接口

public interface UserService

//根据userId修改密码
	public boolean updatePwd(int id, String pwd);

6.业务层接口实现类

  • 因为业务层要调用Dao层(来获取数据库的数据),调用Dao层,就需要给它传参数,则connection此时传给Dao层,所以connection对象在业务层创建。
  • 业务层存在事务,失败了会回滚。,所以connection对象在业务层创建。
  • public class UserServiceImpl implements UserService
public boolean updatePwd(int id, String pwd) {
		boolean flag = false;//使用标志位,判断密码是否修改成功。
		Connection connection = null;
		try{
			connection = BaseDao.getConnection();
			if(userDao.updatePwd(connection,id,pwd) > 0)
				flag = true;
		}catch (Exception e) {
			e.printStackTrace();
		}finally{
			BaseDao.closeResource(connection, null, null);
		}
		return flag;
	}

7.servlet记得实现复用需要提取出方法

//实现servlet复用
public class UserServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String method = req.getParameter("method");
        if(method.equals("savepwd")){
            this.updatePwd(req , resp);
        }
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }

    public void updatePwd(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //从session里拿Uer实体类
        Object o = req.getSession().getAttribute(Constant.USER_SESSION);
        String newPassword = req.getParameter("newPassword");

        boolean flag = false;
        if(o != null && newPassword != null && newPassword.length() != 0){//Uer实体类和新密码newPassword都拿到了,开始调用业务层
            UserServiceImpl userService = new UserServiceImpl();
            flag = userService.updatePwd(((User) o).getId(), newPassword);
            if(flag){
                req.setAttribute("message" , "修改密码成功,请退出,使用新密码登录");
                //密码修改成功,当前session。因为密码变了,session的内容自然也变了,所以需要移除,又因为密码变了需要重新登录,所以session会重新创建
                req.getSession().removeAttribute(Constant.USER_SESSION);
            }else {
                req.setAttribute("message" , "密码修改失败");
            }
        }else{
            req.setAttribute("message" , "新密码有问题");
        }

        req.getRequestDispatcher("pwdmodify.jsp").forward(req , resp);

    }
}

到此这篇关于SMBMS超市订单管理系统的文章就介绍到这了,更多相关SMBMS超市订单管理系统内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • java学生管理系统界面简单实现(全)

    学生管理系统简单的实现,供初学Java Swing同学学习使用. import java.awt.Dimension; import java.awt.Toolkit; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JLabel; import jav

  • 图书管理系统java代码实现

    本文实例为大家分享了java实现图书管理系统的具体代码,供大家参考,具体内容如下 /* (程序头部注释开始) * 程序的版权和版本声明部分 * Copyright (c) 2011, 烟台大学计算机学院学生 * All rights reserved. * 文件名称:    <图书管理系统--java>                          * 作    者:       刘江波                       * 完成日期:    2012     年  3    

  • java实现简单超市管理系统

    本文实例为大家分享了java实现超市管理系统的具体代码,供大家参考,具体内容如下 一.使用技术 javaSE 二.实现功能 超市管理系统 具体要求如下: 使用选择结构,循环结构,数组的知识实现一个超市管理系统 三.运行效果图 1.货物清单 2.增加货物 3.删除货物 4.修改货物 5.退出 首先我们分析图片里的内容,需要创建一个货物类. public class Goods { private String number; private double price; private String

  • java实现水果超市管理系统

    本文为大家分享了java实现水果超市管理系统的具体代码,供大家参考,具体内容如下 首先建立水果类的界面 public class Fruit { //定义ID private String id; //定义名称 private String name; //定义价格 private int price; //定义单位 private String unit; //定义数量 private int number; public Fruit(String id, String name, int p

  • Java+MySQL实现图书管理系统(完整代码)

    (完整代码+实训报告): 链接: https://pan.baidu.com/s/1E6BhEaHMa6Wch5yf6YAjOA 提取码: vnrx 觉着有用就点个赞哦~ 一,功能 管理员登录 图书借阅信息管理 图书信息管理 管理员更改密码 退出系统 二,工具 Eclipse Version: 2018-09 (4.9.0) MySQL Workbench 8.0 CE mysql-connector-java-8.0.13.jar 三.效果图: 登录界面: 主界面: 借阅书籍管理: 个人书库管

  • Java+Swing实现医院管理系统的完整代码

    一.系统介绍 本系统实现的以下功能 管理员功能:登录系统.病人信息的增删改查.就医档案的录入.医生信息的增删改查.科室信息的增删改查.收费统计功能.修改密码. 医生功能:登录系统.病人信息的增删改查.医生信息的增删改查.科室信息的增删改查.收费统计功能.修改密码. 收费员功能:价格管理.收费管理.修改密码. JDK版本:1.8 数据库:Mysql8.0.13 数据库用到的表 cashier charge department doctor drugtable manager medical_re

  • javaWeb实现学生信息管理系统

    本文为大家分享了javaWeb实现学生信息管理系统,供大家参考,具体内容如下 初始版 初始版是没有加分页的.因为没怎么学过前端,界面很丑陋.主要技术:JSP,JavaBean,servlet,JDBC主要页面如下: 登录页面 主页 添加学生 查看所有学生 查询学生 工程目录 数据库 两个表,user表和student表.为了使用DBUtils工具,一定要注意数据库表的属性的命名和JavaBean的get(),set() 方法的匹配.比如t_user表里的uname,在JavaBean中是:pri

  • SMBMS超市订单管理系统的网站源码

    MVC三层架构(代码整体以此分层编写) 整体的流程与代码编写思路: 建议是从后往前写,便于调试与debug,先编写Dao层,主要负责与数据库交互,编写sql语句等.然后编写Servicce层,主要负责调用Dao层,再编写Servlet层,其也是主要调用Service和前端的一些数据交互,比如resquet和response等. 基本架构 项目搭建准备工作 1- 4 5 创建项目包结构 6-7 8 导致静态资源 放在webapp目录下,因为是网站资源 登录功能实现 1.编写前端页面 login.j

  • 简单实现Android学生管理系统(附源码)

    本文实例讲述了Android实现学生管理系统,分享给大家供大家参考.具体如下: (1)管理系统实现的功能主要是:学生.教师的注册登录,和选课,以及修改学生的成绩等基本简单的功能,最主要的是实现一些Dialog的使用. 界面如下: (2)主要代码如下:(个人留作笔记,如需要完整代码,在最下边免费下载) 下边是一个适配器,适配器是为了一个listvie进行设置值,其中加载的是一个itemview,适配器中还是用了继承的方法,用于通知适配器进行更新. public class CourseAdapte

  • 基于jsp实现新闻管理系统 附完整源码

    很棒的新闻发布系统分享给大家,希望大家喜欢. 下面就让我们来说一说基于jsp的新闻发布系统,其中使用的技术有JavaBean.fillter.数据库等,能够实现新闻的发布功能,在发布之后能够进行对每一条新闻的删除.修改.或者继续增加新的文章,最后还能够进行查询功能,其中引用了百度编辑器,能够进行图文并茂的编辑,极大地方便用户的使用. 注:完整项目下载地址:新闻发布系统 一.效果演示 首先让我们来看一看实现的效果: 下面是登陆的首界面: 图1 首界面 管理员登录页面: 图2 管理员登录界面 下面是

  • java实现简易超市管理系统 附源码下载

    java超市管理系统 1.0(含源文件,后续会继续优化~) 前言 一个月零零散散的时间学习了java,通过这次"超市管理系统"的练习,希望可以给一同开始学习java的朋友一些参考,更希望大佬们多多指点和批评~ 一.确定需求 程序概述: 小型超市商品销售管理系统选择小型超市的四类商品进行管理. 这四类商品是:食品.化妆品.生活用品和饮料(四个类). 每类商品都包含有商品名和商品利润 (其中包括商品的售价.进价.库存量).(五个属性) 每类不同的商品还有区别于其他商品的特殊信息(子类特有属

  • ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统之前端页面框架构建源码分享

    开始,我们有了一系列的解决方案,我们将动手搭建新系统吧. 用户的体验已经需要越来越注重,这次我们是左右分栏,左边是系统菜单,右边是一个以tabs页组成的页面集合,每一个tab都可以单独刷新和关闭,因为他们会是一个iframe 工欲善其事必先利其器.需要用到以下工具. Visual Studio 2012 您可以安装MVC4 for vs2010用VS2010来开发,但是貌似你将不能使用EF5.0将会是EF4.4版本,但这没有多大的关系. MVC4将挂载在.NET Framework4.5上. 好

  • C语言学生管理系统源码分享

    本文实例为大家分享了C语言学生管理系统源码,供大家参考,具体内容如下 #include<stdio.h> #include<stdlib.h> //结构体可以存放的学生信息最大个数,不可变变量 int const MAX_LENGTH=100; //学生信息结构体数组,最多可以存放100个学生信息 struct student{ int id; //学号 char *name; //姓名 int age; //年龄 float c_score; //C语言成绩 float engl

  • java(swing)+ mysql实现学生信息管理系统源码

    本文实例为大家分享了java实现学生信息管理系统源码,供大家参考,具体内容如下 import java.awt.BorderLayout; import java.awt.Color; import java.awt.Font; import java.awt.GridLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.sql.Connection; import

  • Java+MySQL实现学生信息管理系统源码

    基于Java swing+MySQL实现学生信息管理系统:主要实现JDBC对学生信息进行增删改查,应付一般课设足矣,分享给大家.(由于篇幅原因,代码未全部列出,如有需要留下邮箱) 鉴于太多同学要源码,实在发不过来,上传到github上 https://github.com/ZhuangM/student.git 1. 开发环境:jdk7+MySQL5+win7 代码结构:model-dao-view 2. 数据库设计--建库建表语句: CREATE DATABASE student; DROP

  • C语言职工信息管理系统源码

    本文实例为大家分享了C语言职工信息管理系统的具体代码,供大家参考,具体内容如下 #include <stdio.h> #include <stdlib.h> #include <string.h> #include <conio.h> struct worker { char ID[20];//工号 char name[20];//姓名 char sex[5];//性别 char born[20];//生日 char edu[20];//学历 char po

  • java+SQL server2008学生信息管理系统源码

    本文实例为大家分享了java学生信息管理系统源码的具体代码,供大家参考,具体内容如下 1.StudetManage类(主界面) package com.sms3; import java.awt.*; import javax.swing.*; import java.awt.event.*; public class StudentManage extends JFrame implements ActionListener { /** * @param args */ public stat

随机推荐