JavaWeb开发模式的发展历程

来源:互联网 发布:三维设计软件有哪些 编辑:程序博客网 时间:2024/05/18 01:42

最近又开始慢慢接触MVC模式,包括从自己接触的一些项目中对MVC的理解愈发深刻和明了,写篇博客回顾一下之前和之前的之前是怎么做开发的。
先做声明,本篇博客所有东西写在JavaEE的基础上,不涉及最初的最初的最初的CGI以及之后的Spring或Struts框架等。


最初的最初

纯Servlet开发

在Sun公司刚刚推出JavaEE(Java企业版)时,推出了Servlet这个东西,命名就是Service+Applet,即服务小程序。在Servlet中可以通过挨着行输出Html等语句来实现页面的样式和输出,表现、逻辑、控制、业务全部混在Servlet类中,最多把模型层单独写出来。大概如下面这样:

import java.io.IOException;import java.io.PrintWriter;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;public class HelloWorld extends HttpServlet {    public void doGet(HttpServletRequest request, HttpServletResponse response)            throws ServletException, IOException {        response.setContentType("text/html");        PrintWriter out = response.getWriter();        out.println("<html>");        out.println("<head>");        out.println("<title>Hello World</title>");        out.println("</head>");        out.println("<body>");        out.println("<h1>Hello World!</h1>");        out.println("</body>");        out.println("</html>");    }}

这种开发模式有多么多么的不方便也就不言而喻了,前端工程师看着Servlet里面的Html都要疯了,这怎么改样式???很难受。
并且哪怕对于后端来说,所有的业务逻辑、页面跳转、央视表现全部混杂在同一个类中,并且一项业务一般只有一个Servlet类与其对应,实在是….太麻烦了。
于是,为了解决这种情况,JSP技术应运而生。

最初的之后

纯JSP开发

经过纯Servlet开发的噩梦之后,Sun公司又推出(或者说是倡导)了JSP技术,全称是Java Server Page,中文叫做Java服务器页面,名字不谈,其本质也是最终生成一个Servlet类来编译解析。每个JSP页面编译成一个字节码文件,这里不做详谈。
我们来说说由纯Servlet升级成JSP的好处。
我们都知道,JSP就是在HTML页面可以在<%%>里面添加Java代码,而不像Servlet里面添加Html代码。这样的好处其实显而易见,首先,前台工程师至少可以修改页面的样式了。
但是,虽然有这一点好处,并且开发比Servlet简单、方便得多(自动生成HTML文件,在其中添加Java代码就好),缺点依然是显而易见的:表现、控制、模型、业务逻辑,依然全部混杂在JSP文件中,大段大段的HTML夹杂着Java的代码,其中还有要做的Web的业务逻辑,想想就头皮发麻。比如下面这个例子,一共两个JSP文件,第一个是表单填写,第二个是处理表单的添加,只有一个添加人物的功能
add.jsp

<%--  Created by IntelliJ IDEA.  User: Bryan  Date: 2017/4/8  Time: 11:50  To change this template use File | Settings | File Templates.--%><%@ page contentType="text/html;charset=UTF-8" language="java" %><html><head>    <title>添加人物页面</title></head><body>    <h1>添加人物</h1><hr>    <form action="add_handle.jsp" method="post">        姓名:<input type="text" name="name"><br><br>        年龄:<input type="number" name="age"><br><br>        性别:        <select name="sex">            <option value="0">请选择</option>            <option value="1"></option>            <option value="2"></option>        </select>        <br><br>        <<input type="submit" value="提交">    </form></body></html>

add_handle.jsp

<%@ page import="java.sql.DriverManager" %><%@ page import="java.sql.Connection" %><%@ page import="java.sql.PreparedStatement" %><%--  Created by IntelliJ IDEA.  User: Bryan  Date: 2017/4/8  Time: 11:54  To change this template use File | Settings | File Templates.--%><%@ page contentType="text/html;charset=UTF-8" language="java" %><html><head>    <title>处理任务添加页面</title></head><body>    <%        request.setCharacterEncoding("UTF-8");        String name = request.getParameter("name");        String age = request.getParameter("age");        int sex = Integer.parseInt(request.getParameter("sex"));    %>    <%        Class.forName("com.mysql.jdbc.Driver");        Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/db_mvc_demo","root","root");        String sql = "INSERT INTO t_person(name,age,sex) VALUES(?,?,?)";        PreparedStatement ps = connection.prepareStatement(sql);        ps.setString(1,name);        ps.setString(2,age);        ps.setInt(3,sex);        ps.execute();        request.getRequestDispatcher("index.jsp").forward(request,response);    %></body></html>

可以看到,数据库连接、参数获取这些东西全部都在JSP里面填写,跳转页面也是重定向来跳页。
于是出现了JSP+JavaBean的开发模式(有称Model1开发模式)

Model1开发模式

即JSP+JavaBean的开发模式

JavaBean具体是什么不太好解释,我百度了好久也没看出来一个比较明了的解释方式,下图来自百度百科
百度百科
可以简单理解为JavaBean就是一个Java的类,这个类必须有无参构造方法,并且通过get和set方法来读写成员属性。
JSP基础语法中,有一个标签是<jsp:usebean>来实例化对应Bean类的对象,并且可以规定该对象的生命周期(request response session application)
这样的话,例如上面介绍JSP时的项目,便可以写一个Person的实例化对象,来通过<jsp:setProperty>来将表单的数据封装到Person对象中,并且写一个数据库操作的DBBean类,通过操作DBBean的实例化对象来对数据库进行简单的增删改查(这里不做截图了,理解一下这个思路就好)(项目CMS)
这里写图片描述
这种开发模式有一个简单的分层
JSP:表现层、控制层
JavaBean:模型层(部分业务逻辑也在JSP)

但是这样依旧不是很清晰,JSP负责了表现显示、多数业务逻辑、控制页面跳转,少数业务逻辑(例如读写数据库)由JavaBean来负责。
于是正儿八经的MVC模式出现了(Model2开发模式)

Model2开发模式

即Servlet+JSP+JavaBean来实现MVC模式,在JavaEE中,这种开发方式就是Web MVC模式。

模块 作用 包含 JavaBean 模型层(model) 持久层、业务逻辑层、模型层 JSP 视图层(view) 视图层 Servlet 控制层 控制层

在这种开发模式下,JSP页面中就可以不用任何的<%%>语句了,包括<%=%>全部用EL表达式来代替,列表的遍历和条件判断等(Java中的for循环和if语句)也可以通过JSTL来代替。
这样的话视图层相比较之前的开发模式来说要薄得多的多,JSP中不涉及任何的业务逻辑,前端人员修改样式也十分方便。

控制层通过Servlet来实现,获取前台传的参数、控制页面跳转,封装对象、向前台传输对象或者参数。并且可以由自己设计,设法用一个Servlet类实现该模块的所有功能的页面跳转。举个例子:前台跳转时设一个参数method,其值为想要实现的方法,(例如 跳转至添加页面,处理添加功能,删除,修改等等)。

模型层可以继续分层,通过不同的包(package)来实现

  • dao包负责持久层
  • service包负责业务逻辑层(可有可无)
  • entity(或者pojo)负责实体类
  • util负责工具包
  • 如有必要,可再分层

简单描述MVC的项目逻辑

  • 用户访问JSP页面(视图层)
  • JSP页面向Servlet(控制层)传输参数
  • Servlet将参数传输(或封装后传输)给相应Service(业务逻辑层)
  • Service调用DAO层(持久层)对应方法
  • DAO层操作数据库,返回操作结果
  • Service返回查询结果或操作状态或无返回值
  • Servlet将查询结果(模型)封装成对象,返回前台(JSP),并且控制页面跳转。
  • JSP回显查询结果或其他信息
  • 用户看到想要的信息

简单的项目逻辑

CSDN好像没法上传文件?demo代码有点多,截代码有点太多了

Service层的可有可无

刚刚说了,业务逻辑层可有可无,什么情况下有什么情况下没有呢?
先说基础的,一般情况下,dao层下每一个类对应一个pojo(或者说entity)实体类,例如有一个Person类就有一个PersonDao类,多一个Grade类(成绩)就有一个GradeDao类。每一个dao类对应一个数据库的表,实体类也一样,每一个实体类对应数据库中的一张表。
在某些简单的项目中,不涉及表与表之间的联合查询,或者多表操作,或者DTO的话,那service没有也罢。因为不涉及多表操作,即使有了service,每一个service方法对应一个dao方法
例如:简单项目中想要添加一条新闻,dao中必定有一个方法叫做addNews,如果有service层的话,对应方法是addNews(News news)如下

public void addNews(News news){    newsDao.addNews(news);}

可以看出来,service只是调用了dao中与其对应的一种方法并返回,没有自己多余的代码。所以service就可以省略,直接调用DAO层。因为这种项目是基本上没有业务逻辑的,自然不需要业务逻辑层的出现。
但是如果有不同的情况,例如我想返回给前台一个DTO,或者我想查两个表中的数据,并将查出来的数据封装到同一个对象中。这时候,这些行为都要在service中操作了。比如想查询所有的学生列表,同时显示每个学生的所有成绩,学生是一张表,学生的成绩是另外一张表,那么查询这些信息所需要的方法肯定不止一个,这时,就需要service来处理这些业务逻辑了。

但是,为了养成良好的代码习惯,建议初期写项目的过程中,先全部把service层加上,养成逻辑意识,等写项目十分熟练之后再视情况而定是否需要省略service

并且,为了代码的整齐和方便,其实是我的一个强迫症,建议整个项目中的所有模块,如果有service的话就全部有service,哪怕某个模块没有业务逻辑,如果整个项目全部没有业务逻辑,再将service层省略掉。

整个博客加上demo完成用了一个下午五个多小时,写得最用心的一个博客=V=

补充:demo项目下载地址:http://download.csdn.net/detail/bryanmelody/9807819

3 0
原创粉丝点击