动态页面技术的发展与应用

静态页面:web诞生后的html文档,不论多少次访问都是同一份html文档或者是其他的什么文档,所以说是”静态“的。

  • 同理,静态资源就是静态文档、文件、图片等资源。浏览器可以直接解析静态资源
  • 虽然js能让页面和用户互动,但是不论什么人访问,看到的都是放在服务器的那一份写死的文件/文档

1995年,Rasmus Lerdof 创造的 PHP 开始活跃在各大网站,它让 Web 可以访问数据库了,PHP 实现了动态网页。
动态网页结合数据库,根据数据为不同用户动态生成html页面,进一步丰富了和用户的数据交互。

  • 可以实现表单和一些简单交互
    • 表单是直到动态页面才加入?

动态资源被访问后,需要先转换为静态资源(动态页面结合数据由“引擎”编写成静态html页面),再返回给浏览器
* 如:servlet/jsp,php,asp…

AJAX,Async JavaScript And XML,于1998年开始初步应用,2005年开始普及。AJAX的广泛使用,标志着Web2.0时代的开启。这同时也是各大浏览器争锋的时代。

CGI 公共网关接口

Common Gateway Interface:CGI 规范目前是由 NCSA 维护的,NCSA 定义 CGI 如下:
是一种用于外部网关程序与信息服务器(如 HTTP 服务器)对接的接口标准。

通过服务器调用远程应用程序(称为CGI程序或CGI脚本)的技术。可以通过输出方法(如c++的cout)在Http响应中写入内容;
Java Servlet 通常情况下与使用 CGI实现的程序可以达到异曲同工的效果。
Servlet 与CGI相比有以下几点优势:

  • 性能提升:
    • Servlet 在 Web 服务器的地址空间内执行。能够在各个程序之间共享数据,使得数据库连接池之类的功能很容易实现。而CGI是另一个程序,需要再创建一个单独的进程来处理每个客户端请求。
    • 如果有N个并发的对同一CGI程序的请求,则该CGI代码要反复从硬盘装载进内存N次;
    • 和线程模型的服务器的关系
  • Servlet 运行在基于java的servlet容器中,跨平台,方便在多种支持servlet容器的服务器间迁移。
  • 服务器上的 Java 安全管理器执行了一系列限制,以保护服务器计算机上的资源。因此,Servlet 是可信的。
  • Java 类库的全部功能对 Servlet 来说都是可用的。它可以通过 sockets 和 RMI 机制与 applets、数据库或其他软件进行交互。
  • 传统技术中,一般大都为二层的系统架构,即Web服务器+数据库服务器,导致网站访问量大的时候,无法克服CGI程序与数据库建立连接时速度慢的瓶颈,从而死机、数据库死锁现象频繁发生。而Servlet有连接池的概念,它可以利用多线程的优点,在系统缓存中事先建立好若干与数据库的连接,到时候若想和数据库打交道可以随时跟系统"要"一个连接即可,反应速度可想而知。

Servlet容器与FastCGI程序之间并没有那么大的差异
关于线程模型,实际上FastCGI规范也允许应用服务进程复用同一个监听端口,多线程并行处理请求,跟Servlet没太大区别。

FastCGI
快速通用网关接口(Fast Common Gateway Interface/FastCGI)是通用网关接口(CGI)的改进,FastCGI使用进程/线程池来处理一连串的请求。这些进程/线程由FastCGI服务器管理,而不是Web服务器。 当进来一个请求时,Web服务器把环境变量和这个页面请求通过一个Socket长连接传递给FastCGI进程。wiki FastCGI

性能:通过进程/线程池规避了CGI开辟新的进程的开销。
语言无关:FastCGI是一套标准,理论上讲只要能进行标准输出(stdout)的语言都可以作为FastCGI标准的Web后端。
FastCGI规范的核心,是应用服务程序如何与Web服务器通信。Servlet容器进程跟独立Web服务器进程之间,通过套接字通信,应用层协议主要是HTTP和AJP。而FastCGI应用程序进程跟Web服务器进程也是两个进程,也通过套接字通信,不同的也就应用层是FastCGI协议而已。

当然,FastCGI规范不仅仅包含了一个应用层通信协议,还要求应用程序进程是Web服务器进程的子进程,生命周期受Web服务器管理。

JSP与CGI有着相似的功能,但和CGI程序相比,JSP程序有如下优势:

  • 性能更加优越,因为JSP可以直接在HTML网页中动态嵌入元素而不需要单独引用CGI文件。
  • 服务器调用的是已经编译好的JSP文件,而不像CGI/Perl那样必须先载入解释器和目标脚本。
  • JSP 基于Java Servlet API,因此,JSP可以结合各种企业级JavaEE API,包括JDBC,JNDI,EJB,JAXP等等。

关于性能:CGI则需要在每次请求时重新解析和加载模块,这可能会带来一定的开销。此外,CGI脚本通常使用解释器来执行,而不是编译执行,这可能会影响性能。

web服务器配置后可以读取cgi命令。
如果提交方法是GET的话,那么GET所提交的内容则被包含在名为QUERY_STRING的环境变量中,当得到这个环境变量的值后,将其内容解析出来就可以得到name/value这样的值对了,就可以进行相应的处理了。而POST的话,则需要从标准输入流STDIN里面读取数据,而这些数据到底有多少呢?这个则需要通过读取CONTENT_LENGTH这个环境变量的值来知道。
像在C语言里面,可以通过getenv函数来直接获取环境变量的值,比如:getenv(“QUERY_STRING”), getenv(“CONTENT_LENGTH”)等等。Java读取环境变量的方式有点特殊,因为Java是没有直接获取这些环境变量的函数的。Java为何不能直接访问环境变量?简单说,因为Java内部还有一个属于System这个类的属性。因此,我们一个System.getProperty获取的是Java中这个System类的属性的,而不是环境变量的。这些System的属性也是以name/value这样的形式来存储一些Java运行环境的信息的。因而,额外的环境变量(或者说属性信息)需要用指令java -D的形式。

.JAVA编程思想——JAVA与CGI

Servlet

Servlet(Server Applet)运行在服务器端的小型程序
有一个Servlet接口,定义了Java类被浏览器访问的规则。
我们自定义一个类,实现Servlet接口,复写方法。

Java Servlet 在遵循Java Servlet 规范定义的标准容器环境中运行,容器环境在 HTTP 通信和 Web 服务器平台之间实现了一个抽象层。容器环境负责把请求传递给 Servlet,并把结果返回给客户。容器环境也提供了配置Java Servlet 应用的简单方法并且也提供了以声明性的方式使用特殊的基于 Web 应用XML布置描述符对 Java Servlet 应用进行各种管理服务。Java Servlet API中包括了ServletContext 接口,实现与容器环境的交互。

Servlet 为创建基于 web 的应用程序提供了基于组件、独立于平台的方法,可以不受 CGI 程序的性能限制。Servlet 有权限访问所有的 Java API,包括访问企业级数据库的 JDBC API。
Servlet 可以使用 javax.servlet 和 javax.servlet.http 包创建,由javax包可知它是 Java 企业版的标准组成部分。

Servlet 任务

Servlet 执行以下主要任务:

读取客户端(浏览器)发送的显式的数据。这包括网页上的 HTML 表单,或者也可以是来自 applet 或自定义的 HTTP 客户端程序的表单。
读取客户端(浏览器)发送的隐式的 HTTP 请求数据。这包括 cookies、媒体类型和浏览器能理解的压缩格式等等。
处理数据并生成结果。这个过程可能需要访问数据库,执行 RMI 或 CORBA 调用,调用 Web 服务,或者直接计算得出对应的响应。
发送显式的数据(即文档)到客户端(浏览器)。该文档的格式可以是多种多样的,包括文本文件(HTML 或 XML)、二进制文件(GIF 图像)、Excel 等。
发送隐式的 HTTP 响应到客户端(浏览器)。这包括告诉浏览器或其他客户端被返回的文档类型(例如 HTML),设置 cookies 和缓存参数,以及其他类似的任务。

架构图

下图显示了一个典型的 Servlet 生命周期方案。

第一个到达服务器的 HTTP 请求被委派到 Servlet 容器。
Servlet 容器在调用 service() 方法之前加载 Servlet。
然后 Servlet 容器处理由多个线程产生的多个请求,每个线程执行一个单一的 Servlet 实例的 service() 方法。

快速入门:
1. 创建JavaEE项目
2. 定义一个类,实现Servlet接口
public class ServletDemo1 implements Servlet
3. 实现接口中的抽象方法
4. 在web.xml中配置:

   	    <!--配置Servlet -->
   	    <servlet>
   	        <servlet-name>demo1</servlet-name>
   	        <servlet-class>cn.itcast.web.servlet.ServletDemo1</servlet-class>
   	    </servlet>
   	    <servlet-mapping>
   	        <servlet-name>demo1</servlet-name>
   	        <url-pattern>/demo1</url-pattern>
   	    </servlet-mapping>

执行原理:
1. 当服务器接受到客户端浏览器的请求后,会解析请求URL路径,获取访问的Servlet的资源路径
2. 查找web.xml文件,是否有对应的标签体内容。
3. 如果有,则在找到对应的全类名
4. tomcat会将字节码文件加载进内存,并且创建其对象
5. 调用其方法
6. 将 println() 写入输出留的内容写入response

  • Servlet中的生命周期方法:

    1. 被创建:执行init方法,只执行一次
      • Servlet什么时候被创建?
        • 默认情况下,第一次被访问时,Servlet被创建
        • 可以配置执行Servlet的创建时机。
          • 在标签下配置
            1. 第一次被访问时,创建
              • 的值为负数
            2. 在服务器启动时,创建
              • 的值为0或正整数
              • Servlet的init方法,只执行一次,说明一个Servlet在内存中只存在一个对象,Servlet是单例的
                - 多个用户同时访问时,可能存在线程安全问题。
                - 解决:尽量不要在Servlet中定义成员变量。即使定义了成员变量,也不要对修改值
          1. 提供服务:执行service方法,执行多次
            • 每次访问Servlet时,Service方法都会被调用一次。
          2. 被销毁:执行destroy方法,只执行一次
          • Servlet被销毁时执行。服务器关闭时,Servlet被销毁
          • 只有服务器正常关闭时,才会执行destroy方法。
          • destroy方法在Servlet被销毁之前执行,一般用于释放资源
    • Servlet3.0:
      • 好处:

        • 支持注解配置。可以不需要web.xml了。
      • 步骤:

        1. 创建JavaEE项目,选择Servlet的版本3.0以上,可以不创建web.xml
        2. 定义一个类,实现Servlet接口
        3. 复写方法
        4. 在类上使用@WebServlet注解,进行配置
          • @WebServlet(“资源路径”)
			@Target({ElementType.TYPE})
			@Retention(RetentionPolicy.RUNTIME)
			@Documented
			public @interface WebServlet {
			    String name() default "";//相当于<Servlet-name>
			
			    String[] value() default {};//代表urlPatterns()属性配置
			
			    String[] urlPatterns() default {};//相当于<url-pattern>
			
			    int loadOnStartup() default -1;//相当于<load-on-startup>
			
			    WebInitParam[] initParams() default {};
			
			    boolean asyncSupported() default false;
			
			    String smallIcon() default "";
			
			    String largeIcon() default "";
			
			    String description() default "";
			
			    String displayName() default "";
			}

Java Server Page

网络服务器需要一个 JSP 引擎,也就是一个容器来处理 JSP 页面。容器负责截获对 JSP 页面的请求。
JSP 容器与 Web 服务器协同合作,为JSP的正常运行提供必要的运行环境和其他服务,并且能够正确识别专属于 JSP 网页的特殊元素。
jsp是简化的serlvet。servlet要想动态生成一个网页,需要像cgi一样,在代码中向输出流(如用out.println())写入网页字符串;这很不方便,也导致了界面和代码的耦合
有些类似于swing的界面开发方式了。没有标记语言便捷

web服务器:

  • 服务器:安装了服务器软件的计算机硬件
  • 服务器(应用):接收用户的请求,处理请求,做出响应的进程 。 比如将tomcat和我们写的代码打成一个jar包,在某一端口号运行(即springboot单体应用);或是mysql的mysql-server部分;
  • web服务器:接收用户浏览器的http请求,处理请求,做出响应(通常是返回html文档\转发)。
    • 在web服务器软件中,可以部署web项目,让用户通过浏览器来访问这些项目
    • 如nginx, Apache,微软IIS,还有Tomcat(tomcat还有java的servlet容器功能)
    • 同稍微狭义些的http服务器相比,web服务器是实现web(万维网)的标准的,不仅有http,还可以提供websocket等;
  • Java Servlet容器:
    • 相关概念起源于JavaEE中EJB(企业级javaBean)的容器。

    • 单独的servlet文件需要结合servlet-api相关的JavaEE的jar包,将其初始化后放在容器中管理,才有用

    • Tomcat就是这么一个Servlet容器,顺便还有web服务器功能

      • 常见的java相关的web服务器软件:
        • webLogic:oracle公司,大型的JavaEE服务器,支持所有的JavaEE规范,收费。
        • webSphere:IBM公司,大型的JavaEE服务器,支持所有的JavaEE规范,收费。
        • JBOSS:JBOSS公司的,大型的JavaEE服务器,支持所有的JavaEE规范,收费。
        • Tomcat:Apache基金组织,中小型的JavaEE服务器,仅仅支持少量的JavaEE规范servlet/jsp。开源,免费。
      • JavaEE:Java语言在企业级开发中使用的技术规范的总和,一共规定了13项大的规范

Applet

applet是一个小程序,不打算单独运行,而是嵌入到另一个应用程序中。
Applet类必须是要嵌入Web页面或由Java Applet Viewer查看的任何applet的超类。 Applet类提供了applet与其环境之间的标准接口。

  • Serialized Form: 区别于html的表单吗?servlet菜鸟教程也提到了

Package com.sun.jdi

  • activex
  • flash
  • 模板引擎:
    • 不知道为啥不算动态页面。
    • python似乎从来没有发展出动态页面技术,但是有模板引擎

参考:
JavaEE规范_Oracle官网
Servlet技术_Oracle官网

  • 21
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值