`
wangyanlong0107
  • 浏览: 502247 次
  • 性别: Icon_minigender_1
  • 来自: 沈阳
社区版块
存档分类
最新评论

jsp 编译期、运行期流程问题

    博客分类:
  • jsp
 
阅读更多

我们都知道在jsp中include有两种形式,分别是

  <%@ include file=” ”%>

  <jsp:include page=” ” flush=”true”/>

  前者是指令元素,后者是行为元素。具体它们将在何处用?如何用及它们有什么区别?这应该是很多人看到它都会想到的问题。下面一起来看看吧。

  通常当应用程序中所有的页面的某些部分(例如标题、页脚和导航栏)都相同的时候,我们就可以考虑用include。具体在哪些时候用<%@ include file=“”%>,哪些时候用<jsp:include page=“” flush=”true”/>.这种形式。首先要明白的是它们之间的区别。只有了解了它们用法的不同才理解该在何时去用以及如何选择。

  <%@ include file=“”%>,jsp的include指令元素读入指定页面的内容。并把这些内容和原来的页面融合到一起

  这里对翻译阶段进行一下说明:我们知道,jsp页面不能原封不动地被传送给浏览器,所有的jsp元素都必须首先由服务器进行处理。这是通过将jsp页面转达化成servlet,然后执行这个servlet来完成的。服务器 需要一个jsp容器来处理jsp页面。jsp容器通常以servlet的形式来实现,这个servlet经过配置,可以处理对jsp页面的所有请求。

  Jsp容器负责将jsp页面转化成servlet(称为jsp页面实现类JSP Page implementation class),并编译这个servlet。这两步就构成了翻译阶段.

  由此我们就会知道:jsp页面是把include指令元素所指定的页面的实际内容(也就是代码段)加入到引入它的jsp页面中,合成一个文件后被jsp容器将它转化成servlet。可以看到这时会产生一个临时class文件和一个java文件。下面举个例子。

  服务器用tomcat,引入页面的jsp文件叫test.jsp。被引入的页面叫date.jsp.这个jsp文件里存放的是一个有关时间的jsp代码,当前的上下文根设为test

//======date.jsp的源文件=====//

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

<%

java.util.Date date=new java.util.Date();

String date_cn ="";

String dateStr = "";

switch(date.getDay())

{

case 0:date_cn ="日"; break;

case 1:date_cn ="一"; break;

case 2:date_cn ="二"; break;

case 3:date_cn ="三"; break;

case 4:date_cn ="四"; break;

case 5:date_cn ="五"; break;

case 6:date_cn ="六"; break;

}

dateStr = (1900+date.getYear()) + "年" + (date.getMonth()+1) + "月" + date.getDate() + "日(星期" + date_cn + ")";

%>

document.write("<%=dateStr%>");

//======以下是test.jsp的源文件=============//

<%@ page language=”java” contentType=”text/html;charset=gb2312”%>

<html>

<head>

<title>include的两种用法</title>

<jsp:include page=”date.jsp” flush=”true”/>

<%--@ include file=”date.jsp” %-->

//我们在这里用include的两种不同形式来引入date.jsp这个文件.

<head>

<body>

<table><tr><td>

有关jsp中include的两种用法.敬请关注。

</td></tr></table>

</body>

</html>

  在test.jsp 文件中,我们只输出了一行文本“ 有关jsp中include的两种用法.敬请关注。”,现在让我们先用<%@ include file=”date.jsp” %>这种形式引入date.jsp这个文件。你想会出现什么问题了吗?此时出现了错误提示:

HTTP Status 500 ?

org.apache.jasper.JasperException: /date.jsp(0,0) Page directive: can't have multiple occurrences of contentType

以下还有一堆错误,但我们只要看这里就知道问题的所在了。状态码为http 500服务器内部错误。再看下面的提示。在date.jsp页面中不能指定多个contentType. 原因就在这里了。是因为在翻译阶段,date.jsp文件的代码被原封不动地加入到了test.jsp页面从而合成一个文件。合成后的文件中就会相同的:

<@ page language=”java” contentType=”text/html;charset=gb2312”>

 这句代码。解决的办法是把date.jsp文件中的这句删掉。刷新后再请求test.jsp页面

 请求test.jsp在页面显示如下

 2003年12月10日 13:12:40

 这时我们还不能发现什么。还是去查看tomcat下的临时文件吧。到那里去看看date.jsp文件的内容是否已被加入到了test.jsp文件中。

  在目录下会看到test_jsp.java和test_jsp.class两个文件.

  这里的java文件就是jsp容器将jsp转化成了servlet而得到的test_jsp.java这个文件。相对应的test_jsp.class这个文件就是编译test_jsp.java这个servlet文件产生的类文件了。打开所产生的servlet文件(test_jsp.java),此时我们会发现,在test.jsp 文件被转化成servlet文件时,在输出的<haed>之间加入了一些不是test.jsp页面里面的代码,新加入的内容就是 date.jsp里面的代码: 新加入了哪些内容或是否真的加入了新的内容请自己测试去看一下就会一目了然了.在这里不再详述.

以上就是我们用<%@ include file=”date.jsp”%>这种形式得到的结果.

下面我们换用<jsp:include page=”dae.jsp” flush=”true”/>也就是将

 <%@ include file=”date.jsp”%>换成<jsp:include page=”dae.jsp” flush=”true”/>,然后请求test.jsp.

 2003? ê 12??10?? 13:30:13

 此时会在页面上看见.我们所引入date.jsp输出的日期中中文出现了乱码.什么原因?是因为include行为元素是在请求处理阶段执行的(此处要对请求处理阶段进行说明一下,Jsp容器除了上面提到的负责将jsp页面转化成servlet外,还负责调用jsp页面实现类以处理每个请求并产生应答.这个阶段我们就称为请求处理阶段.请求处理阶段仅执行类文件)。

  所以在我们作include行为元素引入页面时,实际只是引用了date.jsp这个文件被转化并被编译后产生的servlet类文件.既如此, date.jsp就是作为一个单独的文件在执行后才被test.jsp文件运行时调用.由于date.jsp文件中没有指定字符编码.所以出现了乱码.解决办法是在date.jsp文件中重新把刚才去掉的

<@ page language=”java” contentType=”text/html;charset=gb2312”>

  这行语句加入后刷新重新运行.此时页面显示正确,并跟用include指令正常运行时一样.再查看tomcat下的临时文件会发现.此时多出了一个 date_jsp.java文件和一个date_jsp.class文件.这两个文件得来的方式跟test_jsp.java和 test_jsp.class文件得来的方式一样.再查看一下此时test_jsp.java文件的代码会发现.此时只新增加了一句代码:

JspRuntimeLibrary.include(request, response, "date.jsp", out, true);

  它并没有把date.jsp文件的代码加入到test.jsp.只是在运行时引入了date.jsp页面执行后所产生的应答.这意味着我们可以指定任何能够产生应答的Web资源,(例如一个servlet或一个jsp页面),只要这些资源所产生的类型和jsp页面产生的内容类型相同.JSP容器将通过一个内部的函数调用来执行指定的资源.因此,这些被引入的资源可以帮助处理原来的请求,所以这些资源可以访问请求作用域内的所有对象.以及所有原来的请求参数.

  由于在主页面被请求时,这些页面还没有被引入到主页面中,所以你可以对page属性使用一个请求时属性值,以便根据运行时的情况来决定要引入哪一个页面.还可以添加一些将被引入的页面读取的请求参数.

<jsp:include page=”<%=pageSelectedAtRuntime%>” flush=”true” >

<jsp:param name=”fitstParamer” value=”firstValue”>

<jsp:param name=”lastParamer” value=”lastValue”>

</jsp:include>

  如果修改了被引入的jsp页面,那么可以立刻使用该页面的最新版本,这是因为对待被引入的页面的方式与对待由浏览器直接调用的jsp页面的方式完全相同.即容器检测页面的变化,并自动进入翻译阶段,以得到页面的最新版本.

  (注意,include行为元素同jsp其它元素一样,没有行为体时要以”/”结束.就像下面这样.

  <jsp:include page=”<=pageSelectedAtRuntime>” flush=”true” />)

  以下是对include 两种用法的区别

  主要有两个方面的不同;

  一:执行时间上:

  <%@ include file=”relativeURI”%> 是在翻译阶段执行

  <jsp:include page=”relativeURI” flush=”true” /> 在请求处理阶段执行.

  二:引入内容的不同:

  <%@ include file=”relativeURI”%>

引入静态文本(html,jsp),在JSP页面被转化成servlet之前和它融和到一起.--jsp编译期

  <jsp:include page=”relativeURI” flush=”true” />引入执行页面或servlet所生成的应答文本.
--jsp转化为servlet后的执行期动态调用其他的jsp转化servlet中的方法
  另外在两种用法中file和page属性都被解释为一个相对的URI.如果它以斜杠开头,那么它就是一个环境相关的路径.将根据赋给应用程序的URI的前缀进行解释,如果它不是以斜杠开头,那么就是页面相关的路径,就根据引入这个文件的页面所在的路径进行解释.

分享到:
评论

相关推荐

    灵活设计JSP网页.ppt

    运行期错误发生在程序已经被成功编译后,例如用户输入的数据不符合预期,导致程序无法正常执行。对于这类错误,JSP开发者需要利用Java的异常处理机制来处理。 ### 2. try-catch-finally语句 异常处理的核心是try-...

    jsp有关重要笔记

    - **JSP 工作流程**: - 当用户通过浏览器请求一个 JSP 页面时,Web 容器会将该页面编译成 Servlet,并执行该 Servlet 来生成 HTML 内容,再将 HTML 内容返回给客户端浏览器。 #### 四、JSP 模型与设计模式 - **...

    北雨求职招聘系统+jsp

    【北雨求职招聘系统+jsp】是一个专门为求职者和雇主设计的在线平台,采用Java Server Pages(JSP)技术开发。这个系统提供了完整的招聘流程管理功能,包括职位发布、简历投递、面试安排等,旨在方便企业和个人进行...

    JSP药品销售管理系统.doc

    JSP页面在服务器上被编译为Servlet,然后执行并返回结果给客户端。JSP的核心特点包括分离表现层和业务逻辑,便于维护和扩展。 2. **医院信息系统** 医院信息系统(HIS)涵盖了医疗、管理、财务等多个方面,旨在提高...

    jsp基础语法,java与mysql连接方法,MVC,DAO,Listener ,Filter

    1. **编译过程**:JSP文件首次运行时会被服务器自动编译成Java Servlet类,然后编译为.class文件,因此首次访问速度较慢,后续访问会快些。 2. **Java代码插入**:在`&lt;%...%&gt;`标签中可以编写Java程序片段,例如声明...

    小学期做的电子商务网站

    4. **JSP指令和脚本元素**:如、等,用于页面编译和运行时的控制。 5. **EL(Expression Language)和JSTL(JavaServer Pages Standard Tag Library)**:简化JSP页面中的表达式和逻辑。 6. **数据库操作**:SQL语句...

    SpringMVC 35道面试题和答案.docx

    ing MVC 是一个基于Java的轻量级Web框架,它遵循MVC(模型-视图-...这种设计使得注解可以在编译期和运行期被解析和使用。在Spring MVC中,注解广泛用于配置和控制应用程序的行为,例如@Controller、@RequestMapping等。

    基于Java Web的网上选课系统

    这种系统允许学生通过网络进行课程选择,简化了传统的人工选课流程,提高了效率。 1. **JSP(JavaServer Pages)**:JSP是Java平台上的动态网页技术,它将HTML代码与Java代码相结合,允许开发者在HTML页面中嵌入...

    java北大计算机系

    - **注解(Annotation)**:掌握自定义注解及其在编译期和运行期的处理。 3. **Java应用开发** - **Swing与JavaFX**:学习创建图形用户界面(GUI),构建桌面应用。 - **Servlet与JSP**:讲解如何使用Java进行...

    JAVA程序员面试问题

    类型安全是指在编程语言中,确保所有变量和表达式的类型在编译期和运行期都是一致的,防止类型不匹配导致的错误。Java通过静态类型检查和运行时类型信息(RTTI)来实现类型安全。内存管理方面,Java采用了自动垃圾...

    青鸟二期结业项目后台

    5. **dist**或**target**:编译或打包后的文件,如WAR(Web Application Archive)文件,可以部署到Web服务器上运行。 为了深入理解这个项目,你需要熟悉Java编程语言、Java Web开发以及Oracle数据库的基本操作。...

    JAVA编程语言在计算机软件开发中运用.docx

    2. **JAVA Annotation(注解)技术**:JAVA Annotation用于提供元数据,可以用于代码的编译期和运行期处理。注解可以标记代码的不同部分,帮助开发者更好地理解和维护代码,同时还可以用于代码的自动验证和生成文档...

    传智播客黑马36,39期web前端

    通过开发一个完整的微信小程序,学员可以深入了解微信小程序的开发流程、调试技巧以及发布上线等各个环节。 2. **Node.js+MongoDB博客系统** 使用Node.js和MongoDB数据库构建一个完整的博客系统。这个项目涵盖...

    黑马49期javaee视频教程

    JSP页面在服务器上被编译成Servlet,然后执行并返回结果给客户端。这种方式非常适合创建动态且交互性强的Web应用。 #### EJB (Enterprise JavaBeans) EJB是Java EE中的一个重要组成部分,用于构建企业级应用程序的...

    apache-tomcat-9.0.44.tar.gz

    2. Jasper:是Tomcat内建的JSP引擎,负责编译JSP文件为Servlet。 3. JMX Remote Lifecycle Listener:允许远程管理Tomcat,通过Java Management Extensions (JMX) 接口操作Tomcat。 4. APR (Apache Portable Runtime...

    java EE复习重点

    - **Java EE 运行流程**:Java EE 应用通常由一系列 Web 组件和服务组成,包括 Servlet、JSP 页面、EJB 等。运行流程主要包括应用程序服务器启动、加载配置文件(如 web.xml)、初始化组件、处理 HTTP 请求等步骤。 ...

    java实现工作流

    - **JSP中文问题的解决**:设置正确的编码格式,避免中文乱码问题。 #### 结束语 通过以上内容可以看出,基于Java的工作流技术可以有效地提高固定电话装机业务的处理效率和服务质量。通过对工作流、MVC模式、JSP...

    Java面试宝典+题库

    JSP在第一次访问时被编译成Servlet,然后运行。 - **性能**: Servlet的性能通常优于JSP,因为Servlet避免了频繁的编译过程。 ##### 8. JSP架构模型 JSP采用了MVC架构模式,其中: - **Model**: 数据模型,负责处理...

    editplus--一款小巧的文本编辑软件

    这对于长期使用者来说,无疑增加了使用的舒适度,无需担心试用期到期问题。 总之,EditPlus作为一款小巧但功能齐全的文本编辑器,无论是在Java、JSP、JavaScript还是HTML的开发中,都能提供高效、便捷的支持。它的...

    java项目开发总结.pdf

    2. **异常处理**:理解编译期错误和运行期错误的区别,熟悉Exception类层次结构,包括RuntimeException和Checked Exception。掌握try-catch-finally语句块,以及如何通过throw和throws声明异常。 3. **集合与数组**...

Global site tag (gtag.js) - Google Analytics