在前面的两篇文章中,完成了基础的登录与注册功能。接下来会介绍如何使用三层架构的方式来完成登录与注册功能的实现。
那么,什么是三层架构?为什么要使用三层架构?
三层架构:通常意义上的三层架构就是将整个业务应用划分为:界面层(User Interface layer, UIL)、业务逻辑层(Business Logic Layer, BLL)、数据访问层(Data access layer, DAL)。
界面层:与用户交互的界面,用于接收用户输入的数据和显示处理后用户需要的数据。
业务逻辑层:业务逻辑层的功能是对具体问题进行逻辑判断与执行操作。是界面层与数据访问层的中间桥梁,实现数据的获取、修改、删除、验算等。
数据访问层:主要实现对数据库的操作。将存储在数据库中的数据提交给业务层,将业务层处理的数据保存到数据库。
下面用一张图来表示三层架构:
我们可以看到,使用三层架构,结构清晰,条理清晰,耦合度低,虽然代码量增多了点,但是更加方便寻找相应的代码。登录案例
无论是采用什么方法,登录的功能的思路都是相同的:将输入的username and password与数据库中的数据进行比较,如果相同,那么登录成功,否则登录失败。
首先是前端界面:
获取前端界面中输入的用户名以及密码,传递到web层。包的结构:
在servlet包中新建LoginServlet,即web层,接收来自前端界面的username and password。将其传递给service层,同时接收到service层传递的信息之后,判断username and password是否与数据库中的数据相同,并给出两种不同的结果显示,也就是是否能够成功登录。登录成功跳转界面,登录失败则给出失败信息。
package com.hpu.edu.dong.web.servlet;
import java.io.IOException;
import java.net.URLEncoder;
import java.sql.SQLException;
import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import com.hpu.edu.dong.domain.User;
import com.hpu.edu.dong.service.UserService;
public class LoginServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("UTF-8");
//获取数据
HttpSession session = request.getSession();
String username=request.getParameter("username");
String password=request.getParameter("password");
UserService service=new UserService();
User user=null;
try {
user=service.login(username, password);
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
if(user!=null){
//登录成功
//将登录的用户的user对象存到session中
String autoLogin=request.getParameter("autoLogin");
session.setAttribute("user", user);//左边为名字,右边为值
response.sendRedirect(request.getContextPath());
}else{
//登录失败
request.setAttribute("loginInfo", "用户名或密码错误");
request.getRequestDispatcher("/login.jsp").forward(request, response);
}
}
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
service层:
package com.hpu.edu.dong.service;
import java.sql.SQLException;
import com.hpu.edu.dong.domain.User;
import com.hpu.edu.dong.dao.UserDao;
public class UserService {
public User login(String username, String password) throws SQLException {
// TODO Auto-generated method stub
UserDao dao=new UserDao();
return dao.login(username,password);
}
}
dao层:
package com.hpu.edu.dong.dao;
import java.sql.SQLException;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanHandler;
import com.hpu.edu.dong.domain.User;
import com.hpu.edu.dong.utils.DataSourceUtils;
public class UserDao {
public User login(String username, String password) throws SQLException {
// TODO Auto-generated method stub
QueryRunner runner=new QueryRunner(DataSourceUtils.getDataSource());
String sql="select * from [user] where username=? and password=?";
return runner.query(sql, new BeanHandler<User>(User.class), username,password);
}
}
登录失败:
登录成功:
登录的功能已经基本完成。至于登录成功时动态显示用户名:
<c:if test="${empty user }">
<li><a href="login.jsp">登录</a></li>
<li><a href="register.jsp">注册</a></li>
</c:if>
<c:if test="${!empty user }">
<li>欢迎您:${user.username }</li>
<li><a href="#">退出</a></li>
</c:if>
<li><a href="cart.jsp">购物车</a></li>
<li><a href="order_list.jsp">我的订单</a></li>
<li><a href="#">帮助中心</a></li>
如果用户名为空,也就是未输入用户名或者错误,那么就显示登录与注册,如果在登录界面已经实现了登录的功能,那么就动态显示用户名。