我们首先要完成的界面为从用户看到的输入用户名和密码框进入系统内部:
1、编写前端页面:
我们的代码如下所示:我们在webapps文件夹下设置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" />
<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 }/user/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.设置首页
我们在web.xml里面写入如下代码所示:
<!--设置欢迎页面-->
<welcome-file-list>
<welcome-file>/login.jsp</welcome-file>
</welcome-file-list>
我们运行之后如下所示:
我们已经进入首页了,我们下面来判断用户名是否成功,我们要通过用户名得到他的一些的方法。一般习惯,从底层往上写:
3.编写dao层登录用户登录的接口:
我们在dao层下面创建一个user,创建一个接口UserDao:
package com.rgf.dao.user;
import com.rgf.pojo.User;
import java.sql.Connection;
import java.sql.SQLException;
//面向接口的感觉
//得到要登录的用户信息
public interface UserDao {
public User getLoginInfo(Connection conn,String userCode) throws SQLException;
}
我们下来进行编写关于这个接口的实现类UserDaoImpl
4.编写dao层接口的实现类:
package com.rgf.dao.user;
import com.rgf.dao.BaseDao;
import com.rgf.pojo.User;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
//登录 判断 的实现类
public class UserDaoImpl implements UserDao {
@Override
//得到要登录的用户信息,首先去查找数据库
public User getLoginInfo(Connection conn, String userCode) throws SQLException {
PreparedStatement preparedStatement = null;
ResultSet rs = null;
User user = null;
//准备三个对象,判断数据库连接是否成功,如果连接成功,给他丢一个SQL,并且执行SQL
//我们进行判断,是否传入这个连接,否则会抱有异常
if(conn!=null){
//编写sql语句
String sql = "select * from smbms_user where userCode = ?";
//存放参数
Object[] params = {userCode};
//使用预处理对象调用 操作数据库的公共类 的执行 sql查询语句
rs = BaseDao.execute(conn, sql, preparedStatement, params,rs);
//得到登录的用户
//查出来之后,他是一个用户,我们把这个用户封装到一个用户里面并且把封装好的用户进行返回给咱们需要调用的人。
//遍历结果集 封装到一个用户中
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.setCreateDate(rs.getTimestamp("creationDate"));
user.setModifyBy(rs.getInt("modifyBy"));
user.setModifyDate(rs.getTimestamp("modifyDate"));
}
//调用 操作数据库的公共类 的执行 释放资源
BaseDao.closeResource(null,preparedStatement,rs);
}
//返回一个用户
return user;
}
}
5.业务层接口,我们写一个接口搞定dao层就可以了。
package com.rgf.service.user;
import com.rgf.pojo.User;
//我们的业务也是去做登录
public interface UserService {
//用户登录
public abstract User login(String userCode,String passWord);
}
6.业务层实现类:
package com.rgf.service.user;
import com.rgf.dao.BaseDao;
import com.rgf.dao.user.UserDao;
import com.rgf.dao.user.UserDaoImpl;
import com.rgf.pojo.User;
import java.sql.Connection;
import java.sql.SQLException;
//用户登录的业务层实现类
public class UserServiceImpl implements UserService {
//业务层肯定是调用dao层的,所以我们要引入dao层
private UserDao userDao;
//设置一个方法
public UserServiceImpl(){
//一旦new出来UserServiceImpl的时候,UserServiceImpl就被实例化了,这样子就可以使用UserServiceImpl。
userDao =new UserDaoImpl();
}
@Override
//业务层需要拿账号和密码进行判断,用户名和密码是前端发送过来的
//(String userCode, String passWord)两个参数对应是的首页传来的值
public User login(String userCode, String passWord) {
Connection conn = null; //获取一个connection连接对象,因为我们要调用dao层
User user = null;//获取这个对象之后,我们还会得到一个用户,然后返回他
try {
//调用 dao层操作数据库的公共类方法 获取数据库的连接
//通过业务层调用对应的具体的数据库操作
conn = BaseDao.getConnection();
//得到连接之后,我们需要去做查询
//得到连接后 开始查询 通过业务层调用具体的数据库操作
user = userDao.getLoginInfo(conn, userCode);
} catch (SQLException e) {
e.printStackTrace();
}finally {
//关闭资源
BaseDao.closeResource(conn,null,null);
}
//这样子调用这个方法的人就可以拿到这个用户。
return user;
}
}
我们在后面代码的测试过程中,我们要首先对我们的数据表进行查看,我们要以表中有的UserCode和password为依据进行查询。我们测试之后如下所示:
我们成功的将密码进行查询到了。
7.编写Servlet
我们在编写servlet的过程中需要用到如下所示:
foot.jsp:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<footer class="footer">
超市订单管理系统
</footer>
<script type="text/javascript" src="${pageContext.request.contextPath }/js/time.js"></script>
<script type="text/javascript" src="${pageContext.request.contextPath }/js/jquery-1.8.3.min.js"></script>
<script type="text/javascript" src="${pageContext.request.contextPath }/js/common.js"></script>
<script type="text/javascript" src="${pageContext.request.contextPath }/calendar/WdatePicker.js"></script>
</body>
</html>
head.jsp:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %>
<!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" />
<link type="text/css" rel="stylesheet" href="${pageContext.request.contextPath }/css/public.css" />
</head>
<body>
<!--头部-->
<header class="publicHeader">
<h1>超市订单管理系统</h1>
<div class="publicHeaderR">
<p><span>下午好!</span><span style="color: #fff21b"> ${user.userName }</span> , 欢迎你!</p>
<a href="${pageContext.request.contextPath }/user/logout">退出</a>
</div>
</header>
<!--时间-->
<section class="publicTime">
<span id="time">2015年1月1日 11:11 星期一</span>
<a href="#">温馨提示:为了能正常浏览,请使用高版本浏览器!(IE10+)</a>
</section>
<!--主体内容-->
<section class="publicMian ">
<div class="left">
<h2 class="leftH2"><span class="span1"></span>功能列表 <span></span></h2>
<nav>
<ul class="list">
<li ><a href="${pageContext.request.contextPath }/bill/bill?method=query">订单管理</a></li>
<li><a href="${pageContext.request.contextPath }/pro/provider?method=query">供应商管理</a></li>
<li><a href="${pageContext.request.contextPath }/user/query?method=query">用户管理</a></li>
<li><a href="${pageContext.request.contextPath }/user/pwdmodify">密码修改</a></li>
<li><a href="${pageContext.request.contextPath }/user/logout">退出系统</a></li>
</ul>
</nav>
</div>
<input type="hidden" id="path" name="path" value="${pageContext.request.contextPath }"/>
<input type="hidden" id="referer" name="referer" value="<%=request.getHeader("Referer")%>"/>
frame.jsp:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@include file="common/head.jsp" %>
<div class="right">
<img class="wColck" src="${pageContext.request.contextPath }/images/clock.jpg" alt=""/>
<div class="wFont">
<h2>${user.userName }</h2>
<p>欢迎来到超市订单管理系统!</p>
</div>
</div>
</section>
<%@include file="common/foot.jsp" %>
之后我们编写servlet层代码:
package com.rgf.servlet.user;
import com.rgf.pojo.User;
import com.rgf.service.user.UserService;
import com.rgf.service.user.UserServiceImpl;
import com.rgf.util.Constants;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class LoginServlet extends HttpServlet {
//Servlet:控制层,调用业务层代码
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("LoginServlet--start....");
//获取用户名和密码
String userCode = req.getParameter("userCode");
String userPassword = req.getParameter("userPassword");
//和数据库中的密码进行对比,调用业务层;
UserService userService = new UserServiceImpl();
User user = userService.login(userCode, userPassword);
//这里已经把登录的人给查出来了
System.out.println(userCode);
System.out.println(userPassword);
if (user!=null){ //查有此人,可以登录
//登录成功之后一般会将用户的信息放到Session中;
req.getSession().setAttribute(Constants.USER_SESSION,user);
//登录成功之后跳转到内部主页
resp.sendRedirect("jsp/frame.jsp");
}else {//查无此人,无法登录
//转发回登录页面,顺带提示它,用户名或者密码错误;
//如果错了就要回到login.jsp,顺道带上消息
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,代码在web.xml里面进行设置如下所示:
<!--Servlet-->
<servlet>
<servlet-name>LoginServlet</servlet-name>
<servlet-class>com.rgf.servlet.user.LoginServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>LoginServlet</servlet-name>
<!--此地址为在login.jsp里面的form标签里面的action属性所指示的地址-->
<url-pattern>/login.do</url-pattern>
</servlet-mapping>
如果我们注册成功后,我们设置一个常量放在until包下面的Constants类里面:
package com.rgf.util;
public class Constants {
public final static String USER_SESSION="userSession";
}
我们的逻辑如下所示:
我们前端<form>标签下的<action>属性所标的地址,我们就到了web.xml里面所注册的地址,到达web.xml里面的servlet地址后,我们就进行调用servlet。到达servlet包下的LoginServlet类,进行处理代码,我们进行查询,通过service层下的UserService接口,进入UserServiceImpl的实现类。查询的过程中,我们再进行调用数据库的层。我们通过dao层下面的UserDao接口进入UserDaoImpl的实现类。到达底层代码,我们就将其查询出来了。
如果登录成功,用户放到session里面,就可以用了。如果登录失败就提示查无此人。
我们代码的结构就是如下所示:
servlet层负责接收用户参数,调用业务层以及转发视图,业务层service可以处理具体的业务就可以啦,Dao层做查询数据库的事情,前端负责展示页面。
9.测试访问,确保以上功能成功.
我们的运行界面如下所示:
之后我们找到数据库里面存有的数据进行登录.
如下所示: