javaweb开发之jsp

一、JSP概述

在JSP出现之前,java体系的动态网页是由servlet来生成的。但由于用Servlet生产动态网页非常麻烦,难于维护,必须由程序员来编写,页面设计人员如果不懂java代码,根本无法维护。经过进化就产生了JSP。JSP把原来在Servlet中用out.print()方法输出来的html元素,都直接写在页面,简单很多。

JSP引擎:支持jsp文件转化和编译的servlet。

Tomcat目录下的work存放的是tomcat编译后的文件。

JSP原始代码中包含了jsp元素和Template(模板)data两类。
JSP元素将由JSP引擎直接处理,必须符合JSP规范,否则会编译错误。
Template是JSP引擎不进行处理的部分。即标记<%.....%>以外的部分。

JSP执行过程

Web容器处理JSP文件请求的执行过程主要包括以下4个部分: 
1. 客户端发出Request请求 
2. JSP Container 将JSP转译成Servlet的源代码 
3. 将产生的Servlet源代码经过编译后,并加载到内存执行 
4. 把结果Response(响应)至客户端 

JSP的执行性能和Servlet的差别只在第一次的执行。因为JSP在第一次执行后,会被编译成Servlet的类文件,即.class,当再重复调用执行时,就直接执行第一次所产生的Servlet,而不再重新把JSP编译成Servelt。因此,除了第一次的编译会花较久的时间之外,之后JSP和Servlet的执行速度就几乎相同了。 

当JSP网页在执行时,JSP Container 会做检查工作,如果发现JSP网页有更新修改时,JSP Container 才会再次编译JSP成 Servlet; 如果JSP没有更新时,就直接执行前面所产生的Servlet。

在执行JSP网页时,通常可以分为两个时期:转译时期(Translation Time)和请求时期(Request Time)。

转译时期:JSP网页转移成Servlet类。 
    转译期间做了两件事情: 
    转译时期:将JSP网页转移为Servlet源代码 .java.。
    编译时期:将Servlet 源代码 .java编译成 Servlet类 .class。

请求时期:Servlet类执行后,响应结果至客户端。 

三、JSP元素

在jsp页面中,jsp元素可以分为三大类:JSP指令元素、JSP动作元素、JSP脚本元素

1. JSP指令元素

JSP指令元素仅仅是在“翻译”阶段使用的,即把JSP翻译成Servlet。

1.1 指令元素语法

<%@ 指令元素 属性=值 属性=值%>

1.2 指令元素分类

<%@ page ....%> 定义了独立于页面的属性,例如会话跟踪,错误处理页面和对缓存的要求。

<%@ include..%> 在翻译阶段引入一个文件。

<%@ taglib...%> 声明一个在页面使用的自定义行为的标记库。

1.3 说明

JSP页面page指令元素中pageEncoding和contentType属性同时存在的话,如果ContentType写了charset永远是用该charset,如果没写就是用pageEncoding中的charset。如下例代码中,该jsp页面用的charset是UTF-8。

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="GBK"%>

2. JSP动作元素

jsp动作元素又可分为:JSP标准动作元素、JSP标准标记库(JSTL)动作元素、自定义动作元素三种。

2.1 JSP标准动作元素

JSP标准动作元素是早期就存在的JSP规范定义的标准动作元素,它是由jsp作为前缀的标签。例如:

<jsp:useBean ......>

常用的几种动作标签:
<jsp:include>动态引入。可以使用相对路径。
<jsp:forward>
使用以上两个标签可以使用<jsp:param name=”” value=””>标签向这个程序传递参数信息。处理中文编码方式为,在主页面中设置request的编码即可。

2.2 JSP标准标记库(JSTL)动作元素

JSP标准标记库(JSTL)动作元素是在JSP发展到后才来产生的,他主要由:核心库(core)、国际化和格式化库、关系数据库访问库、XML处理库、函数库,这五个库组成。每个库的标签都对应相应的标签前缀。比如:核心库里面的标签前缀是c,<c:out...>。由于现在的Web一般都采用MVC模式,所以JSTL中的关系数据库访问库一般比较少用到。而在用纯JSP设计的Web中一般会用到。

在“JSP标准动作元素”和“JSP标准标记库(JSTL)动作元素”中,有些动作的功能是相同或相似,你可以任意选择其中一种来用。但因为“JSP标准标记库(JSTL)动作元素”是后来才制定,它通常功能更强,而且书写更简单,一般建议选用JSTL中的标记。

2.3 自定义动作元素

自定义动作元素如果觉得JSTL还不够用,你还可以开发自定义的定制动作。不作具体介绍。

3. JSP脚本元素

JSP脚本元素在JSTL还没发展起来时,是JSP代码的主要组成部分,在JSP脚本里面可以写各种各样的java代码来完成各种任务。但JSP页面中大量使用JSP脚本元素会使JSP页面凌乱,而且JSP页面使用JSP脚本元素不方便编程任务的分工。可以说,JSTL就是为了解决JSP脚本元素带来的问题而产生的。有了JSTL后,可以用JSTL取代JSP脚本元素(但JSTL还在完善中,有时不能100%的取代JSP页面中的JSP脚本元素)。EL表达式也是JSP在后来引进的。他可以为JSP标记的属性等动态赋值,比JSP表达式更加简单易用。

3.1 声明语句

声明语句,用于在JSP页面的是吸纳类中声明实例变量的方法。一般写到页面中的head标签内。

语法:

<%! 声明语句 %>

举例:

<%!
   private static final String str=”123”;
   static {
       System.out.println(static…);
    }
    public int add(int a,int b){
        return a+b;
    }
%>

3.2 小脚本

用于嵌入脚本代码。

语法:

<% java代码 %>

3.3 表达式

用于嵌入java表达式,这些表达式的结果将加入应答中,也可以用作运行时行为的属性值。

语法:

<%= 表达式 %>

3.4 注释

语法:

<%--注释--%>

在jsp页面中可以使用Java注释、html注释和jsp注释,但是在浏览器中只能看到html的注释。

四、JSP九大内置对象

1. 概述

JSP脚本中包含九个内置对象,这九个内置对象都是Servlet API接口的实例,只是JSP规范对它们进行了默认初始化(由JSP页面对应的Servlet的_jspService()方法来创建这些实例)。

与servlet相关的隐含对象
   page:Object page = this;
   config
与input/output有关的隐含对象
   out
   request
   response
jsp执行时,提供有关context的隐含对象
   session
   application
   pageContext
与error有关对象的隐含对象

   exception

2. 使用

可以通过page指令设置session是否在jsp页面中使用。在page指令中设置session标识仅仅是告诉jsp引擎在生成servlet代码的时候是否添加sesion这个内部变量。

jspconfig:在web.xml中配置jsp文件。如果配置了jsp的请求规则,直接访问jsp和通过配置的请求规则访问jsp,后台的访问机制是不一样的。如果直接访问jsp,得到的servletConfig也是JSPServlet的配置参数。通过请求规则访问,得到的servletConfig是自己的,但是在JSPServlet里面配置的初始化参数也会出现。

在JSP页面处理forward的三种方式:
<%
RequestDispatche rd = request.get("...");
rd.forward(req,resp);
%>
<%
pageContext.forward();
%>
<jsp:forward page="..." />

Page作用域没有setAtrribute()和getatrribute()方法;

JSP异常处理机制
<1>使用page指令中的isErrorpage=”true”用来加在一个抛错的页面,处理错误的页面加入errorPage=”错误页面.jsp”。这样,抛错页面一旦出现错误,就会把得到的错误放到request中,并转发到错误处理页面,错误处理页面就可以使用exception内置对象统一处理错误。
<2>在web.xml统一配置出错处理页面方式:
<error-page>
<exception-type>java.lang.Exception</exception-type>
<location>/error/exception.jsp</location>
<error-page>

五、jsp和servlet的联系和区别

jsp本质上就是Servlet,jsp经编译后最终就变成了Servlet;

Servlet是在java代码产生html输出结果,jsp是在html网页中嵌入java代码。jsp擅长页面显示,Servlet擅长逻辑控制。



你可能感兴趣的:(javaweb开发之jsp)