现在几乎所有的B/S结构的软件都要使用MVC模式层次划分,它不仅可以能使代码结构更加清楚,还可以使项目分工更加明确,可读性大大提升,更加有利于后期的维护和升级。多的不说,直接进行介绍。
我们可以结合MVC将JavaWeb项目分为五层结构,分别是模型层、数据访问层、业务逻辑层、控制逻辑层和界面层。
上边这张图片是一个例子,在项目文件夹下新建四个文件夹,名字分别为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)
这个接口中,写了以下这些方法,待会都需要用具体的实现类来实现。
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,并实现方法。
读者应视具体情况具体分析)
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层。
如上,先同样地,创建接口和实现类。
接口代码如下
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即可。
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项目中代码分层的方案,通过分层之后可以使每一层更加专注,解除耦合,利于项目组成员分工合作。