手把手教学JavaWeb的设计模式 看了就会写

现在几乎所有的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 selectAll(Connection con);User login(Connection con,String username,String password);User checkRegister(Connection con,String username);}

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

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

 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*/@Overridepublic 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*/@Overridepublic 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*/@Overridepublic List 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 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*/@Overridepublic 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*/@Overridepublic 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 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();@Overridepublic 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;}@Overridepublic 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;}@Overridepublic 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;}@Overridepublic List selectAll() {try {Connection con = JDBCUtils.getConnection();List result =userDao.selectAll(con);JDBCUtils.Release_con(con);return result;} catch (Exception e) {e.printStackTrace();}return null;}@Overridepublic 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;}@Overridepublic 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;}
}

以上代码中 获取连接 的工具类需要先编写。即JDBCUtils。

四.控制逻辑层(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();@Overrideprotected 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("系统出现异常,请稍后再试");}}@Overrideprotected 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 userList = userService.selectAll();JSONArray jsonArray = JSONArray.fromCollection(userList);response.getWriter().write(jsonArray.toString());}public static void main(String[] args) {//测试查询List 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项目中代码分层的方案,通过分层之后可以使每一层更加专注,解除耦合,利于项目组成员分工合作。


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部