一个好的层次划分不仅可以能使代码结构更加清楚,还可以使项目分工更加明确,可读性大大提升,跟回家有利于后期的维护和升级。从另一个角度来看,好的代码分层架构,应该使可以很好的匹配上单一职责原则的。这样就可以降低层与层之间的依赖,还能最大承兑的复用各层的逻辑。
如果系统没有分层,当业务规模增加或流量增大时我们只能针对整体系统来做扩展。分层之后可以很方便的把一些模块抽离出来,独立成一个系统。
我们需要建三个包,分别是:bean、dao、util
dao层(数据访问层)这里与数据库进行数据的访问,service则是业务逻辑层,与数据访问层进行数据的交互,而controller则是控制层对前端的请求进行处理和响应。
bean包(实体类)里面都是实体类,更加方便的对数据进行操作。
uitl包(工具包)则是对经常用到的方法 进行封装。
在web项目下建一个index.jsp项目,用来编写首页
index.jsp位置所如下图所示:
我在首页设置两个超链接实现页面跳转,分别指向登录页面和注册页面。
如图下所示:
实现代码如下:
Java Web 去登录
去注册
在登录页面中我们需要用到JDBC连接数据库进行数据查询操作(判断用户输入的账号密码是否正确)
首先我们在web项目下建一个Login.jsp项目,用来编写登录页面。
Login.jsp位置如下图所示:
登录页面的展示:
实现登录页面代码如下:
登录 登录
在注册页面中我们需要用到JDBC连接数据库进行数据的添加操作(通过servlet获取浏览器发出请求中的数据添加到数据库中)
在实现添加数据之前我们先在web项目下建一个Enroll.jsp项目
Enroll.jsp位置如下图所示:
注册页面的展示:
实现注册页面的代码如下:
注册账号 注册
首先我们在web项目下建一个ShouYe.jsp
ShouYe.jsp位置如图下所示:
登录成功首页的展示:
实现代码如下:
首页 ![]()
简介 在钱塘开茶铺的赵盼儿惊闻未婚夫、新科谈话欧阳旭要另娶当朝高官之女,不甘命运的她誓要上京讨个公道。在途中她遇到了出自 权门但生性正直的皇城司指挥顾千帆,并卷入江南一场大案,两人不打不相识从而结缘。赵盼儿凭借智慧解救了被骗婚而惨遭虐待的“江南第一琵琶高手”宋印章与被苛刻 家人逼得离家出走的豪爽厨娘孙三娘,三位姐妹从此结伴而行,终抵东京见识世间繁华。为了不被另攀高枝的欧阳旭从京城赶走,赵盼儿与宋引章、孙三娘一起历尽艰辛,将小小茶坊一步步发展最大的酒楼,揭露了 负心人的真面目,收获了各自的真挚感情和人生感悟,也为无数平凡女子推开了一扇平等救赎之门。
我们在web项目下建一个Error.jsp
Error.jsp位置如图下所示:
出错页面的展示:
实现出错页面的代码如下:
404 出错了
返回登录界面
login com.hp.Servlet.Login login /login
建立user实体类的位置:
user实体类中的代码如下:
public class User { private Integer uid; private String username; private String password; private String phone; private String address; public Integer getUid() { return uid; } public void setUid(Integer uid) { this.uid = uid; } 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 getPhone() { return phone; } public void setPhone(String phone) { this.phone = phone; } public String getAddress() { return address; } public void setAddress(String address) { this.address = address; } @Override public String toString() { return "User{" + "uid=" + uid + ", username='" + username + '\'' + ", password='" + password + '\'' + ", phone='" + phone + '\'' + ", address='" + address + '\'' + '}'; } }
在Util包下建一个JDBCUtil类
JDBCUtil类位置如下:
JDBCUtil类中实现 获取连接 和 关闭资源 的代码如下:
public class JDBCUtil { private static String driver = "com.mysql.cj.jdbc.Driver"; private static String url = "jdbc:mysql://localhost:3306/mydb?useSSL=false&serverTimezone=UTC"; private static String user = "root"; private static String pwd = "123456"; private static Connection con = null; //测试 public static void main(String[] args) { System.out.println(getCon()); } //获取数据库连接方法 public static Connection getCon(){ try { //加载驱动 Class.forName(driver); //获取连接 con = DriverManager.getConnection(url, user, pwd); } catch (Exception e) { e.printStackTrace(); } //返回连接 return con; } //关闭资源方法 public static void loginClose(ResultSet rs, PreparedStatement pstm, Connection con){ try { if (rs!=null){ rs.close(); } if (pstm!=null){ pstm.close(); } if (con!=null){ con.close(); } }catch (Exception e){ e.printStackTrace(); } } }
首先我们在dao包下建一个UserDao接口类,用来实现登录和注册功能。
UserDao接口类位置如下:
UserDao接口类中的代码如下:
public interface UserDao { //登录方法 public User login(String username, String password); //注册方法 public int enroll(User user); }
然后我们在dao包先再建一个DaoImpl包,再impl包内建一个UserDaoImpl类,用来实现数据库的操作。
UserDaoImpl类位置如下:
UserDaoImpl类中的代码如下:
/** * 数据库数据类 */ public class UserDaoImpl implements UserDao { //数据库连接对象 Connection con = null;//连接对象 //预处理对象 PreparedStatement pstm = null;//与处理对象 //结果集对象 ResultSet rs = null;//结果集对象 int row ;//受影响的行数 //实例化对象 User register = null; //数据库登录操作 public User login (String username,String password){ User login = null; //下面的代码完成的事情: 需要用户名和密码 返回一个user对象 try { //调用util包下的jdbc连接方法 con = JDBCUtil.getCon(); //编写SQL语句 String sql = "select * from t_user where username = ? and password = ?"; //预处理SQL语句对象 pstm = con.prepareStatement(sql); //传参 pstm.setObject(1,username); pstm.setObject(2,password); //获取结果集对象 ,获取结果 rs = pstm.executeQuery(); if (rs.next()){ //实例化对象 login = new User(); //获取结果及对象 把数据传入User对象中 login.setUsername(rs.getString("username")); login.setPassword(rs.getString("password")); } }catch (Exception e){ e.printStackTrace(); }finally { //调用关闭资源方法 JDBCUtil.loginClose(rs,pstm,con); } //返回User结果 return login; } //数据库注册操作 @Override public int enroll(User register) { //下面的代码完成的事情: 获取用户输入的数据添加到数据库中 try { //调用util包下的jdbc连接方法 con = JDBCUtil.getCon(); //编写SQL语句 String sql = "insert into t_user(username,password,phone,address) values(?,?,?,?);"; //预处理SQL语句对象 pstm = con.prepareStatement(sql); //传参 pstm.setObject(1,register.getUsername()); pstm.setObject(2,register.getPassword()); pstm.setObject(3,register.getPhone()); pstm.setObject(4,register.getAddress()); //获取结果集对象 ,获取结果 row = pstm.executeUpdate(); }catch (Exception e){ e.printStackTrace(); }finally { //调用关闭资源的方法 JDBCUtil.loginClose(null,pstm,con); } //返回受影响的行数 return row; } }
在Servlet包下建一个Login类用来处理登录业务
Login类位置如图下所示:
Login类内的代码如下:
/** * 登录类 */ public class Login extends HttpServlet { //数据库连接对象 Connection con = null; //预处理对象 PreparedStatement pstm = null; //结果集对象 ResultSet rs = null; @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { System.out.println("Login...get"); doPost(request, response); } @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { System.out.println("Login...post"); //1.从请求中获取用户提交的参数(数据) request.setCharacterEncoding("UTF-8");//设置请求的编码格式为中文 String user = request.getParameter("user");//根据表单的name属性获取用户输入的值 String pwd = request.getParameter("pwd");//根据表单的name属性获取用户输入的值 System.out.println(user); System.out.println(pwd); //2.业务处理 //调用数据库类 UserDaoImpl userDao =new UserDaoImpl(); //传参 User user1 = userDao.login(user,pwd); //判断是否有该账号 if (user1!=null){ //登录成功跳转登录首页 response.sendRedirect("ShouYe.jsp"); }else { //登录失败跳转错误页面 response.sendRedirect("Error.jsp"); } } }
在Servlet包下建一个Enroll类用来处理登录业务
Enroll类位置如图下所示:
Enroll类内的代码如下:
/** * 注册类 */ //设置当前类用来处理 /enroll 的请求 @WebServlet("/enroll") public class Enroll extends HttpServlet { //数据库连接对象 Connection con = null; //预处理对象 PreparedStatement pstm = null; @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { System.out.println("enroll...get"); //调用doPost方法 doPost(request, response); } @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { System.out.println("enroll...post"); //设置请求的编码格式为UTF-8格式 request.setCharacterEncoding("UTF-8"); response.setCharacterEncoding("UTF-8"); //设置以文本或网页的形式响应 response.setContentType("text/html;charset=UTF-8");//已什么样的格式(文本/网页)响应 //从请求中获取用户提交的参数(数据) String zhangh = request.getParameter("zhangh"); String pwd = request.getParameter("pwd"); String dell = request.getParameter("dell"); String address = request.getParameter("address"); //实例化对象 User enroll = new User(); //给实体类user 赋值 enroll.setUsername(zhangh); enroll.setPassword(pwd); enroll.setPhone(dell); enroll.setAddress(address); //实现UserDao接口的UserDaoImpl类 UserDao userDao = new UserDaoImpl(); //调用子类接口的enroll方法 返回受影响的行数 int row = userDao.enroll(enroll); //判断受影响的行数大于零注册成功 if (row>0){ //注册成功 跳转登录页面 response.sendRedirect("Login.jsp"); }else { //注册失败 跳转错误页面 response.sendRedirect("Error.jsp"); } } }