JavaWeb技术之MVC框架

目录

JavaWEB MVC

1.MVC设计模式

2.三层架构

3.三层架构和MVC的区别与联系

注意

MVC固定包框架

前后端分离

作业

MVC部分

bean包——student实体类

dao包——增删改查接口StudentDao

dao包——增删改查接口实现类StudentDaoImpl

service包——作为连接servlet和dao层的包——StudentService

service包——StudentService实现类StudentServiceImpl

util工具类包——德鲁伊JDBC连接池DruidUtil

util工具类包——前后端文字编码设置类ServletEncoding

过滤器实现前后端设置编码方式

web包(servlet类)——删除功能服务器DeleteServlet

web包——查询功能服务GetAllStudentServlet

web包——增加功能服务器InsertServlet

web包——修改功能服务器UpdateServlet

前端部分

主页面——index.jsp

查询信息页面——show.jsp

新增信息页面——insert.jsp

删除信息页面——delete.jsp

修改信息页面——update.jsp

文件树

数据表


JavaWEB MVC

写Java Web项目时会发现,一个中型或者大型项目 随着代码的增多,会发现:代码既可以写在src目录下,也可以

写在WebContent目录下。src下可以建很多包 ,WebContent下可以建很多文件夹。

所以问题就来了:一个新的类 到底往哪个目录下的哪个文件夹里写?

此时解决办法就是:需要一个模式去规范,到底哪个类该往哪里写。

1.MVC设计模式

Web MVC中的M(模型)-V(视图)-C(控制器)概念和标准MVC概念一样,我们再看一下Web MVC标准架构,如下图所示:

在Web MVC模式下,模型无法主动推数据给视图,如果用户想要视图更新,需要再发送一次请求(即请求-响应模型)。

M:(Model) 模型 : 应用程序的核心功能,管理这个模块中用的数据和值(bean,dao);

JavaBeans :是Java中一种特殊的类(换言之:JavaBean就是一个Java类). 
​
一个Java类 ,满足以下要求,则可称为一个JavaBean 
​
    a. public修饰的类,提供public 无参构造方法 
​
    b. 所有属性 都是private 
​
    C. 提供getter和setter方法 
​
从使用层面来看,JavaBean分为2大类: 
​
    a. 封装业务逻辑的JavaBean(eg:LoginDao.java 封装了登录逻辑) 
​
    b. 封装数据的JavaBean(实体类:eg:Student.java Vadio.java 。往往对应于数据库中的一张表,即数据库中有个Student表,项目中就有个Student.java类)通常:表名=类名,列名=属性名 
​
JavaBean是一个可以重复使用的组件,通过编写一个组件来实现某种通用功能,“一次编写、任何地方执行、任何地方重用”。

V(View )视图: 视图提供模型的展示,管理模型如何显示给用户,它是应用程序的外观;(jsp/html)

C(Controller)控制器: 对用户的输入做出反应,管理用户和视图的交互,是连接模型和视图的枢纽。

(servlet/service)

MVC用于将web(UI)层进行职责解耦

说明:mvc设计模式(不属于23种设计模式)

2.三层架构

三层架构 通常意义上的三层架构就是将整个业务应用划分为:表现层(UI)、业务逻辑层(BLL)、数据访问层(DAL)。区分层次的目的即为了“高内聚,低耦合”的思想。

1、表现层(UI):通俗讲就是展现给用户的界面,即用户在使用一个系统的时候他的所见所得。 jsp/html

2、业务逻辑层(BLL):针对具体问题的操作,也可以说是对数据层的操作,对数据业务逻辑处理。 servlet,service

3、数据访问层(DAL):该层所做事务直接操作数据库,针对数据的增添、删除、修改、更新、查找等。dao

表现层实现的代表作品是Struts,springmvc框架,

业务层实现的代表作品是Spring,

数据层实现的代表作品是Hibernate,mybatis。

层就相当于一个黑盒子,我们不用知道它内部怎么实现,只需要知道如何去调用它就行了。每层只与上下相邻的两层打交道。当一层内部由于技术变迁发生变化时,只要接口不变,其他层不用做任何改变。分层之后灵活性提高,也便于团队分工开发。

3.三层架构和MVC的区别与联系

MVC是 Model-View-Controller,严格说这三个加起来以后才是三层架构中的UI层,也就是说,MVC把三层架构中的UI层再度进行了分化,分成了控制器、视图、实体三个部分,控制器完成页面逻辑,通过实体来与界面层完成通话;而C层直接与三层中的BLL进行对话。

MVC可以是三层中的一个表现层框架,属于表现层。三层和mvc可以共存。

三层是基于业务逻辑来分的,而MVC是基于页面来分的。

MVC主要用于表现层,3层主要用于体系架构,3层一般是表现层、中间层、数据层,其中表现层又可以分成M、V、C,(Model View Controller)模型-视图-控制器

MVC是表现模式(Presentation Pattern)

三层架构是典型的架构模式(Architecture Pattern)

三层架构的分层模式是典型的上下关系,上层依赖于下层。但MVC作为表现模式是不存在上下关系的,而是相互协作关系。即使将MVC当作架构模式,也不是分层模式。MVC和三层架构基本没有可比性,是应用于不同领域的技 术。

 

注意

1.先写实体类,再写接口,最后写实现类

2.servlet调用service,service调用dao。

3.service是用来实现复杂逻辑的,具体的就是调用dao层的方法,同样需要用到dao的接口。

 

MVC固定包框架

前后端分离

 

作业

MVC部分

bean包——student实体类

public class Student {
    private int studentId;
    private String studentNo;
    private String stuName;
    private int stuAge;
    private int gradeId;
​
    public Student() {
    }
​
    public Student(int studentId, String studentNo, String stuName, int stuAge, int gradeId) {
        this.studentId = studentId;
        this.studentNo = studentNo;
        this.stuName = stuName;
        this.stuAge = stuAge;
        this.gradeId = gradeId;
    }
​
    public int getStudentId() {
        return studentId;
    }
​
    public void setStudentId(int studentId) {
        this.studentId = studentId;
    }
​
    public String getStudentNo() {
        return studentNo;
    }
​
    public void setStudentNo(String studentNo) {
        this.studentNo = studentNo;
    }
​
    public String getStuName() {
        return stuName;
    }
​
    public void setStuName(String stuName) {
        this.stuName = stuName;
    }
​
    public int getStuAge() {
        return stuAge;
    }
​
    public void setStuAge(int stuAge) {
        this.stuAge = stuAge;
    }
​
    public int getGradeId() {
        return gradeId;
    }
​
    public void setGradeId(int gradeId) {
        this.gradeId = gradeId;
    }
​
​
    @Override
    public String toString() {
        return "Student{" +
                "studentId=" + studentId +
                ", studentNo='" + studentNo + '\'' +
                ", stuName='" + stuName + '\'' +
                ", stuAge=" + stuAge +
                ", gradeId=" + gradeId +
                '}';
    }
}

dao包——增删改查接口StudentDao

public interface StudentService {
    public List<Student> getAll();
    public boolean delete(int studentId);
    public boolean update(int studentId,String studentNo,String stuName,int stuAge,int gradeId);
    public boolean insert(int studentId,String studentNo,String stuName,int stuAge,int gradeId);
}

dao包——增删改查接口实现类StudentDaoImpl

public class StudentDaoImpl extends DruidUtil implements StudentDao {
    List list = new ArrayList();
    Connection connection = null;
    PreparedStatement preparedStatement= null;
    ResultSet resultSet = null;
    Statement statement;
​
    @Override
    public List<Student> getAll() {
        try {
            connection = getConnection();
            String sql = "select * from student";
            preparedStatement = connection.prepareStatement(sql);
            resultSet = preparedStatement.executeQuery();
            while (resultSet.next()){
                Student student = new Student();
                student.setStudentId(resultSet.getInt("studentid"));
                student.setStudentNo(resultSet.getString("studentno"));
                student.setStuName(resultSet.getString("stuname"));
                student.setStuAge(resultSet.getInt("stuage"));
                student.setGradeId(resultSet.getInt("gradeid"));
                list.add(student);
            }
        } catch (SQLException throwable) {
            throwable.printStackTrace();
        }finally {
            close(connection,preparedStatement,resultSet);
        }
        return list;
    }
​
    @Override
    public boolean delete(int studentId) {
        try {
            connection =getConnection();
            String sql = "delete from student where studentid = ?";
            preparedStatement = connection.prepareStatement(sql);
            preparedStatement.setInt(1,studentId);
            int i = preparedStatement.executeUpdate();
            if (i>0) {
                return true;
            }
        } catch (SQLException throwable) {
            throwable.printStackTrace();
​
        }finally {
            close(connection,preparedStatement);
        }
        return false;
    }
​
    @Override
    public boolean insert(int studentId,String studentNo,String stuName,int stuAge,int gradeId) {
        try {
            connection = getConnection();
            String sql = "insert into student values(?,?,?,?,?);";
            preparedStatement = connection.prepareStatement(sql);
            preparedStatement.setInt(1, studentId);
            preparedStatement.setString(2, studentNo);
            preparedStatement.setString(3, stuName);
            preparedStatement.setInt(4, stuAge);
            preparedStatement.setInt(5, gradeId);
            int i = preparedStatement.executeUpdate();
            if (i>0) {
                return true;
            }
        } catch (SQLException throwable) {
            throwable.printStackTrace();
        }finally {
            close(connection,preparedStatement);
        }
        return false;
    }
​
    @Override
    public boolean update(int studentId,String studentNo,String stuName,int stuAge,int gradeId) {
        try {
                connection = getConnection();
                String sql = "select * from student";
                statement = connection.createStatement();
                resultSet = statement.executeQuery(sql);
                while (resultSet.next()){
                    int sid = resultSet.getInt("studentId");
                    if (sid==studentId){
                        String sql2 = "UPDATE student SET studentno = ?,stuname =?,stuage =?,gradeid =? WHERE studentid=?;";
                        preparedStatement = connection.prepareStatement(sql2);
                        preparedStatement.setString(1, studentNo);
                        preparedStatement.setString(2, stuName);
                        preparedStatement.setInt(3, stuAge);
                        preparedStatement.setInt(4, gradeId);
                        preparedStatement.setInt(5, studentId);
​
                        int i = preparedStatement.executeUpdate();
                        if (i>0){
                            return true;
                        }
                    }
                }
​
        } catch (Exception e) {
            e.printStackTrace();
        }finally {
            close(connection,statement,preparedStatement,resultSet);
        }
        return false;
    }
}

service包——作为连接servlet和dao层的包——StudentService

public interface StudentService {
    public List<Student> getAll();
    public boolean delete(int studentId);
    public boolean update(int studentId,String studentNo,String stuName,int stuAge,int gradeId);
    public boolean insert(int studentId,String studentNo,String stuName,int stuAge,int gradeId);
}

service包——StudentService实现类StudentServiceImpl

public class StudentServiceImpl implements StudentService {
    private StudentDao dao = new StudentDaoImpl();
​
    @Override
    public List<Student> getAll() {
        return dao.getAll();
    }
​
    @Override
    public boolean delete(int studentId) {
        return dao.delete(studentId);
    }
​
    @Override
    public boolean update(int studentId, String studentNo, String stuName, int stuAge, int gradeId) {
        return dao.update(studentId,studentNo,stuName,stuAge,gradeId);
    }
​
    @Override
    public boolean insert(int studentId, String studentNo, String stuName, int stuAge, int gradeId) {
        return dao.insert(studentId,studentNo,stuName,stuAge,gradeId);
    }
}

util工具类包——德鲁伊JDBC连接池DruidUtil

public class DruidUtil {
    private static DataSource ds;
​
    static {
        try {
            Properties ppt = new Properties();
            ppt.load(util.DruidUtil.class.getClassLoader().getResourceAsStream("druid.properties"));
            ds = DruidDataSourceFactory.createDataSource(ppt);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
​
    /**
     * 从连接池中取出一个连接给用户
     *
     * @return
     */
    public static Connection getConnection() {
        try {
            return ds.getConnection();
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }
        return null;
    }
​
​
    public static void close(Connection conn, Statement state, ResultSet rs) {
        try {
            rs.close();
        } catch (Exception throwables) {
            throwables.printStackTrace();
        }
        try {
            state.close();
        } catch (Exception throwable) {
            throwable.printStackTrace();
        }
        try {
            conn.close();
        } catch (Exception throwable) {
            throwable.printStackTrace();
        }
    }
​
    public static void close(Connection conn, Statement state) {
        try {
            state.close();
        } catch (Exception throwables) {
            throwables.printStackTrace();
        }
        try {
            conn.close();
        } catch (Exception throwables) {
            throwables.printStackTrace();
        }
    }
​
    public static void close(Connection conn, Statement state, PreparedStatement preState, ResultSet rs) {
        try {
            conn.close();
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }
        try {
            state.close();
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }
        try {
            preState.close();
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }
        try {
            rs.close();
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }
​
    }
}

util工具类包——前后端文字编码设置类ServletEncoding

public class ServletEncoding extends HttpServlet {
​
    public void enCoding(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //设置接收参数的编码和发送内容的编码
        //接收参数的编码
        req.setCharacterEncoding("utf-8");
        //发送内容的编码
        resp.setCharacterEncoding("utf-8");
        // 配合<script type="text/javascript">使用,防止后台输出到前端的代码乱码
        resp.setContentType("text/html;charset=utf-8;");
    }
}

注意:设置编码方式也可以用过滤器对所有网页进行过滤来实现

过滤器实现前后端设置编码方式

@WebServlet(/*)
public class CharactorFilter implements Filter { //继承Filter类
  //字符编码
  String encoding=null;
​
  public void doFilter(ServletRequest request, ServletResponse response,
      FilterChain chain) throws IOException, ServletException {
    if(encoding!=null){
    //设置request字符编码
      request.setCharacterEncoding(encoding);
     //设置response字符编码
      response.setContentType("text/html;charset="+encoding);
    }
   //传递给下一个过滤器
    chain.doFilter(request, response);
​
  }
​
  public void init(FilterConfig filterConfig) throws ServletException {
   //获取初始化参数
    encoding=filterConfig.getInitParameter("encoding");
​
  }
​
  public void destroy() {
    // TODO Auto-generated method stub
    encoding=null;
  }
​
}

 

web包(servlet类)——删除功能服务器DeleteServlet

@WebServlet(value = "/delete")
public class DeleteServlet extends HttpServlet {
​
​
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //设置接收参数的编码和发送内容的编码
        ServletEncoding servletEncoding = new ServletEncoding();
        servletEncoding.enCoding(req,resp);
​
        //接收参数
        String sid = req.getParameter("studentId");
        System.out.println(sid);
        int studentId = Integer.parseInt(sid);
​
        //调取service方法
        StudentService studentService = new StudentServiceImpl();
        PrintWriter writer = resp.getWriter();
        boolean delete = studentService.delete(studentId);
        if (delete){
            System.out.println("删除成功");
            writer.print("<script type=\"text/javascript\">alert('删除成功,正在返回主页面'); location.href='/index.jsp'</script>");
        }else{
            writer.print("<script>alert('输入的信息有误');location.href='/delete.jsp'</script>");
        }
        writer.close();
    }
​
​
}

web包——查询功能服务GetAllStudentServlet

@WebServlet(value = "/getAllStudent")
public class GetAllStudentServlet extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //1.接收参数
        //2.调取service方法
            StudentService studentService = new StudentServiceImpl();
            List<Student> students = studentService.getAll();
        //3.跳转页面
            req.setAttribute("students",students);
            req.getRequestDispatcher("show.jsp").forward(req,resp);
    }
}

web包——增加功能服务器InsertServlet

@WebServlet(value = "/insert")
public class InsertServlet extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //设置接收参数的编码和发送内容的编码
        //设置接收参数的编码和发送内容的编码
        ServletEncoding servletEncoding = new ServletEncoding();
        servletEncoding.enCoding(req,resp);
​
        //接收参数
        int studentId = Integer.parseInt(req.getParameter("studentId"));
        String studentNo = req.getParameter("studentNo");
        String stuName = req.getParameter("stuName");
        int stuAge = Integer.parseInt(req.getParameter("stuAge"));
        int gradeId = Integer.parseInt(req.getParameter("gradeId"));
​
        //调取service方法
        StudentService studentService = new StudentServiceImpl();
        PrintWriter writer = resp.getWriter();
        Boolean insert = studentService.insert(studentId,studentNo,stuName,stuAge,gradeId);
        if (insert){
            writer.write("<script type=\"text/javascript\">alert('新增成功,正在返回主页面'); location.href='/index.jsp'</script>");
        }else{
            writer.write("<script type=\"text/javascript\">alert('新增失败,正在返回新增页面'); location.href='/insert.jsp'</script>");
        }
        writer.close();
    }
}

web包——修改功能服务器UpdateServlet

@WebServlet(value = "/update")
public class UpdateServlet extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //设置接收参数的编码和发送内容的编码
        //设置接收参数的编码和发送内容的编码
        ServletEncoding servletEncoding = new ServletEncoding();
        servletEncoding.enCoding(req,resp);
​
        //接收参数
        int studentId = Integer.parseInt(req.getParameter("studentId"));
        String studentNo = req.getParameter("studentNo");
        String stuName = req.getParameter("stuName");
        int stuAge = Integer.parseInt(req.getParameter("stuAge"));
        int gradeId = Integer.parseInt(req.getParameter("gradeId"));
​
        //调取service方法
        StudentService studentService = new StudentServiceImpl();
        PrintWriter writer = resp.getWriter();
        Boolean update = studentService.update(studentId,studentNo,stuName,stuAge,gradeId);
        if (update){
            writer.write("<script type=\"text/javascript\">alert('修改成功,正在返回主页面'); location.href='/index.jsp'</script>");
        }else{
            writer.write("<script type=\"text/javascript\">alert('修改失败,正在返回修改页面'); location.href='/index.jsp'</script>");
        }
        writer.close();
    }
}

前端部分

主页面——index.jsp

<html>
    <head>
        <title>Title</title>
    </head>
    <body>
        <form method="post" action="/insert">
            请输入要增加的学生信息:<br><br>
            id:<input type="text" name="studentId"><br><br>
            编号:<input type="text" name="studentNo"><br><br>
            姓名:<input type="text" name="stuName"><br><br>
            年龄:<input type="text" name="stuAge"><br><br>
            班级:<input type="text" name="gradeId"><br><br>
            <input type="submit" value="增加">
        </form>
    </body>

查询信息页面——show.jsp

<html>
    <head>
        <title>Title</title>
    </head>
    <body>
        <h1>show.jsp</h1>
        <table border="1" cellspacing="0" width="800px">
            <tr>
                <td>学生编号</td>
                <td>学生姓名</td>
                <td>学生年龄</td>
                <td>学生班级</td>
            </tr>
​
            <c:forEach items="${students}" var="stu">
                <tr>
                    <td>${stu.studentNo}</td>
                    <td>${stu.stuName}</td>
                    <td>${stu.stuAge}</td>
                    <td>${stu.gradeId}</td>
                </tr>
            </c:forEach>
        </table>
​
    </body>
</html>

新增信息页面——insert.jsp

<html>
    <head>
        <title>Title</title>
    </head>
    <body>
        <form method="post" action="/insert">
            请输入要增加的学生信息:<br><br>
            id:<input type="text" name="studentId"><br><br>
            编号:<input type="text" name="studentNo"><br><br>
            姓名:<input type="text" name="stuName"><br><br>
            年龄:<input type="text" name="stuAge"><br><br>
            班级:<input type="text" name="gradeId"><br><br>
            <input type="submit" value="增加">
        </form>
    </body>
</html>

删除信息页面——delete.jsp

<html>
    <head>
        <title>Title</title>
    </head>
    <body>
        <form method="delect" action="/delete">
            请输入要删除的学生id:<input type="text" name="studentId">
            <input type="submit" value="删除">
        </form>
    </body>
</html>

修改信息页面——update.jsp

<html>
    <head>
        <title>Title</title>
    </head>
    <body>
        <form method="post" action="/update">
            请输入要修改信息的的学生id:<input type="text" name="studentId"><br><br>
            请输入修改后的信息:<br>
            编号:<input type="text" name="studentNo"><br><br>
            姓名:<input type="text" name="stuName"><br><br>
            年龄:<input type="text" name="stuAge"><br><br>
            班级:<input type="text" name="gradeId"><br>
            <input type="submit" value="修改">
        </form>
    </body>
</html>

文件树

数据表

  • 7
    点赞
  • 47
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值