JSP学习

什么是JSP?

JSP全称是Java Server Pages,其根本是一个简化的Servlet,是一种动态网页开发技术,它使用JSP标签在HTML中插入Java代码。标签通常以<%开头以%>结束。

JSP是一种Java servelet,主要用于实现Java web应用程序的用户界面部分。网页开发者可以通过结合HTML代码、XHTML代码、XML元素以及嵌入JSP操作和命令来编写JSP。

JSP通过网页表单来获取输入数据、访问数据库和其他数据资源,然后动态的创建网页。

JSP标签有多种功能,比如访问数据库,记录用户选择信息、访问JavaBeans组件等,还可以在不同的网页中传递控制信息和共享信息。

为什么使用JSP?

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

  • 性能更加优越,因为JSP可以直接在HTML网页中动态嵌入元素而不需要单独引用CGI文件。
  • 服务器调用的是已经编译好的JSP文件,而不像CGI/Perl那样必须先载入解释器和目标脚本。
  • JSP 基于Java Servlet API,因此,JSP拥有各种强大的企业级Java API,包括JDBC,JNDI,EJB,JAXP等等。
  • JSP页面可以与处理业务逻辑的 Servlet 一起使用,这种模式被Java servlet 模板引擎所支持。

最后,JSP是Java EE不可或缺的一部分,是一个完整的企业级应用平台。这意味着JSP可以用最简单的方式来实现最复杂的应用。

JSP的优势

以下列出了使用JSP带来的其他好处:

  • 与ASP相比:JSP有两大优势。首先,动态部分用Java编写,而不是VB或其他MS专用语言,所以更加强大与易用。第二点就是JSP易于移植到非MS平台上。
  • 与纯 Servlet 相比:JSP可以很方便的编写或者修改HTML网页而不用去面对大量的println语句。
  • 与SSI相比:SSI无法使用表单数据、无法进行数据库链接。
  • 与JavaScript相比:虽然JavaScript可以在客户端动态生成HTML,但是很难与服务器交互,因此不能提供复杂的服务,比如访问数据库和图像处理等等。
  • 与静态HTML相比:静态HTML不包含动态信息。

JSP结构

网络服务器需要一个 JSP 引擎,也就是一个容器来处理 JSP 页面。容器负责截获对 JSP 页面的请求。本教程使用内嵌 JSP 容器的 Apache 来支持 JSP 开发。

JSP 容器与 Web 服务器协同合作,为JSP的正常运行提供必要的运行环境和其他服务,并且能够正确识别专属于 JSP 网页的特殊元素。

下图显示了 JSP 容器和 JSP 文件在 Web 应用中所处的位置。

JSP处理

  • 就像其他普通的网页一样,您的浏览器发送一个 HTTP 请求给服务器。

  • Web 服务器识别出这是一个对 JSP 网页的请求,并且将该请求传递给 JSP 引擎。通过使用 URL或者 .jsp 文件来完成。

  • JSP 引擎从磁盘中载入 JSP 文件,然后将它们转化为 Servlet。这种转化只是简单地将所有模板文本改用 println() 语句,并且将所有的 JSP 元素转化成 Java 代码。

  • JSP 引擎将 Servlet 编译成可执行类,并且将原始请求传递给 Servlet 引擎。

  • Web 服务器的某组件将会调用 Servlet 引擎,然后载入并执行 Servlet 类。在执行过程中,Servlet 产生 HTML 格式的输出并将其内嵌于 HTTP response 中上交给 Web 服务器。

  • Web 服务器以静态 HTML 网页的形式将 HTTP response 返回到您的浏览器中。

  • 最终,Web 浏览器处理 HTTP response 中动态产生的HTML网页,就好像在处理静态网页一样。

一般情况下,JSP 引擎会检查 JSP 文件对应的 Servlet 是否已经存在,并且检查 JSP 文件的修改日期是否早于 Servlet。如果 JSP 文件的修改日期早于对应的 Servlet,那么容器就可以确定 JSP 文件没有被修改过并且 Servlet 有效。这使得整个流程与其他脚本语言(比如 PHP)相比要高效快捷一些。

JSP生命周期

理解JSP底层功能的关键就是去理解它们所遵守的生命周期。

JSP生命周期就是从创建到销毁的整个过程,类似于servlet生命周期,区别在于JSP生命周期还包括将JSP文件编译成servlet。

以下是JSP生命周期中所走过的几个阶段:

  • 编译阶段:

    servlet容器编译servlet源文件,生成servlet类

  • 初始化阶段:

    加载与JSP对应的servlet类,创建其实例,并调用它的初始化方法

  • 执行阶段:

    调用与JSP对应的servlet实例的服务方法

  • 销毁阶段:

    调用与JSP对应的servlet实例的销毁方法,然后销毁servlet实例

JSP编译

当浏览器请求JSP页面时,JSP引擎会首先去检查是否需要编译这个文件。如果这个文件没有被编译过(是不是第一次其你去),或者在上次编译后被更改过,则编译这个JSP文件。

编译的过程包括三个步骤:

  • 解析JSP文件。
  • 将JSP文件转为servlet。
  • 编译servlet。

JSP初始化:

容器载入JSP文件后,它会在为请求提供任何服务前调用jspInit()方法。如果您需要执行自定义的JSP初始化任务,复写jspInit()方法就行了,就像下面这样:

public void jspInit(){
  // 初始化代码
}

一般来讲程序只初始化一次,servlet也是如此。通常情况下您可以在jspInit()方法中初始化数据库连接、打开文件和创建查询表。

JSP执行

这一阶段描述了JSP生命周期中一切与请求相关的交互行为,直到被销毁。

当JSP网页完成初始化后,JSP引擎将会调用_jspService()方法。

jspService()方法被用来处理客户端请求。对于每一个请求,JSP引擎创建一个新的线程来处理该请求。如果有多个客户端同时请求该JSP文件,则JSP引擎会创建多个线程。每个客户端请求都对应一个线程。以多线程的方式执行可以大大降低对系统资源的需求。提高系统的并发量和响应时间。但是要注意多线程编程带来的同步问题,由于该Servlet始终驻于内存,所以响应是非常快的。

_jspService()方法需要一个HttpServletRequest对象和一个HttpServletResponse对象作为它的参数,就像下面这样:

void _jspService(HttpServletRequest request,
                 HttpServletResponse response)
{
   // 服务端处理代码
}

_jspService()方法在每个request中被调用一次并且负责产生与之相对应的response,并且它还负责产生所有7个HTTP方法的回应,比如GET、POST、DELETE等等。

JSP清理

JSP生命周期的销毁阶段描述了当一个JSP网页从容器中被移除时所发生的一切。

jspDestroy()方法在JSP中等价于servlet中的销毁方法。当您需要执行任何清理工作时复写jspDestroy()方法,比如释放数据库连接或者关闭文件夹等等。

jspDestroy()方法的格式如下:

public void jspDestroy()
{
   // 清理代码
}

上述部分内容来自于菜鸟教程

下面是自己在看教程中自己总结的:

虚拟路径:http://localhost:8080/TestWebProject/index.jsp 这个就是虚拟路径(访问项目的路径)

关于虚拟路径的好处:第一、我们开发一个项目,在未定版之前需要进行无数次的修改,如果部署测试项目的时候直接将项目打成jar包放到webapps目录下,那么每一次版本变更都需要将新的版本放到webapps目录下覆盖原先的版本,这样对于我们测试项目来说是不是非常麻烦呢?如果建立一个虚拟路径,直接映射到项目原件,这样一来在测试阶段是不是非常的方便?;第二、Tomcat是一个服务器,既然是一个服务器是不是就有容量这么一说呢?虽然这个容量是你说了算,但是再怎么大是不是也有盘符容量限制?如果将所有的项目都部署到webapps目录下,当项目比较大而且项目较多的时候是不是需要考虑一下盘符的感受呢?所以使用虚拟路径也可以为搭载Tomcat服务器的盘符分压!

常见动态网站开发技术对比:

JSP:java平台,安全性高,适合开发大型的,企业级的Web应用程序。

ASP.NET:简单易学,但是安全性和跨平台性差。

PHP:简单高效,成本低开发周期短,特别适合中小型企业的Web应用开发(LAMP:Linux +Apache+MySQL+PHP)

JSP页面元素的构成:

JSP指令:

  • page  <%@ page 属性1="属性值" 属性2="属性值" ……%>  属性:language_制定JSP使用的脚本语言。import_通过该属性来引用脚本语言中使用到的类文件。contentType_用来指定JSP页面所采用的编码方式。
  • include 将一个外部文件嵌入到当前JSP文件中,同时解析这个页面中的JSP语句。
  • taglib  使用标签库定义新的自定义标签,在JSP页面中启用定制行为。

JSP注释:

HTML注释<!--html注释-->客户端可见(这个可见是指在浏览器查看元素时可见)

JSP注释<%-- html注释--%>客户端不可见(这个不可见是指在浏览器查看元素时不可见)

JSP脚本注释    //单行注释     /**/多行注释

JSP脚本:

语法格式:<%代码部分%>

JSP声明:

语法格式:<%! 这里是Java代码,可以定义Java变量或者方法%>

JSP表达式:

语法格式:<% = 表达式%>   注意:表达式不以分号结束。

JSP页面生命周期:

jspService()方法被调用来处理客户端的请求。对每一个请求,JSP引擎创建一个新的线程来处理该请求。如果有多个客户端同时请求该JSP文件,则JSP引擎会创建多个线程。以多线程的方式可大大降低系统随资源的要求,提高系统的并发量和响应时间。但是也要注意多线程的编程带来的同步问题,由于该Servlet常驻于内存,所以响应是非常快的。

JSP内置对象:

 

 缓冲区剩余大小的字节数变大了

抛出异常之后就不打印了 

这里不会抛出异常 

这里先说一下表单的两种提交方式:get和post 

 get

       在这两个对象之前,先来看看get和post。这两种方式都是表单提交的方式。get以明文的方式提交数据,数据在URL中可以看到。提交的数据最多不超过2KB。安全性较低,但是效率比post高。比如:搜索查询等功能。post将用户提交的信息封装在HTML HEADER中。适合提交数据量大,安全性高的用户信息。比如注册、修改、上传等功能。

 

 request对象:客户端请求信息被封装在request对象中,通过它才能了解客户的需求然后作出响应。它是HttpServletRequest类的实例。request对象具有请求域,即完成客户端请求之前,该对象一直有效。常用方法如下:
String getParameter(String name) 返回name制定参数的参数值
String[] getParameterValues(String name) 返回包含参数name的所有的数组
void setAttribute(String, Object) 存储此请求中的属性
Object getAttribute(String name) 返回属性的属性值
String getContentType() 得到请求体的MIME类型
String getProtocol() 返回请求用的协议类型及版本号
String getServerName() 返回接受请求的服务器主机名

  • JSP内置对象简介:JSP内置对象是Web容器创建的一组对象,不用new关键字就可以使用的对象。常见的内置对象有out,request,response,session,application,page,pageContext,exception,config。
  • 四种作用域范围:
  • OUT:说到OUT对象我们先来看一下缓冲区,缓冲区就是内存中的一块区域用来保存临时数据。(IO输出最原始的就是一个字节一个字节输出,就像一碗米一粒一粒吃一样,效率太差,还是拿一碗米来举例,吃米的勺子就可以看做缓冲区。)          out对象是jspWriter的实例,是向客户端输出内容常用的对象。out对象常用的方法有:                                                          void println() 向客户端打印字符串。                                                                                                                                          void clear() 清除缓冲区的内容,如果在flush之后调用会报出异常                                                                                            void clearBuffer() 清除缓冲区内容,如果在flush之后调用不会抛出异常                                                                                  void flush() 将缓冲区内容输出到客户端                                                                                                                                    int getBufferSize() 以字节数的 大小返回缓冲区,如果不设缓冲区则为零。                                                                              int getRemaining() 返回缓冲区还剩多少可用                                                                                                                            boolean isAutoFlush() 返回缓冲区满时是自动清空还是抛出异常                                                                                             
  • request/response:
  • session:
  • application:
  • 其他内置对象:
  • 项目案例:

 

 

 

 

 

 

 

 

 

 

参考文章:

详细解说设置虚拟路径的几种方法以及为什么要设置虚拟路径

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值