jsp

来源:互联网 发布:监控ip修改软件 编辑:程序博客网 时间:2024/05/05 17:13

JSP起源

在很多动态网页中,绝大部分内容都是固定不变的,只有局部内容需要动态产生和改变。

如果使用Servlet程序来输出只有局部内容需要动态改变的网页,其中所有的静态内容也需要程序员用Java程序代码产生,整个Servlet程序的代码将非常臃肿,编写和维护都将非常困难。 

对大量静态内容的美工设计和相关HTML语句的编写,并不是程序员所要做的工作,程序员对此也不一定在行。网页美工设计和制作人员不懂Java编程,更是无法来完成这样的工作。

为了弥补Servlet的缺陷,SUN公司在Servlet的基础上推出了JSPJava Server Pages)技术作为解决方案。

JSP是简化Servlet编写的一种技术,它将Java代码和HTML语句混合在同一个文件中编写,只对网页中的要动态产生的内容采用Java代码来编写,而对固定不变的静态内容采用普通静态HTML页面的方式编写。

 

JSP页面是由HTML语句和嵌套在其中的Java代码组成的一个普通文本文件,JSP页面的文件扩展名必须为.jsp

JSP页面中编写的Java代码需要嵌套在<%%>中,嵌套在<%%>之间的Java代码被称之为脚本片段(Scriptlets),没有嵌套在<%%>之间的内容被称之为JSP的模版元素。

JSP中的Java代码可以使用out.println语句将其他Java程序代码产生的结果字符串输出给客户端,也可以使用System.out.println语句将它们打印到命令行窗口。

JSP文件就像普通的HTML文件一样,它们可以放置在WEB应用程序中的除了WEB-INF及其子目录外的其他任何目录中,JSP页面的访问路径与普通HTML页面的访问路径形式也完全一样。

 

什么是jsp

JSP全称是Java Server Pages,它和servle技术一样,都是SUN公司定义的一种用于开发动态web资源的技术。

 

JSP这门技术的最大的特点在于,写jsp就像在写html,但它相比html而言,html只能为用户提供静态内容,而Jsp技术允许在页面中嵌套java代码,为用户提供动态数据。

 

Jsp快速入门:在jsp页面中输出当前时间。

 

 

不管是JSP还是Servlet,虽然都可以用于开发动态web资源。但由于这2门技术各自的特点,在长期的软件实践中,人们逐渐把servlet作为web应用中的控制器组件来使用,而把JSP技术作为数据显示模板来使用。

 

其原因为,程序的数据通常要美化后再输出:

jsp既用java代码产生动态数据,又做美化会导致页面难以维护。

servlet既产生数据,又在里面嵌套html代码美化数据,同样也会导致程序可读性差,难以维护。

因此最好的办法就是根据这两门技术的特点,让它们各自负责各的,servlet只负责响应请求产生数据,并把数据通过转发技术带给jsp,数据的显示jsp来做。

JSP的运行原理!

 

 

WEB容器(Servlet引擎)接收到以.jsp为扩展名的URL的访问请求时,它将把该访问请求交给JSP引擎去处理。Tomcat中的JSP引擎就是一个Servlet程序,它负责解释和执行JSP页面。

每个JSP 页面在第一次被访问时,JSP引擎将它翻译成一个Servlet源程序,接着再把这个Servlet源程序编译成Servletclass类文件,然后再由WEB容器(Servlet引擎)像调用普通Servlet程序一样的方式来装载和解释执行这个由JSP页面翻译成的Servlet程序。

Tomcat 5.x把为JSP页面创建的Servlet源文件和class类文件放置在“<TOMCAT_HOME>\work\Catalina\<主机名>\<应用程序名>\”目录中,TomcatJSP页面翻译成的Servlet的包名为org.apache.jsp.<JSP页面在WEB应用程序内的目录名>

 

JSP规范也没有明确要求JSP中的脚本程序代码必须采用Java语言,JSP中的脚本程序代码可以采用Java语言之外的其他脚本语言来编写,但是,JSP页面最终必须转换成Java Servlet程序。

可以在WEB应用程序正式发布之前,将其中的所有JSP页面预先编译成Servlet程序。

 

分析JSP所生成的Servlet代码

 

JSP页面翻译成的Servlet继承了org.apache.jasper.runtime.HttpJspBase类,HttpJspBase类是HttpServlet的一个子类,因此JSP页面翻译成的ServletHttpServlet的一个孙子类。HttpJspBase类实现了javax.servlet.jsp.HttpJspPage接口中的部分方法,因此,HttpJspBase类是抽象的。

SUN公司为JSPWEB容器开发商和JSP页面开发人员提供了一套专门应用于开发JSP程序的Java类,这套Java类被称为JSP APIHttpJspPage接口和JspPage接口属于JSP API,在HttpJspPage接口中只定义了一个_jspService方法,但它继承了JspPage接口,JspPage接口中定义了两个方法:jspInit()jspDestroy()

HttpJspBaseinit方法调用了jspInit_jspInit方法,destroy方法内部调用了jspDestroy_jspDestroy方法,service方法内部调用了_jspService方法。在HttpJspBase中实现的initservicedestroy方法都被声明成了final类型。 

 

JSP规范也没有明确要求JSP中的脚本程序代码必须采用Java语言,JSP中的脚本程序代码可以采用Java语言之外的其他脚本语言来编写,但是,JSP页面最终必须转换成Java Servlet程序。

可以在WEB应用程序正式发布之前,将其中的所有JSP页面预先编译成Servlet程序。

 

JSP脚本表达式中的变量或表达式后面不能有分号(;)。

 

JSP页面中编写的所有代码,默认会翻译到servletservice方法中,而Jsp声明中的java代码被翻译到_jspService方法的外面。语法:

<%

       java代码

%>

所以,JSP声明可用于定义JSP页面转换成的Servlet程序的静态代码块、成员变量和方法。

 

多个静态代码块、变量和函数可以定义在一个JSP声明中,也可以分别单独定义在多个JSP声明中。

 

JSP隐式对象的作用范围仅限于Servlet_jspService方法,所以在JSP声明中不能使用这些隐式对象。

 

 

有三种注释方式

HTML注释(输出注释):指在客户端查看源代码时能看见注释。例如,

<!-- this is an html comment.it will show up int the response. -->

JSP页注释(隐藏注释):指注释虽然写在JSP程序中,但不会发送给客户,因此在客户端查看源代码时不能看见注释。这样的注释在JSP编译时被忽略掉。

<%--this is a JSP comment.it will only be seen in jsp code--%>

Java注释:只能出现在Java代码区中,不允许直接出现在页面中。//单行注释   /*多行注释*/

 

 

Out隐式对象

 

Page指令:

Request

Response

Session

Application

Config

Page

Exception

Out

Pagecontext

 

 

 

 

 

page指令可以定义如下属性:

import,contentType,pageEncoding,session,isELIgnored,buffer,autoFlush,

info,errorPage,isErrorPage,isThreadSafe,language,extends

-------------------------------------------

1.import属性

import指定Jsp页面转换成servlet应该导入的包。

【注意】

importpage的属性中唯一可以在同一文档中出现多次的属性。

默认情况下,servlet自动导入

java.lang.*

javax.servlet.*

javax.servlet.http.*

javax.servlet,jsp.*

 

【语法】

<%@ page import="java.util.*" %>

-------------------------------------------

2.contentType属性

contentType属性设置Content-Type响应报头,标明即将发送到客户程序的文档的MIME类型。

 

【注意】

servlet的默认MIMEtext/plain,Jsp的默认MIMEtext/html(默认字符集是ISO-8859-1)

 

【语法】

<%@ page contentType="text/html" %>

<%@ page contentType="text/html;charset=gb2312" %>

和下面的scriptlet所起到的作用基本相同

<%response.setContentType("text/html")%>

第一点不同之处是,response.setContentType使用明确Java代码,而page指令只用到Jsp语法。

第二点不同之处是,page指令被特殊处理,它们不是在出现的位置直接转换为_jspService代码。

这意味着response.setContentType能够有条件地调用,而page指令不能。

-------------------------------------------

3.session属性

session属性控制页面是否参与HTTP会话。

 

【注意】

true值表示,如果存在已有会话,则预定义变量session应该绑定到现有的会话;

否则,则创建新的会话并将其绑定到session

false值表示不自动创建会话,在Jsp页面转换成servlet时,对变量session的访问会导致错误。

对于高流量的网站,使用session="false"可以节省大量的服务器内存。

但是要注意session="false"并不禁用会话跟踪--它只是【阻止】Jsp页面为那些尚不拥有会话的用户创建新的会话。

 

【语法】

<%@ page session="true" %><%--默认为true--%>

<%@ page session="false" %>

 

-------------------------------------------

4.isELIgnored属性

isELIgnored表示是忽略(true)JSP2.0表达式语言(EL),还是进行正常的求值(false)

 

【注意】

JSP2.0引入一种简洁的表达式语言,在Jsp页面中可以用它来访问请求参数、cookieHTTP报头、bean属性和Collection的元素。

表达式的形式为${exdivssion}

 

【语法】

<%@ page isELIgnored="true" %>

<%@ page isELIgnored="false" %>

-------------------------------------------

5.buffer属性

buffer属性指定out变量使用的缓冲区的大小。

 

【注意】

服务器实际使用的缓冲区可能比指定的更大,但不会小于指定的大小。

例如<%@ page buffer="32kb" %>

表示应该对文档的内容进行缓冲,

除非累计至至少为32KB或页面完成或调用response.flushBuffer(明确地对输出执行晴空)

否则不将文档发送给客户。

 

默认的缓冲区大小和服务器有关,但至少8KB

如果将缓冲区功能关闭,应该十分小心,这样做要求设置报头或状态代码的Jsp元素都要出现在文件的顶部,位于任何HTML内容之前。

 

【语法】

<%@ page buffer="sizekb" %>

<%@ page buffer="none" %>

-------------------------------------------

6.autoFlush属性

autoFlush属性控制当缓冲区充满之后,是应该自动清空缓冲区(默认),还是在缓冲区溢出后抛出一个异常。

 

【注意】

buffer="none"的时候,autoFlush="false"是不合法的。

因为当buffer="none"则表示将缓冲区功能关闭,那么autoFlush="false"没有任何意义。

 

【语法】

<%@ page autoFlush="true" %><%--默认--%>

<%@ page autoFlush="false" %>

-------------------------------------------

7.info属性

info属性定义一个可以在servlet中通过getServletInfo方法获取的字符串。

 

【语法】

<%@ page info="some message" %>

-------------------------------------------

8.errorPage

errorPage属性用来指定一个Jsp页面,该页面用来处理当前页面中抛出但未被捕获的任何异常。

指定的页面可以通过exception变量访问抛出的异常。

 

【注意】

errorPage属性指定页面专用的错误页面。

如果要为整个web应用之多逆光错误页面或者为应用中不同类型的错误指定错误处理页面,

则需要使用web.xml中的error-page

 

【语法】

<%@ page errorPage="someurl.jsp" %>

 

【示例】

//some.jsp

<html>

<body>

   <%@ page errorPage="/WEB-INF/myErrors.jsp" %>

   <%

    String num1 = request.getParameter("num1");

    String num2 = request.getParameter("num2");

    int result = Integer.parseInt(num1)/Integer.parseInt(num2);//如果num2=0则会抛出异常

   %>

   <%= result %>

</body>

</html>

 

///WEB-INF/myErrors.jsp

<html>

<body>

   <%@ page isErrorPage="true" %>

   <%= exception %>

 

   <%@ page import="java.io.*"%>

   <% exception.printStackTrace(new PrintWriter(out)); %>

</body>

</html>

-------------------------------------------

9.isErrorPage属性

isErrorPage指定当前页是否可以作为其他Jsp页面的错误页面。

 

【语法】

<%@ page isErrorPage="true" %>

<%@ page isErrorPage="false" %> <%--默认--%>

-------------------------------------------

10.isThreadSafe属性(不要使用该属性,应该使用显示的同步措施)

isThreadSafe属性控制由Jsp页面生成的servlet是允许并行访问(默认),

还是同一时间不允许多个请求访问单个servlet实例(isThreadSafe="false")

 

【注意】

因为SingleThreadModel的设计很差,使得它基本上毫无用处。因而,应该避免使用isThreadSafe,采用显示的同步措施取而代之。

 

放弃吧!忘掉SingleThreadModelisThreadSafe="false"

-------------------------------------------

11.extends属性

extends属性指定Jsp页面所生成的servlet的超类。

 

【注意】

一般人应该避免使用该属性,除非引用由服务器提供商专为这种目的提供的类。

 

【语法】

<%@ page extends="package.class" %>

-------------------------------------------

12.language属性

language属性指定页面使用的脚本语言。

 

【注意】

就现在来说,由于java既是默认选择,也是唯一合法的选择,所有没有必要再去关心这个属性。

 

【语法】

<%@ page language="java" %>

原创粉丝点击