MVC发展线

MVC发展线

 

 

JSP开发过程中有两种开发模型可供选择:一种是JSP与JavaBean相结合,这种方式称为Model1模式,另一种是JSP、JavaBean、Servlet相结合。

 

JavaBean

什么是JavaBean?

JavaBean的作用域

Model1模式

案例

Model2模式

MVC原理

模型层(Model)

视图层(View)

控制层(Controller)

案例

两种模式比较

接下来要读

 

 

 

 

JavaBean 

JSP网页开发的初级阶段,并没有所谓的框架与逻辑分层的概念,JSP网页代码是与业务逻辑代码写在一起的。这种凌乱的书写方式,给程序的调试及维护带来了很大的困难,直至JavaBean的出现,这一问题才得到些许改善。

什么是JavaBean?

JavaBean是用于封装某种业务逻辑或对象的Java类,此类具有特定的功能,即它是一个可重用的Java软件组件模型。由于这些模型组件都具有特定的功能,将其进行合理的组织后,可以快速生成一个全新的程序,实现代码的复用JavaBean的功能是没有任何限制的,对于任何可以使用Java代码实现的部分或需求的对象,都可以使用JavaBean进行封装,如创建一个实体对象、数据库对象、字符串操作等。它对简单或复杂的功能都可以进行实现。

JavaBean可分为两类,即可视化的JavaBean与非可视化的JavaBean。可视化的JavaBean是一种传统的应用方式,主要用于实现一些可视化界面,如一个窗体、按钮、文本框等。非可视化的JavaBean主要用于实现一些业务逻辑或封装一些业务对象,并不存在可视化界面。此种方式的应用比较多,在JSP编程中被大量采用。

JavaBean应用到JSP编程中,使JSP发展进入了一个崭新的阶段。它将HTML网页代码与Java代码相分离,使其业务变得更加清晰。在JSP页面中,可以通过JSP提供的动作标签来操作JavaBean对象,其中主要包括<jsp:useBean>、<jsp:setProperty>、<jsp:getProperty>3个标签,这3个标签为JSP内置动作标签。在使用过程中,不需要引入任何第三方的类库。

 

 

JavaBean的作用域

<jsp:useBean id="变量名" scope="page|request|session|application">
    {
        class="完整类型"|
        type="数据类型"|
        class="完整类名" type="数据类型"|
        beanName="完整类名" type="数据类型"
    }
</jsp:useBean>

 page范围:与当前页面相对应,JaveBean的生命周期存在于一个页面中,当页面关闭时JavaBean被销毁。

 request范围:与JSP的request生命周期相对应,JavaBean的生命周期存在于request对象之中,当request对象销毁时JavaBean也被销毁。

 session范围:session超时或会话结束时JavaBean被销毁。

 application范围:与JSP的application生命周期相对应,在各个用户与服务器之间共享,只有当服务器关闭时JavaBean才被销毁。

 

 

Model1模式

Model1模式与存JSP开发方式相比是一次进步。在存JSP开发中,JSP网页代码与所有业务逻辑代码写在一起,就像在Servlet基础里自己写的charter1~charter2一样,把数据库的操作,业务的操作都写在JSP里。

JSP开发模式

 

此种开发方式虽然简单,但它也为Web程序的开发及应用带来了很多不便;在混合交织的代码中,程序的可读性是非常差的,出现了错误不能快速调试,给程序的维护与扩展也带来了诸多不便,更谈不上代码重用。

aveBean的产生使HTML网页代码与Java代码分离开来,在应用JavaBean的JSP程序中,其业务逻辑变得更加清晰,JSP页面也显得整洁了很多。

JSP+JavaBean模式

从上图看出,JSP页面与JavaBean代码相分离,。在此种模式中,Web应用程序的开发开始有了层次的概念,JSP页面用于显示一个视图,JavaBean用于处理各种业务逻辑,Model1模式从JSP页面之中分离出了业务逻辑层。

 

案例

Model1模式录入商品信息。本实例通过JSP与JavaBean向数据库添加商品信息,共涉及两个JavaBean对象。

创建商品Bean对象:

package charter5.model1;

/**
 * 商品类
 * 
 * @author admin
 *
 */
public class Goods {
    private String name;
    private double price;
    private String description;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public double getPrice() {
        return price;
    }

    public void setPrice(double price) {
        this.price = price;
    }

    public String getDescription() {
        return description;
    }

    public void setDescription(String description) {
        this.description = description;
    }

}

封装商品的数据库操作的Bean对象:

package charter5.model1;

import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.Properties;

public class GoodsDao {
    public void saveGoods(Goods goods) {
        Connection conn = null;
        PreparedStatement statement = null;
        Properties properties = new Properties();
        try {
            properties.load(getClass().getResourceAsStream("/db.properties"));
            String driver = properties.getProperty("driver");
            String url = properties.getProperty("url");
            Class.forName(driver);
            conn = DriverManager.getConnection(url);

            statement = conn.prepareStatement("insert into goods(name,price,description) values(?,?,?)");
            statement.setString(1, goods.getName());
            statement.setDouble(2, goods.getPrice());
            statement.setString(3, goods.getDescription());
            statement.executeUpdate();
        } catch (IOException e1) {
            e1.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            try {
                if (statement != null) {
                    statement.close();
                }
                if (conn != null) {
                    conn.close();
                }
                properties.clear();
            } catch (SQLException e) {
                e.printStackTrace();
            }

        }
    }
}

商品的表单:

<!-- goodsForm.jsp -->

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<div>
    <form action="service.jsp" method="post">
        <table>
            <tr>
                <td>
                    商品名称:
                </td>
                <td>
                    <input type="text" name="name" />
                </td>
            </tr>
            <tr>
                <td>
                    商品价格:
                </td>
                <td>
                    <input type="text" name="price" />
                </td>
            </tr>
            <tr>
                <td>
                    商品描述信息:
                </td>
                <td>
                    <input type="text" name="description" />
                </td>
            </tr>
            <tr>
                <td>
                    <input type="submit" value="提交" />
                </td>
            </tr>
        </table>
    </form>
</div>
</body>
</html>

service.jsp处理表单请求并向数据库中添加数据

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<%
    request.setCharacterEncoding("UTF-8");
%>
<jsp:useBean id="goods" class="charter5.model1.Goods"></jsp:useBean>
<jsp:setProperty property="*" name="goods"/>
<jsp:useBean id="goodsDAO" class="charter5.model1.GoodsDao"></jsp:useBean>
<%
    goodsDAO.saveGoods(goods);
%>
</body>
</html>

service.jsp页面中对添加商品的请求作了处理,在其中并没有出现java代码与HTML代码混合交织的情况,因为处理业务逻辑的方法由JavaBean来完成,此种开发模式便是Model1模式。

 

 

 

Model2模式

与纯JSP开发方式相比,Model1开发模式是一次进步,但在业务逻辑的控制方面仍然由JSP页面充当。针对Model1的缺陷,Model2提出了MVC的设计理念,分别将显示层、控制层、模型层相分离,使这3层结构各负其责,达到一种理想的设计状态。

 

MVC原理

MVC是一种经典的程序设计理念,此模式将应用程序分成3个部分,分别为模型层(Model),视图层(View)和控制层(Controller)。

 

模型层(Model)

模型层是应用程序的核心部分,主要由JavaBean组件来充当,可以是一个实体对象或一种业务逻辑,之所以称之为模型,是因为它在应用程序中有很好的重用性、扩展性。

 

视图层(View)

视图层提供应用程序与用户之间的交互界面。在MVC模式中,这一层并不包含任何的业务逻辑,仅提供一种与用户交互的视图,在web应用中由JSP、HTML界面充当。

 

控制层(Controller)

控制层用于对程序中的请求进行控制,起到一种宏观调控的作用,它可以通知容器选择什么样的视图、什么样的模型组件,在Web应用中由Servlet充当。

 

Model2模式(JSP+Servlet+JavaBean)在Model1模式的基础上引入了Servlet技术。此种开发模式遵循MVC的设计理念,在JSP作为视图层为用户提供与程序交互的界面,JavaBean作为模型层封装实体对象及业务逻辑,Servlet作为控制层接收各种业务请求,并调用JavaBean模型组件对业务进行处理,在视图与业务之间建立起一座桥梁。

在回过头来看Model1和Model2,在model1中还在JSP中存留一些java代码的影子,虽然有了JavaBean来处理业务,但是对业务的调用还需要在JSP中去调用,这是一种宏观的调控,Model1并没有很好的解决这个问题。在Model2中将Model1的宏观调控抽象了出来作为控制层,由Servlet来完成,Servlet调用处理业务逻辑的JavaBean,衔接调控。

 

案例

依旧是Model1案例中的两个JavaBean:Goods,GoodsDAO

控制层由Servlet充当,不在需要service.jsp了:

package charter5.model2;

import charter5.model1.*;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet("/GoodsController")
public class GoodsController extends HttpServlet {
    private static final long serialVersionUID = 1L;

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        req.setCharacterEncoding("UTF-8");
        resp.setContentType("text/html;charset=UTF-8");
        String name = req.getParameter("name");
        double price = Double.valueOf(req.getParameter("price"));
        String description = req.getParameter("description");
        Goods goods = new Goods();
        goods.setName(name);
        goods.setPrice(price);
        goods.setDescription(description);
        GoodsDao dao = new GoodsDao();
        dao.saveGoods(goods);
        PrintWriter out = resp.getWriter();
        out.println("保存成功!");
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
    
    
}

goodsForm.jsp表单的action属性填写为上面的Servlet的url

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<div>
    <form action="/JavaWebPartice/GoodsController" method="post">
        <table>
            <tr>
                <td>
                    商品名称:
                </td>
                <td>
                    <input type="text" name="name" />
                </td>
            </tr>
            <tr>
                <td>
                    商品价格:
                </td>
                <td>
                    <input type="text" name="price" />
                </td>
            </tr>
            <tr>
                <td>
                    商品描述信息:
                </td>
                <td>
                    <input type="text" name="description" />
                </td>
            </tr>
            <tr>
                <td>
                    <input type="submit" value="提交" />
                </td>
            </tr>
        </table>
    </form>
</div>
</body>
</html>

两种模式比较

Java代码与HTML代码写在一起的方式使得JSP页面十分混乱,对于一些复杂业务的实现,将会导致大量的问题。如一个上千行代码的JSP文件,程序的可读性非常差,出现一个小小的错误,都会给程序的调试带来一定的难度,不利于代码的编写与维护。

Model1开发模式通过JavaBean改变了Java代码与HTML代码混合交织的情况,但它对JavaBean的操作仍在JSP页面中进行,甚至部分JSP页面只用于与JavaBean交互处理业务逻辑,并不包含HTML网页代码,JSP又充当了控制业务逻辑的角色,使显示层与业务层混合在一起,因此这种开发模式仍然不是一种理想状态。

Model2开发模式的出现是程序设计方面的一次巨大的进步,它以MVC的设计理念,将模型层、视图层、控制层相区分,使各部分独当一面,各负其责,充分体现了程序中的层次概念,改变了JSP网页代码与Java代码的深深耦合的状态,为程序提供了良好的重用性及扩展性。

Model1开发模式虽然适用于小型项目的开发,但由于其自身缺陷,已经被逐渐遗弃。

 

好了,到此,Servlet,JSP已经算是告一段落了,总结这篇文档和JSP的那篇笔记都是因为开始了解Struts时,对历史渊源不太清晰而回头作的总结,在MVC出现后,Struts框架是早期对Model2模式的一个经典实现,现在可以去到Struts笔记里了。

 

 

接下来要读

struts / IOC

前进时,请别遗忘了身后的脚印。
原文地址:https://www.cnblogs.com/liudaihuablogs/p/13462239.html