浅谈Java MVC

2022-04-15 16:31:44 浏览数 (1)

最近真的好热阿 -=

so so hot!

最近课程需要接触到了java web 当然了是基础的servlet jsp

还接触到了MVC框架

文章末尾有演示视频奥。

先简单解释一下:

M:

M即model模型是指模型表示业务规则。在MVC的三个部件中,模型拥有最多的处理任务。被模型返回的数据是中立的,模型与数据格式无关,这样一个模型能为多个视图提供数据,由于应用于模型的代码只需写一次就可以被多个视图重用,所以减少了代码的重复性。 百度知道

V:

V即View视图是指用户看到并与之交互的界面。比如由html元素组成的网页界面,或者软件的客户端界面。MVC的好处之一在于它能为应用程序处理很多不同的视图。在视图中其实没有真正的处理发生,它只是作为一种输出数据并允许用户操作的方式。 来自百度知道

C:

C即controller控制器是指控制器接受用户的输入并调用模型和视图去完成用户的需求,控制器本身不输出任何东西和做任何处理。它只是接收请求并决定调用哪个模型构件去处理请求,然后再确定用哪个视图来显示返回的数据。 来自百度知道

虽然不是第一次接触MVC框架

但是今天写的时候还是有些生疏

之前的python的django用的是MTV框架

MVT:

M:Model, 模型 与MVC中的M相同,负责对数据的处理 V: View, 视图 与MVC中的C类似,负责处理用户请求,调用M和T,响应请求 T:Template, 模板 与MVC中的V类似,负责如何显示数据(产生html界面) 来自百度知道

所以理解MVC起来也还ok

因为作业要求。简单的用java MVC 写了一个增删改查配合jsp

先来工程目录截图:

包的说明:

dao:dao层叫数据访问层,全称为data access object,属于一种比较底层,比较基础的操作,具体到对于某个表、某个实体的增删改查

dbutil:数据库的相关信息,比如建立连接

pojo:一个简单的Java类,这个类没有实现/继承任何特殊的java接口或者类,不遵循任何主要java模型,约定或者框架的java对象。这个类往往是和数据中的实体是对应的

service:service层叫服务层,被称为服务,肯定是相比之下比较高层次的一层结构,相当于将几种操作封装起来。粗略的理解就是对一个或多个DAO进行的再次封装,封装成一个服务

servlet:Servlet是属于控制层最底端的部分的 ,也就是MVC c的最底层。所以我们的请求是直接交由servlet层处理的。

所以,介绍完每一个包的作用,接下来我们看代码,就会更明了一些。

UserDao.java:

代码语言:javascript复制
package cn.tompro.dao;
import cn.tompro.pojo.User;
import java.util.List;

public interface UserDao {
    List<User> findAll();
    User findUserById(int id);
    int deleteUserById(int id);
    int addUser(String username,String pwd);
}

UserDaoImpl.java

代码语言:javascript复制
package cn.tompro.dao.impl;
import cn.tompro.dao.UserDao;
import cn.tompro.dbutil.DButil;
import cn.tompro.pojo.User;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;

public class UserDaoImpl implements UserDao {
    @Override
    public List<User> findAll() {
        List<User> list=new ArrayList<User>();
        Statement stmt=null;
        ResultSet rs=null;
        DButil db=null;

        try {
            db=new DButil();
            stmt=db.createStmt();
            String sql="select * from users";
            rs=stmt.executeQuery(sql);
            while(rs.next()){
                list.add(new User(rs.getInt("id"),rs.getString("username"),rs.getString("pwd")));

            }
            return list;
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }
        finally {
            try {
                db.close();
            }catch (Exception e){
                e.printStackTrace();
            }
        }
        return null;
    }

    @Override
    public User findUserById(int id) {
        User a=null;
        PreparedStatement pstmt=null;
        ResultSet rs=null;
        DButil db=null;

        try {
            db=new DButil();
            String sql="select * from users where id=?";
            pstmt=db.createPstmt(sql);
            pstmt.setInt(1,id);
            rs=pstmt.executeQuery();
            while(rs.next()){
                a=new User(rs.getInt("id"),rs.getString("username"),rs.getString("pwd"));
            }
            return a;
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }
        finally {
            try {
                db.close();
            }catch (Exception e){
                e.printStackTrace();
            }
        }
        return null;
    }

    @Override
    public int deleteUserById(int id) {
        PreparedStatement pstmt=null;
        DButil db=null;
        int result=0;
        try {
            db=new DButil();
            String sql="delete from users where id = ?";
            pstmt=db.createPstmt(sql);
            pstmt.setInt(1,id);
            result=pstmt.executeUpdate();
            return result;

        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }finally {
            try {
                db.close();
            }catch (Exception e){
                e.printStackTrace();
            }
        }

        return 0;
    }

    @Override
    public int addUser(String username, String pwd) {
        PreparedStatement statement=null;
        int result=0;
        DButil db=null;

        try {
            db=new DButil();
            String sql="insert into users(username,pwd) values(?,?)";
            statement=db.createPstmt(sql);
            statement.setString(1,username);
            statement.setString(2,pwd);
            result=statement.executeUpdate();
            return result;

        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }finally {
            try {
                db.close();
            }catch (Exception e){
                e.printStackTrace();
            }
        }

        return 0;
    }
}

UserDao很明显是一个接口,我们通过UserDaoImpl去实现这个接口,重写他的方法。

pojo包下的User.java

代码语言:javascript复制
package cn.tompro.pojo;

public class User {
    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPwd() {
        return pwd;
    }

    public void setPwd(String pwd) {
        this.pwd = pwd;
    }

    public User() {
    }

    private int id;
    private String username;
    private String pwd;

    public User(int id, String username, String pwd) {
        this.id = id;
        this.username = username;
        this.pwd = pwd;
    }
}

关于DButil 就是把数据库的链接的创建封装到一个类,然后方便后期调用,因为暂时没有加连接池,首次链接的时候会很慢,下次会加上连接池的

DButil.java

代码语言:javascript复制
package cn.tompro.dbutil;

import java.sql.*;

public class DButil {
    public static final String DRIVER="com.mysql.jdbc.Driver";
    public static final String URL="jdbc:mysql://127.0.0.1:3306/tom?useSSL=false";
    public static final String ACCOUNT="root";
    public static final String PWD="你的数据库密码";

    private Connection conn;

    public DButil() throws ClassNotFoundException, SQLException {
        Class.forName(DRIVER);
        conn= DriverManager.getConnection(URL,ACCOUNT,PWD);

    }

    public Statement createStmt() throws SQLException {
        return conn.createStatement();
    }

    public PreparedStatement createPstmt(String sql) throws SQLException {
        return conn.prepareStatement(sql);
    }

    public void close(){
        try {
            this.conn.close();
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }
    }
}

然后就是service层:

这里道个歉,应该是indexService但是打错了写成了inderservice,抱歉我的读者们

IndexService:

这里又是一个接口

代码语言:javascript复制
package cn.tompro.service;

import cn.tompro.pojo.User;

import java.util.List;

public interface InderService {
    List<User> findAll();
    User findUserById(int id);
    int deleteUserById(int id);
    int addUser(String username,String pwd);
}

然后对应的实现类:

indexServiceImpl.java

代码语言:javascript复制
package cn.tompro.service.impl;

import cn.tompro.dao.UserDao;
import cn.tompro.dao.impl.UserDaoImpl;
import cn.tompro.pojo.User;
import cn.tompro.service.InderService;

import java.util.List;

public class IndexServiceImpl implements InderService {
    private UserDao dao;

    public IndexServiceImpl(){
        this.dao=new UserDaoImpl();
    }

    @Override
    public List<User> findAll() {
        return dao.findAll();
    }

    @Override
    public User findUserById(int id) {
        return dao.findUserById(id);
    }

    @Override
    public int deleteUserById(int id) {
        return dao.deleteUserById(id);
    }

    @Override
    public int addUser(String username, String pwd) {
        return dao.addUser(username,pwd);
    }
}

然后最后的最后就是Servlet层了:

IndexServlet.java

嘿嘿这次没有打错

代码语言:javascript复制
package cn.tompro.servlet;

import cn.tompro.pojo.User;
import cn.tompro.service.InderService;
import cn.tompro.service.impl.IndexServiceImpl;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.List;

public class IndexServlet extends HttpServlet {

    private InderService service;

    public IndexServlet(){
        this.service=new IndexServiceImpl();
    }

    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        req.setCharacterEncoding("UTF-8");
        String opt=req.getParameter("opt");
        if("findAll".equals(opt)){
            List<User> list=service.findAll();
            req.setAttribute("users",list);
            req.getRequestDispatcher("list.jsp").forward(req,resp);
        }
        if("selectOne".equals(opt)){
            int id=Integer.parseInt(req.getParameter("id"));
            User a=service.findUserById(id);
            req.setAttribute("users",a);
            req.getRequestDispatcher("singleUser.jsp").forward(req,resp);
        }
        if("delete".equals(opt)){
            int id=Integer.parseInt(req.getParameter("id"));
            int result=service.deleteUserById(id);
            if(result==1){
                req.setAttribute("deleteInfo","删除成功");
                req.getRequestDispatcher("deleteInfo.jsp").forward(req,resp);
            }else {
                req.setAttribute("deleteInfo","删除失败");
                req.getRequestDispatcher("deleteInfo.jsp").forward(req,resp);
            }
        }if("add".equals(opt)){
            String username=(String)req.getParameter("username");
            String pwd=(String)req.getParameter("pwd");
            int result=service.addUser(username,pwd);
            if(result==1){
                req.setAttribute("addInfo","添加成功");
                req.getRequestDispatcher("addInfo.jsp").forward(req,resp);
            }else {
                req.setAttribute("addInfo","添加失败");
                req.getRequestDispatcher("addInfo.jsp").forward(req,resp);
            }
        }
    }
}

时间问题 没来得及写注释,大家有问题可以找我讨论,

关于那几个jsp页面就很简单了

显示就是一个表格

新增就是一个表单

删除呢就是一个a标签然后href的值就是对应的id

视频演示:

http://mpvideo.qpic.cn/0b783qaacaaatqal3wnhfbqfbxgdahoaaaia.f10002.mp4?dis_k=1a5bb63d529c52288248d3f5e9ba23dd&dis_t=1650011472&vid=wxv_1879269133842694149&format_id=10002&support_redirect=0&mmversion=false

0 人点赞