JavaWeb技术发展(Servlet/JSP/EJB)

2 篇文章 0 订阅


1、早期Web技术

早期的Web应用主要用于浏览新闻等静态页面,用户通过HTTP协议请求服务器上的静态页面,服务器上的Web服务器软件接收到请求后,读取URI标示的资源(文本、图片等),再加上消息报头发送给客户端浏览器,浏览器负责解析HTML,将结果呈 现出来。

然而随着时间发展,用户已经不满足于仅浏览静态页面。用户需要一些交互操作,获取一些动态结果。如果基于HTTP协议实现服务器端软件增强功能太过复杂,所以需要一些扩展机制来实现用户想要的功能。早期使用的Web服务器扩展机制是CGI(Common Gateway Interface,公共网关接口)。使用这种方法,用户单击某个链接或输入网址来访问CGI程序,Web服务器收到请求后,运行该CGI程序,对用户请 求进行处理,紧接着将处理结果并产生一个响应,该响应被返回给Web服务器,Web服务器对响应进行包装,以HTTP响应的方式返回给浏览器。

CGI程序在一定程度上解决了用户需求。不过还存在一些不足之处,如CGI程序编写困难,响应时间较长,以进程方式运行导致性能受限。于是1997年,sun公司推出了Servlet技术,作为Java阵营的CGI解决方案。

2、Servlet

2.1 Servlet简介

Java Servlet(Java服务器小程序)是一个基于Java技术的Web组件,运行在服务器端,它由Servlet容器所管理,用于生成动态的内容。 Servlet是平台独立的Java类,编写一个Servlet,实际上就是按照Servlet规范编写一个Java类(Servlet接口很简单,只有init、getServletConfig、service、getServletInfo和destroy这5个方法,它们构成了实现Servlet功能的规范)。Servlet被编译为平台独立的字节码,可以被动态地加载到支持Java技术的Web服务器中运行。

我们开发Servlet时一般就是继承HttpServlet(实现了Servlet接口)重写它的doGet、doPost方法达到提供服务的目的。Servlet不仅仅是这些,我们用的JSP在编译器也会被编译成Servlet类,JSP是一种页面渲染更为方便的Servlet。

2.2 Servlet容器

Servlet是一个提供服务的Web组件(类),不过光有Servlet这一个组件可没什么用,它没有main方法,不能独立运行,也不能接收HTTP请求,那它是怎么发挥作用的呢?

首先需要一个能运行和管理Servlet组件的程序,我们叫它Servlet容器,其次这个程序要实现Web服务器功能,即能够接收和响应客户端的HTTP请求。以下以Tomcat为例,来说明Servlet容器的功能,Tomcat有两个核心核心组件,Connector和Container,Connector在指定的端口上进行监听,接收客户端发过来的HTTP请求,并创建 Request 和 Response 用于后续的数据交互,Request包含了用户的请求信息,Response负责记录了服务器的答复内容。然后会产生一个线程来处理这个请求并把产生的 Request 和 Response 对象传给Container处理。

在这里插入图片描述
1)启动Web服务器(Tomcat),初始化Servlet容器(Engine、Host等)。
2)创建HTTP服务器(Connector)并绑定IP,监听指定端口。
3)客户端(浏览器,APP等)访问Web服务器(Tomcat),发送HTTP请求。
4)HTTP服务器(Connector)接收到请求后,创建Request 和 Response对象,传递给Servlet容器(Engine)。
5)Servlet容器加载Servlet,产生Servlet实例后,向其传递表示请求和响应的对象。
6)Servlet实例使用请求对象得到客户端的请求信息,然后进行相应的处理。
7)Servlet实例将处理结果通过响应对象发送回客户端,容器负责确保响应正确送出,同时将控制返回给Web服务器。
8)在Keep-Alive时间内,客户端与服务器的通信使用同一连接,超过Keep-Alive时间后,HTTP服务器关闭与客户端的连接。

2.3 Servlet编程示例

1、编写Java代码,继承HttpServlet,重写一些方法,主要是doGet()。

import java.io.*;
import javax.servlet.http.*;

public class HelloServlet extends HttpServlet {

    private String message;

    @Override
    public void init() {
        System.out.println("init");

        // 执行必需的初始化
        message = "Hello World";
    }

    @Override
    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws IOException  {

        System.out.println("doGet: " + request.getRequestURI());

        // 设置响应内容类型
        response.setContentType("text/html");

        // 实际的逻辑是在这里
        PrintWriter out = response.getWriter();
        out.println("<h1>" + message + "</h1>");
    }

    @Override
    public void destroy() {
        System.out.println("destroy");
    }
}

2、编译

  • IDE编译
    在这里插入图片描述
  • Javac编译,需要用到servlet-api.jar包,可以在Tomcat/lib目录下找到,放于源码文件同目录下,编译指令:
javac -encoding utf-8 -Djava.ext.dirs=./ HelloServlet.java

3、运行
将编译生成的HelloServlet.class文件放于 <Tomcat>/webapps/ROOT/WEB-INF/classes目录下, 并在<Tomcat>/webapps/ROOT/WEB-INF/目录下创建web.xml配置文件,文件内容如下:

<?xml version="1.0" encoding="UTF-8"?>
<web-app>
    <servlet>
        <servlet-name>HelloServlet</servlet-name>
        <servlet-class>HelloServlet</servlet-class>
    </servlet>

    <servlet-mapping>
        <servlet-name>HelloServlet</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>
</web-app>

启动Tomcat,浏览器输入指定路径和端口:http://127.0.0.1:808

在这里插入图片描述
4、Maven创建Servlet项目

  • 新建Maven项目
  • 编写HelloServlet类,并在指定目录下创建web.xml文件

在这里插入图片描述

  • pom.xml,引入servlet依赖,打包方式为war包
    <packaging>war</packaging>
    <dependencies>
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>4.0.1</version>
        </dependency>
    </dependencies>
  • 打包,修改打包后的文件名为ROOT.war放入<Tomcat>/webapps目录下运行。

2.4 Servlet缺点

  • 输出界面麻烦,每个输出都要拼接文本,如果是输出网页,还得懂的前端代码;
  • 业务逻辑、页面跳转、前端代码等全部堆积在一起,显得繁杂;
  • 每写一个Servlet在web.xml中都要做相应的配置,导致web.xml内容过于繁多;
  • 改变页面外观或者使其适应于另外一种客户端很困难,Servlet需要修改和重新编译。

3、JSP

为解决Servlet开发的不便,Sun公司主导创建了一种动态网页技术标准JSP(Java Server Pages)。JSP本质是一种Java Servlet,主要用于实现Java Web应用程序的用户界面部分。

3.1 纯JSP

使用JSP标签在HTML网页中插入Java代码,标签通常以<%开头以%>结束来编写JSP。JSP通过网页表单获取用户输入数据、访问数据库及其他数据源,然后动态地创建网页。

虽然JSP解决了一些纯Servlet开发的不便之处,但是前后端代码夹杂在一起,业务逻辑、数据处理混乱的问题并没有得到解决。于是JSP Model1,JSP Model2开发模式相继出现。

3.2 JSP Model1

Model1的开发模式是:JSP+JavaBean的模式,这种开发模式有一个简单的分层 :控制层+表现层JSP、数据层JavaBean。JavaBean负责与数据库打交道,而JSP负责处理HTTP请求,通过JavaBean获得数据后渲染页面。

在这里插入图片描述

JavaBean可以理解为实体类,是遵守JavaBean API规范的Java类:

  • 所有属性为private
  • 提供默认的无参构造方法
  • 提供getter和setter
  • 实现Serializable接口

3.3 JSP Model2

Model1模式虽然在一定程度上解耦了,但JSP依旧即要负责页面渲染,又要负责逻辑处理,还是没有完全解耦。为了高度解耦,Model2模式应运而生,Model2是按照MVC模式设计的,即Servlet+JSP+JavaBean。

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

控制层通过Servlet来实现,获取前台传的参数,处理业务逻辑,控制页面跳转,封装对象,向前台传输对象或者参数。这里可以理解为Servlet为MVC设计模式中的C,即控制器。

在这里插入图片描述

4、EJB

Servlet,容器,JSP规范都是为了方便JavaWeb的开发,避免重复造轮子,使得开发人员可以集中精力编写业务逻辑代码,而不是重复的编写底层的东西。但是在业务逻辑代码编写的过程中,需要用到一些中间件,比如分布式服务、事务处理、数据存储、持久性和安全性,这些中间件也可以从业务逻辑中分离出来,成为单独的组件,被开发人员重复使用。EJB 规范的推出就是为了解决这些问题。

EJB (Enterprise Java Beans) 是基于分布式事务处理的企业级应用程序的组件。Sun公司发布的文档中对EJB的定义是:EJB是用于开发和部署多层结构的、分布式的、面向对象的Java应用系统的跨平台的构件体系结构。

前文所说的JavaBean是一种组件,Sun公司制定的规范中只定义了一些属性和方法,任何一个遵守该规范的类都可以叫做JavaBean,我们可以把业务逻辑和事件都放进去,但是JavaBean规范没有提供服务框架,当应用需要使用系统级服务(前面所说的中间件)时,得自己实现,没有规范各家都实现自己的一套,又会出现重复造轮子的情况。

EJB不是一般的JavaBean,EJB是企业级JavaBean,书写EJB是需要遵循一定的规范的,要运行EJB,你需要相应的EJB容器,比如Weblogic、Jboss等,而JavaBean不需要,只需要安装Tomcat就可以了。

把业务逻辑写到EJB中,遵循EJB规范,不用自己手工编写中间件,只需要把专注力集中在业务功能上,缩减开发时间。

EJB属于J2EE标准,我们看下EJB在J2EE体系结构中的位置:

在这里插入图片描述

  • 视图层或表现层:提供用户界面;接收用户输入;数据输出。WEB应用的情况,JSP以及SERVLET属于视图层组件。
  • 业务逻辑层:实际的业务逻辑处理。根据视图层传送过来的数据,进行实际的业务逻辑处理(包括数据库的查询,更新等),再把处理后的结果返回给视图层。EJB,以及不使用EJB的情况下担当业务逻辑处理部分的JavaBean等归属于业务逻辑层组件。
  • 数据库层或数据持久化层:多指用于保存业务数据的数据库,也可以是文件等等。
  • EJB属于J2EE体系结构中的业务逻辑层部分。

随着Web技术的发展,现阶段JavaWeb开发大部分都是基于Spring框架开发的,接下来会对Spring框架进行介绍,点这里

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值