WEB后端复习——MVC、SSM【含登录页面代码】

MVC(Model-View-Controller)是一种软件设计模式,用于将应用程序分解为三个相互关联的组件:模型(Model)、视图(View)和控制器(Controller)。这种模式在构建用户界面和图形界面应用程序时特别有用,它促进了代码的模块化和可维护性。
以下是MVC模式中每个组件的简要描述:
1. **模型(Model)**:
   - 模型是应用程序的核心,代表应用程序的数据和业务逻辑
   - 它管理应用程序的状态和数据,并实现所有的业务规则。
   - 模型不直接与用户界面交互,它通过控制器接收用户的输入和数据请求。
2. **视图(View)**:
   - 视图是用户界面的一部分,负责展示数据(模型)给用户,并接收用户的输入。
   - 它从模型中获取数据,并定义数据的呈现方式。
   - 视图应该尽可能简单,不包含任何业务逻辑。
3. **控制器(Controller)**:
   - 控制器是模型和视图之间的中介,它接收用户的输入并调用模型进行相应的更新。
   - 它还负责选择视图来显示模型的数据,并处理用户的交互。
   - 控制器解释用户的输入,并转换这些输入为对模型的操作或对视图的更新。
MVC模式的工作流程通常如下:
1. 用户与视图交互,发送请求。
2. 控制器接收请求,并决定调用哪个模型来处理请求。
3. 模型根据请求执行业务逻辑,并可能更新其状态。
4. 控制器选择合适的视图来显示模型的数据。
5. 视图呈现数据给用户。
MVC模式的主要优点包括:
- **代码分离**:业务逻辑、数据和用户界面被分离,使得代码更易于管理和维护。
- **可扩展性**:由于组件之间的低耦合,可以独立地修改或替换模型、视图和控制器。
- **可复用性**:模型和控制器可以在不同的视图上复用,视图可以在不同的模型上复用。
- **测试友好**:由于业务逻辑和数据与用户界面分离,可以更容易地进行单元测试。
MVC模式被广泛用于Web应用程序开发,特别是在Java的Spring框架、ASP.NET MVC、Ruby on Rails等Web开发框架中。


SSM框架是指Spring、SpringMVC和MyBatis这三个开源框架的集合,它们通常一起使用来构建复杂的Java Web应用程序。每个框架都承担着不同的角色:
1. **Spring**:Spring是一个轻量级的Java企业级应用开发框架,主要提供IoC(控制反转)和AOP(面向切面编程)的支持。Spring框架的核心功能是提供依赖注入(DI),这使得应用程序的组件更加模块化,易于测试和重用。Spring还提供了对事务管理、数据访问、消息传递、安全性等企业服务的支持。
2. **SpringMVC**:SpringMVC是Spring框架的一部分,专门用于构建Web应用程序的MVC(模型-视图-控制器)模式实现。它分离了应用程序的输入、处理和输出,使得代码更加清晰和易于维护。SpringMVC处理HTTP请求并将它们映射到特定的处理器方法,这些方法通常返回模型和视图,以呈现给用户。
3. **MyBatis**:MyBatis是一个持久层框架,它提供了对数据库的操作支持。MyBatis使用简单的XML或注解用于配置和映射原生信息,将接口和Java的POJOs(Plain Old Java Objects)映射成数据库中的记录。MyBatis的主要特点是灵活,它允许开发者自己编写SQL,从而提供了更好的性能和可定制性。
SSM框架的结合使用,可以提供一种分层架构,其中:
- Spring负责管理应用程序的业务逻辑和依赖注入。
- SpringMVC负责处理Web层的请求和响应。
- MyBatis负责数据访问层的操作,即与数据库的交互。
这种分层架构有助于提高代码的可读性、可维护性和可扩展性。SSM框架是构建大型Java Web应用程序的流行选择,因为它结合了三个框架的最佳特性,提供了一个强大、灵活且易于使用的开发环境。
 


Spring框架的三个核心技术是IoC(控制反转)、DI(依赖注入)和AOP(面向切面编程)。下面是这三个技术的简述:
1. **IoC(控制反转)**:
   - 控制反转是一种设计原则,它将对象创建和依赖管理的控制权从程序代码转移到外部容器(在Spring中是Spring容器)。
   - 通过IoC,开发者不再直接在代码中创建对象和配置依赖,而是通过配置文件或注解来描述这些关系,由Spring容器负责对象的创建和依赖的注入。
   - IoC有助于减少代码的耦合度,提高代码的可测试性和可维护性。
2. **DI(依赖注入)**:
   - 依赖注入是IoC的一种实现方式,它允许将依赖的对象通过构造函数、工厂方法或属性设置注入到另一个对象中。
   - Spring通过DI来管理应用程序中的对象依赖关系,使得开发者可以专注于业务逻辑,而不必担心对象的创建和依赖问题。
   - DI有助于实现模块化和可重用的组件,同时也使得单元测试更加容易。
3. **AOP(面向切面编程)**:
   - 面向切面编程是一种编程范式,它允许开发者将横切关注点(如日志、事务、安全等)与业务逻辑分离。
   - AOP通过切面(Aspect)来定义横切关注点,并通过通知(Advice)将这些关注点织入到程序的指定位置(连接点,Join Point)。
   - Spring AOP提供了一种声明式的方式来管理横切关注点,从而减少了代码的重复性和复杂性,提高了代码的可维护性。
总结来说,IoC和DI使得依赖管理更加灵活和可配置,而AOP则提供了在不修改核心业务逻辑的情况下,将横切关注点织入到应用程序中的能力。这三个核心技术共同构成了Spring框架的核心优势,使得它成为开发企业级Java应用程序的流行选择。
 


【登录操作】

①业务逻辑层(模型)建立 JavaBean类 User【GET SET方法 无参构造方法】

public class User {
    private String username;
    private String password;

    public User() {
    }

    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;
    }

②接口类 UserDao 

public interface UserDao {
    void saveUser(User user);
    ArrayList<User> selectUser();
}

③接口实现 UserDaoimpl

3.1实现数据库链接

public class UserDaoimpl  implements UserDao{
    //先接入JDBC
    private static String driver = "com.mysql.jdbc.Driver";
    private static String dbUrl = "jdbc:mysql://localhost:3306/db";
    private static String dbUser = "root";
    private static String dbpsw="123456";
    
    //无参构造法
    public UserDaoimpl(){}
    //获取Connection
    public Connection getConnection(){
        Connection con = null;
        try {
            Class.forName(driver);
            con = DriverManager.getConnection(dbUrl,dbUser,dbpsw);
            
        }catch (Exception e){
            e.printStackTrace();
        }
        return con;
    }
}

3.2实现保存用户信息功能(在impl类中继续添加方法)

    @Override
    public void saveUser(User user) {
        Connection con =null;
        PreparedStatement stmt =null;
        try {
            con.setAutoCommit(false);
            con = getConnection();
            String sql = "insert into user (username,password) values (?,?)";
            stmt = con.prepareStatement(sql);
            stmt.setString(1,user.getUsername());
            stmt.setString(2,user.getPassword());
            stmt.execute();
            con.commit();

        } catch (Exception e){
            try {
                con.rollback();
            }catch (SQLException s){
                s.printStackTrace();
            }finally {
                try {
                    stmt.close();
                    con.close();
                }catch (Exception e){
                    e.printStackTrace();
                }
            }
        }
    }

3.3查询所有用户信息

    @Override
    public ArrayList<User> selectUser() {
        Connection con= null;
        PreparedStatement pstm =null;
        ResultSet rs = null;
        ArrayList<User> users =new ArrayList<>();
        try {
            con = getConnection();
            String sql = "select * from User";
            pstm = con.prepareStatement(sql);
            rs = pstm.executeQuery();
            User user =new User();
            while (rs.next()){
                user.setUsername(rs.getString(1));
                user.setPassword(rs.getString(2));
                users.add(user);
            }
            rs.close();
            pstm.close();
            con.close();
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
        return users;
    }
}

④Servlet类

@WebServlet("/login")
public class Http extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String name = req.getParameter("username");
        String psw = req.getParameter("password");
        User user = new User();
        UserDao userDao =new UserDaoimpl();
        ArrayList<User> users = userDao.selectUser();
        
        //实现登录功能
        //实现条件查询方法 与查询类似只需更改sql语句
        //用getParameter接受到的name psw与数据库中的一致
        if (name.equals(users.get(0).getUsername())&&psw.equals(users.get(0).getPassword())){
            req.setAttribute("username",name);//携带name返回
            req.getRequestDispatcher("/welcome.jsp").forward(req,resp);//跳转至welcome页 请求转发携带信息
            return;
        }else {
            resp.sendRedirect("/login.jsp");//重定向不携带信息
        }
    }
}

⑤表单提交

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <form action="login" name="1" >
        <input type="text" placeholder="name" name="username"><br>
        <input type="password" name="password" placeholder="psw"><br>
        <button type="submit" value="login">denglu</button>
    </form>
    
</body>
</html>

  • 14
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值