现在几乎所有的B/S结构的软件都要使用MVC模式层次划分,它不仅可以能使代码结构更加清楚,还可以使项目分工更加明确,可读性大大提升,更加有利于后期的维护和升级。多的不说,直接进行介绍。

我们可以结合MVC将JavaWeb项目分为五层结构,分别是模型层、数据访问层、业务逻辑层、控制逻辑层和界面层。

java 网络七层架构 javaweb五层架构_mvc

上边这张图片是一个例子,在项目文件夹下新建四个文件夹,名字分别为bean(或者entity)、dao、service和controller。


一.模型层(bean、entity、model)

bean不做解释,就是我们的模型层。以下是博主写的用户实体,供参考。

package com.xwj.FormSystem.bean;


/**
 * 系统用户Entity
 * @author Xuwenjie
 * @version V1.0
 */
public class User {
    private String id;        //唯一标识  
    private String username;		// 用户名
    private String password;		// 密码
    private String pic;		// 头像
    private String role;		// 角色
    public User(){

    }
    public User(String id, String username, String password, String pic, String role) {
        this.id = id;
        this.username = username;
        this.password = password;
        this.pic = pic;
        this.role = role;
    }

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public String getPic() {
        return pic;
    }

    public void setPic(String pic) {
        this.pic = pic;
    }

    public String getRole() {
        return role;
    }

    public void setRole(String role) {
        this.role = role;
    }



}

二.数据访问层(DAO层)

DAO,本意为data access object,即数据访问对象。顾名思义,在这一层下,应包含对数据库的一系列操作(注意,是对数据库数据的操作,而不是代码中使用的临时数据变量)。此层为Service层和Controller层提供数据服务。

我们以UserDao为例,也就是用户数据访问对象。

应该尽量面向接口编程,所以我们先新建一个接口,名为UserDao(不必在意那个FormDao)

java 网络七层架构 javaweb五层架构_java 网络七层架构_02

 这个接口中,写了以下这些方法,待会都需要用具体的实现类来实现。

package com.xwj.FormSystem.dao;

import com.xwj.FormSystem.bean.User;

import java.sql.Connection;
import java.util.List;
//系统用户DAO接口
public interface UserDao {
    int add(Connection con, User user);
    int delete(Connection con,String id);
    int update(Connection con,User user);
    List<User> selectAll(Connection con);
    User login(Connection con,String username,String password);
    User checkRegister(Connection con,String username);

}

如读者所见,只是一些简单的增删改查(DAO层要做的大抵就是这些工作)

下面,创建实现类,名叫UserDaoImpl,并实现方法。

java 网络七层架构 javaweb五层架构_java 网络七层架构_03

读者应视具体情况具体分析)

package com.xwj.FormSystem.dao.impl;


import com.xwj.FormSystem.bean.User;
import com.xwj.FormSystem.dao.UserDao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;

/**
 * 系统用户DAO接口实现类
 * @author Xuwenjie
 * @version V1.0
 */
public class UserDaoImpl implements UserDao {
/**
 * 添加
 * @param con
 * @param user
 * @return
 */
@Override
public int add(Connection con, User user){
    try {
        String sql="insert into sys_user values(?,?,?,?,?)";
        PreparedStatement pstmt=con.prepareStatement(sql);
        pstmt.setString(1,user.getId());
        pstmt.setString(2,user.getUsername());
        pstmt.setString(3,user.getPassword());
        pstmt.setString(4,user.getPic());
        pstmt.setString(5,user.getRole());
        return pstmt.executeUpdate();
    }catch (Exception e){
        e.printStackTrace();
        return 0;
    }
}
    /**
     * 删除
     * @param con
     * @param id
     * @return
     */
    @Override
    public int delete(Connection con,String id){
        try {
            String sql="delete from sys_user where id=?";
            PreparedStatement pstmt=con.prepareStatement(sql);
            pstmt.setString(1, id);
            return pstmt.executeUpdate();
        }catch (Exception e){
            e.printStackTrace();
            return 0;
        }

    }
    /**
     * 更新
     * @param con
     * @param user
     * @return
     */
    @Override
    public int update(Connection con,User user){
        try {
            String sql="update sys_user set username=?,pic=?,role=?,password=? where id = ?";
            PreparedStatement pstmt=con.prepareStatement(sql);
            pstmt.setString(5,user.getId());
            pstmt.setString(1,user.getUsername());
            pstmt.setString(2,user.getPic());
            pstmt.setString(3,user.getRole());
            pstmt.setString(4,user.getPassword());
            return pstmt.executeUpdate();
        }catch (Exception e){
            e.printStackTrace();
            return 0;
        }
    }
    /**
     * 查询所有
     * @param con

     * @return
     */
    @Override
    public List<User> selectAll(Connection con){
        try {
            String sql="select * from sys_user where 1=1";
            PreparedStatement pstmt= con.prepareStatement(sql);
            ResultSet rs= pstmt.executeQuery();
            User entity=null;
            List<User> list = new ArrayList<>();
            while (rs.next()){
                entity=new User();
                entity.setId(rs.getString("id"));
                entity.setUsername(rs.getString("username"));
                entity.setPassword(rs.getString("password"));
                entity.setPic(rs.getString("pic"));
                entity.setRole(rs.getString("role"));
                list.add(entity);
            }
            return list;
        }catch (Exception e){
            e.printStackTrace();
            return null;
        }

    }
    /**
     * 根据用户名和密码查询
     * @param con
     * @param username
     * @param password
     * @return
     */
    @Override
    public User login(Connection con,String username,String password) {
        try {
            String sql="select * from sys_user where username=? and password=?";
            PreparedStatement pstmt= con.prepareStatement(sql);
            pstmt.setString(1,username);
            pstmt.setString(2,password);
            ResultSet rs= pstmt.executeQuery();
            if (rs.next()){
                User user=new User();
                user.setId(rs.getString("id"));
                user.setUsername(rs.getString("username"));
                user.setPassword(rs.getString("password"));
                user.setPic(rs.getString("pic"));
                user.setRole(rs.getString("role"));
                return user;
            }else return null;
        }catch (Exception e){
            e.printStackTrace();
            return null;
        }

    }
    /**
     * 根据用户名查询
     * @param con
     * @param username
     * @return
     */
    @Override
    public User checkRegister(Connection con,String username) {
        try {
            String sql="select * from sys_user where username=?";
            PreparedStatement pstmt= con.prepareStatement(sql);
            pstmt.setString(1,username);
            ResultSet rs= pstmt.executeQuery();
            if (rs.next()){
                User user=new User();
                user.setId(rs.getString("id"));
                user.setUsername(rs.getString("username"));
                user.setPassword(rs.getString("password"));
                user.setPic(rs.getString("pic"));
                user.setRole(rs.getString("role"));
                return user;
            }else return null;
        }catch (Exception e){
            e.printStackTrace();
            return null;
        }

    }
}

如此一来,一个UserDao就算是写完了(读者可以仔细阅读,因篇幅问题,此处不作代码的具体介绍)下面来介绍Service层。

三.业务逻辑层(Service层)

该层要做的工作是封装dao层,将dao层的方法封装起来,对外开放为一个服务。在Controller层中大量调用的是我们的Service层而不是直接使用dao层,dao层不应该暴露给Controller层。

java 网络七层架构 javaweb五层架构_mvc_04

 如上,先同样地,创建接口和实现类。

接口代码如下

package com.xwj.FormSystem.service;

import com.xwj.FormSystem.bean.User;

import java.util.List;
/**
 * 系统用户Service接口
 * @author Xuwenjie
 * @version V1.0
 */
public interface UserService {
    //增加
    int add(User user);
    //删除
    int delete(String id);
    //修改
    int update(User user);
    //查询所有
    List<User> selectAll();
    //根据用户名和密码查询
    User login(String username,String password);
    //根据用户名查询
    User checkRegister(String username);
}

实现类代码为:

package com.xwj.FormSystem.service.impl;

import com.xwj.FormSystem.bean.User;
import com.xwj.FormSystem.dao.UserDao;
import com.xwj.FormSystem.dao.impl.UserDaoImpl;
import com.xwj.FormSystem.service.UserService;
import com.xwj.FormSystem.utils.JDBCUtils;

import java.sql.Connection;
import java.util.List;
/**
 * 用户Service接口的实现类
 * @author Xuwenjie
 * @version V1.0
 */
public class UserServiceImpl implements UserService {
    UserDao userDao=new UserDaoImpl();
    @Override
    public int add(User user) {
        try {
            Connection con = JDBCUtils.getConnection();
            Integer result =userDao.add(con, user);
            JDBCUtils.Release_con(con);
            return result;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return 0;
    }

    @Override
    public int delete(String id) {
        try {
            Connection con = JDBCUtils.getConnection();
            Integer result =userDao.delete(con, id);
            JDBCUtils.Release_con(con);
            return result;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return 0;
    }

    @Override
    public int update(User user) {
        try {
            Connection con = JDBCUtils.getConnection();
            Integer result =userDao.update(con, user);
            JDBCUtils.Release_con(con);
            return result;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return 0;
    }

    @Override
    public List<User> selectAll() {
        try {
            Connection con = JDBCUtils.getConnection();
            List<User> result =userDao.selectAll(con);
            JDBCUtils.Release_con(con);
            return result;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    @Override
    public User login(String username,String password) {
        try {
            Connection con = JDBCUtils.getConnection();
            User result =userDao.login(con,username,password);
            JDBCUtils.Release_con(con);
            return result;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    @Override
    public User checkRegister(String username) {
        try {
            Connection con = JDBCUtils.getConnection();
            User result =userDao.checkRegister(con,username);
            JDBCUtils.Release_con(con);
            return result;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
}

以上代码中 获取连接

四.控制逻辑层(Controller层)

控制器层(也就是一些Servlet),用于接收参数并返回数据,Controller层不需要面向接口,直接在文件夹下创建Servlet即可。

java 网络七层架构 javaweb五层架构_java_05

 UserController代码如下:

package com.xwj.FormSystem.controller;

import com.xwj.FormSystem.bean.User;
import com.xwj.FormSystem.service.UserService;
import com.xwj.FormSystem.service.impl.UserServiceImpl;
import net.sf.json.JSONArray;

import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

/**
 * 用户  控制器
 * @author 程序员许文杰
 * @version V1.0
 */

@WebServlet(name = "UserController", value = "/UserController")
public class UserController extends HttpServlet {
    UserService userService = new UserServiceImpl();
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");
        String method = request.getParameter("method");
        try {
            if (method.equals("add")){
                add(request,response);
            }else if (method.equals("login")){
                login(request,response);
            }else if (method.equals("delete")){
                delete(request,response);
            }else if (method.equals("update")){
                update(request,response);
            }else if (method.equals("selectAll")){
                selectAll(request,response);
            }

        }catch (Exception e){
            e.printStackTrace();
            response.getWriter().write("系统出现异常,请稍后再试");
        }

    }

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

    /**
     * 添加 (注册)
     */
    private void add(HttpServletRequest request, HttpServletResponse response) throws Exception {
        String username = request.getParameter("username");
        String contextPath = request.getServletContext().getContextPath();

        User user= userService.checkRegister(username);
        if (user==null){
            String id = request.getParameter("id");
            String password = request.getParameter("password");
            String pic = request.getParameter("pic");
            String role = request.getParameter("role");
            user = new User();
            user.setId(id);
            user.setUsername(username);
            user.setPassword(password);
            user.setPic(pic);
            user.setRole(role);
            userService.add(user);
            //注册完成后自动登录
            response.sendRedirect(contextPath+"/user?method=login&username=" + username + "&" + "password=" + password);
        }else {
            response.getWriter().write("用户名已被注册");
        }

    }

/**
     * 删除
     */
    private void delete(HttpServletRequest request, HttpServletResponse response) throws Exception {
        String id = request.getParameter("id");
        userService.delete(id);
    }
/**
     * 更新
     */
    private void update(HttpServletRequest request, HttpServletResponse response) throws Exception {
        String id = request.getParameter("id");
        String username = request.getParameter("username");
        String password = request.getParameter("password");
        String pic = request.getParameter("pic");
        String role = request.getParameter("role");
        User user = new User();
        user.setId(id);
        user.setUsername(username);
        user.setPassword(password);
        user.setPic(pic);
        user.setRole(role);
        userService.update(user);
    }
/**
     * 查询所有
     */
    private void selectAll(HttpServletRequest request, HttpServletResponse response) throws Exception {
        List<User> userList = userService.selectAll();
        JSONArray jsonArray = JSONArray.fromCollection(userList);
        response.getWriter().write(jsonArray.toString());
    }

    public static void main(String[] args) {
        //测试查询
        List<User> userList = new ArrayList<>();
        User user1 = new User("sadad12wdsac", "xwj", "woshikey", "path", "VIP");
        userList.add(user1);
        JSONArray jsonArray = JSONArray.fromCollection(userList);
        System.out.println(jsonArray.toString());
    }
/**
     * 登录
     */

    private void login(HttpServletRequest request, HttpServletResponse response) throws Exception {
        String username=request.getParameter("username");
        String password=request.getParameter("password");
        User user= userService.login(username,password);
        if (user!=null){
            response.getWriter().write("登录成功");
            request.getSession().setAttribute("user",user);
            System.out.println(username+"登录成功!");
        }else {
            response.getWriter().write("用户名或密码不正确");
        }
    }
}

在Controller中根据页面传来的参数为用户调用不同的服务。

以上代码都是博主手写,可能不是最佳架构,这仅供读者学习查阅使用。

五.界面层

界面层包括html页面和jsp页面,用于将数据可视化。

小结

本文主要介绍了Java Web项目中代码分层的方案,通过分层之后可以使每一层更加专注,解除耦合,利于项目组成员分工合作。