【Java Web编程 十四】深入理解MVC架构模式(三)

简介: 【Java Web编程 十四】深入理解MVC架构模式(三)

Servlet代码清单

Servlet比较简单,只需要处理登录请求的LoginServlet和处理注册请求的RegisterServlet以及处理登出请求的StopServlet

LoginServlet

package com.example.GoldenManage.controller;
import com.example.GoldenManage.service.UserService;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;
@WebServlet(name = "ControlServlet", value = "/ControlServlet")
public class LoginServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    }
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("text/html");
        response.setCharacterEncoding("utf-8");
        String username = request.getParameter("username");
        String password = request.getParameter("password");
        //满足如下条件则认为登录成功
        if (UserService.LoginStatus(username, password)) {
            //重置登录session
            HttpSession session = request.getSession();
            session.setAttribute("username", username);
            session.setAttribute("password", password);
            session.setAttribute("loginStatus", "true");
            //登录成功跳转到首页
            request.getRequestDispatcher("index.jsp").forward(request, response);
        }else{
            request.getRequestDispatcher("login.jsp").forward(request, response);        //页面转向登录继续登录
        }
    }
}

RegisterServlet

package com.example.GoldenManage.controller;
import com.example.GoldenManage.model.UserModel;
import com.example.GoldenManage.service.UserService;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;
import java.util.ArrayList;
@WebServlet(name = "RegisterServlet", value = "/GetPermission")
public class RegisterServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    }
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("text/html");
        response.setCharacterEncoding("utf-8");
        String username = request.getParameter("name");
        String password = request.getParameter("password");
        String email = request.getParameter("email");
        String confirm_password = request.getParameter("confirm_password");
        String phone_number = request.getParameter("phone_number");
        UserModel userModel=new UserModel();
        userModel.setEmail(email);
        userModel.setUsername(username);
        userModel.setPassword(password);
        userModel.setPhone(phone_number);
        userModel.setRePassword(confirm_password);
        ArrayList<String> errorList=UserService.CheckFormDate(userModel);
        if(errorList.isEmpty()){
            //插入数据库成功则证明注册成功
            if( UserService.regiserUser(userModel)==1){
                request.setAttribute("userModel", userModel);
                request.getRequestDispatcher("success.jsp").forward(request, response);      //页面转向成功显示
            }
        }else{
            request.setAttribute("error", errorList);
            request.getRequestDispatcher("error.jsp").forward(request, response);        //页面转向错误信息
        }
    }
}

StopServlet

package com.example.GoldenManage.controller;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;
@WebServlet(name = "StopServlet", value = "/StopServlet")
public class StopServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //假设退出成功
        HttpSession session = request.getSession();
        session.invalidate();
        request.getRequestDispatcher("login.jsp").forward(request, response);        //退出后页面跳转回登录页面
    }
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    }
}

Service代码清单

Servlet是不处理具体业务逻辑的,它只是依据结果返回进行页面选择,所以业务逻辑依赖Service:

package com.example.GoldenManage.service;
import com.example.GoldenManage.dao.UserDao;
import com.example.GoldenManage.model.UserModel;
import java.util.ArrayList;
public class UserService {
    /**
     * 判断当前的用户登录状态
     * @return
     */
    public static Boolean LoginStatus(String username,String password) {
        //使用当前用户从数据库中查数据
        String realpassword= UserDao.getPasswordByUserName(username);
        //满足如下条件则认为登录成功
        if (password.equals(realpassword) ) {
           return true;
        }
        return false;
    }
    /**
     * 表单提交验证
     * @return
     */
    public static ArrayList<String> CheckFormDate(UserModel userModel) {
        ArrayList<String> errorList=new ArrayList<>();           //错误信息都放到集合里,通过集合去反馈
        if(null==userModel.getUsername()||"".equals(userModel.getUsername())){
            errorList.add("username is empty");
        }
        if(userModel.getPassword()==null||userModel.getPassword().length()<6||userModel.getPassword().length()>11){
            errorList.add("password must between 6 and 11");
        }
        if(userModel.getPassword()!=null&&userModel.getPassword()!=null&&!userModel.getPassword().equals(userModel.getRePassword())){
            errorList.add("password !=repassword");
        }
        if(userModel.getPhone()==null||userModel.getPhone().length()!=11){
            errorList.add("phone_number is not valid");
        }
        if(userModel.getEmail()==null||!userModel.getEmail().endsWith("com")){
            errorList.add("email is not valid");
        }
        return errorList;
    }
    /**
     * 注册数据
     * @return
     */
    public static int regiserUser(UserModel userModel) {
        int flag=UserDao.regiserUser(userModel);
        return flag;
    }
}

Dao代码清单

Service不与持久化数据打交道,那么这个任务就落到了Dao身上,注意Dao的粒度一定要细,并且不掺杂任何业务逻辑,就是增删改查即可:

package com.example.GoldenManage.dao;
import com.example.GoldenManage.model.UserModel;
import com.example.GoldenManage.utils.JdbcUtil;
import javax.xml.crypto.Data;
import java.sql.*;
import java.time.LocalDate;
public class UserDao {
    /**
     * 通过用户名到数据库中获取凭证密码
     * @param userName
     * @return
     */
    public static String getPasswordByUserName(String userName) {
        //SQL语句
        String sql = "select password from user where username = " +"'" + userName+"'";
        Connection connection = JdbcUtil.getConnection();
        Statement statement=null;
        ResultSet resultSet = null;
        String password=null;
        try {
            statement = connection.createStatement();
            //执行语句,得到结果集
            resultSet = statement.executeQuery(sql);
            while (resultSet.next()) {
                //这里只查询的密码
                password = resultSet.getString(1);
            }
            resultSet.close();
            connection.close();//关闭连接
        } catch (SQLException e1) {
            e1.printStackTrace();
        }
        return password;
    }
    /**
     * 插入數據
     * @return
     */
    public static int regiserUser(UserModel userModel) {
        int flag=0;
        //SQL语句
        String sql = "insert into user values (?,?,?,?)";
        Connection connection = JdbcUtil.getConnection();
        PreparedStatement statement=null;
        try {
            statement = connection.prepareStatement(sql);
            statement.setString(1, userModel.getUsername());
            statement.setString(2, userModel.getPhone());
            statement.setString(3, userModel.getPassword());
            statement.setString(4, userModel.getEmail());
            //执行语句,得到结果集
            flag = statement.executeUpdate();
            connection.close();//关闭连接
        } catch (SQLException e1) {
            e1.printStackTrace();
        }
        return flag;
    }
}

Utils代码清单

像建立数据库连接这种操作,如果每进行一次查询都写一遍代码显然很冗余,所以这种可以抽出来作为工具类:

package com.example.GoldenManage.utils;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
public class JdbcUtil {
    public static  Connection getConnection() {
        Connection connection;
        //jdbc驱动
        String driver = "com.mysql.cj.jdbc.Driver";
        //数据库url
        String url = "jdbc:mysql://localhost:3306/test?&useSSL=false&serverTimezone=UTC";
        String user = "root";
        String password = "root";
        try {
            //注册JDBC驱动程序
            Class.forName(driver);
            //建立连接
            connection = DriverManager.getConnection(url, user, password);
            if (!connection.isClosed()) {
                System.out.println("数据库连接成功");
            }
            return connection;
        } catch (ClassNotFoundException e) {
            System.out.println("数据库驱动没有安装");
        } catch (SQLException e) {
            e.printStackTrace();
            System.out.println("数据库连接失败");
        }
       return null;
    }
}

数据库表

在数据库中创建数据库和表即可,然后通过JDBC进行操作。

Model代码清单

这个Model并不是指Model层,而是一个Model对象,可以理解为一个JavaBean,事实上如我前文所提,业务层面的Model和数据层面的Model其实应该区分开,比如重复确认密码这个字段,业务层面需要,而数据层面并不需要。当然我们这里这个项目比较小就暂时用一个:

package com.example.GoldenManage.model;
import lombok.Data;
/*
* JavaBean,也就是Model数据
* */
@Data
public class UserModel {
    //用户名
    private String username;
    //密码
    private String password;
    //确认密码
    private String rePassword;
    //邮箱号
    private String email;
    //手机号
    private String phone;
}

项目展示

整个项目贯穿了所有之前学习的知识点,所以其实认真阅读我之前的博客再结合代码清单看就知道是怎么实现的了,这里我就不再讲一遍了,直接来看下项目实现,首先服务器启动时被监听打印出了启动信息:

然后我们默认请求的首页被过滤器拦截重定向到了登录页面:

用户注册

这时我们点击注册去进行注册,用户注册时填写相关注册信息即可,如果填写错误有前端JS校验:

这里我们正确输入信息:

注册成功

输入正确注册信息验证通过后,数据首先会落库:

然后转发到success.jsp页面展示出来:

用户登录

注册完之后用户就可以登录了,登录时输入正确的用户名和密码后即会被转发到首页:

请求转发到首页,可以看到地址还是登录的Servlet。

访问首页

登录之后由于有了Session,所以我们就可以通过index.jsp直接访问首页了:

用户登出

当点击【退出登录】时会跳转到退出登录确认页面,确认后销毁session,则过滤器又会对页面进行过滤了:

退出后自动跳转到用户登录页面:

总结一下

从重新编写代码设计项目到blog完成大概花了一天时间,有点长但很有价值,对古早味的Web实现和MVC架构思想有了比较深刻的理解,之后再学习框架的时候相信会如鱼得水,毕竟思想摆在那里,框架只是简化思想的落地而已,例如mybatis是对DAO的优化,springMVC是对JSP的优化,Spring是对Servlet的优化,当然不尽准确,但也可以得知,技术的演进过程是因为需求,技术会变化,但思想会一直保留,以后有时间得好好学习设计模式,那些才是干货呀。

相关文章
|
3月前
|
安全 Java API
Java Web 在线商城项目最新技术实操指南帮助开发者高效完成商城项目开发
本项目基于Spring Boot 3.2与Vue 3构建现代化在线商城,涵盖技术选型、核心功能实现、安全控制与容器化部署,助开发者掌握最新Java Web全栈开发实践。
394 1
|
3月前
|
存储 前端开发 Java
【JAVA】Java 项目实战之 Java Web 在线商城项目开发实战指南
本文介绍基于Java Web的在线商城技术方案与实现,涵盖三层架构设计、MySQL数据库建模及核心功能开发。通过Spring MVC + MyBatis + Thymeleaf实现商品展示、购物车等模块,提供完整代码示例,助力掌握Java Web项目实战技能。(238字)
397 0
|
4月前
|
前端开发 Java 开发者
Java新手指南:在Spring MVC中使用查询字符串与参数
通过结合实际的需求和业务逻辑,开发者可以灵活地利用这些机制,为用户提供更丰富而高效的Web应用体验。
177 15
|
4月前
|
前端开发 Java 数据库
Java 项目实战从入门到精通 :Java Web 在线商城项目开发指南
本文介绍了一个基于Java Web的在线商城项目,涵盖技术方案与应用实例。项目采用Spring、Spring MVC和MyBatis框架,结合MySQL数据库,实现商品展示、购物车、用户注册登录等核心功能。通过Spring Boot快速搭建项目结构,使用JPA进行数据持久化,并通过Thymeleaf模板展示页面。项目结构清晰,适合Java Web初学者学习与拓展。
342 1
|
5月前
|
JSON 前端开发 Java
Java新手指南:如何在Spring MVC中处理请求参数
处理Spring MVC中的请求参数是通过控制器方法中的注解来完成的。这些注解包括 `@RequestParam`, `@PathVariable`, `@ModelAttribute`, `@RequestBody`, `@RequestHeader`, `@Valid`, 和 `@RequestMapping`。使用这些注解可以轻松从HTTP请求中提取所需信息,例如URL参数、表单数据或者JSON请求体,并将其转换成Java对象以供进一步处理。
491 17
|
5月前
|
前端开发 Java API
Spring Cloud Gateway Server Web MVC报错“Unsupported transfer encoding: chunked”解决
本文解析了Spring Cloud Gateway中出现“Unsupported transfer encoding: chunked”错误的原因,指出该问题源于Feign依赖的HTTP客户端与服务端的`chunked`传输编码不兼容,并提供了具体的解决方案。通过规范Feign客户端接口的返回类型,可有效避免该异常,提升系统兼容性与稳定性。
358 0
|
前端开发 JavaScript
探索现代Web应用的微前端架构
【10月更文挑战第40天】在数字时代的浪潮中,Web应用的发展日益复杂多变。微前端架构作为一种新兴的设计理念,正逐步改变着传统的单一前端开发模式。本文将深入探讨微前端的核心概念、实现原理及其在实际项目中的应用,同时通过一个简单的代码示例,揭示如何将一个庞大的前端工程拆分成小而美的模块,进而提升项目的可维护性、可扩展性和开发效率。
|
10月前
|
中间件 关系型数据库 数据库
docker快速部署OS web中间件 数据库 编程应用
通过Docker,可以轻松地部署操作系统、Web中间件、数据库和编程应用。本文详细介绍了使用Docker部署这些组件的基本步骤和命令,展示了如何通过Docker Compose编排多容器应用。希望本文能帮助开发者更高效地使用Docker进行应用部署和管理。
306 19
|
9月前
|
存储 消息中间件 缓存
支持百万人超大群聊的Web端IM架构设计与实践
本文将回顾实现一个支持百万人超大群聊的Web端IM架构时遇到的技术挑战和解决思路,内容包括:通信方案选型、消息存储、消息有序性、消息可靠性、未读数统计。希望能带给你启发。
328 0
支持百万人超大群聊的Web端IM架构设计与实践
|
9月前
|
机器学习/深度学习 开发框架 API
Python 高级编程与实战:深入理解 Web 开发与 API 设计
在前几篇文章中,我们探讨了 Python 的基础语法、面向对象编程、函数式编程、元编程、性能优化、调试技巧以及数据科学和机器学习。本文将深入探讨 Python 在 Web 开发和 API 设计中的应用,并通过实战项目帮助你掌握这些技术。

热门文章

最新文章