`

Servlet之JSP_02初探

    博客分类:
  • JSP
阅读更多
一、被编译后的JSP

1、写一个JSP文件:index.jsp
<html>
<head>
<title>Hello World</title>
</head>
<body>
	<h1>Hello World!</h1>
	<%
		out.println("Your IP address is " + request.getRemoteAddr());

		java.io.File f = new java.io.File(this.getClass()
				.getProtectionDomain().getCodeSource().getLocation()
				.getPath());
	%>

	<h4>Compiled Servlet file location:</h4>
	<%=f.getAbsolutePath()%>

</body>
</html>

      注意:在jsp中使用了两种嵌入代码的格式:<% %>、<%= %>


2、输出效果:
引用

Hello World!

Your IP address is 127.0.0.1

Compiled Servlet file location:
C:\Users\eclipse\eworkspace\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\work\Catalina\localhost\webApp



3、被编译后的文件:
根据被编译后的 servlet 的输出路径,可以找到其对应的 .class 文件存放的位置。
上面的路径只是根路径,要找到具体的文件,还需要继续展开。我们会发现在 org/apache/jsp 目录下存放着两个文件:
      index_jsp.java
      index_jsp.class

原来 web 容器把 JSP 都编译成了以 org.apache.jsp 包名开头的文件。
打开 index_jsp.java,可以看到这就是 web 容器为我们做的:
/*
 * Generated by the Jasper component of Apache Tomcat
 * Version: Apache Tomcat/7.0.68
 * Generated at: 2016-09-16 03:17:38 UTC
 * Note: The last modified time of this file was set to
 *       the last modified time of the source file after
 *       generation to assist with modification tracking.
 */
package org.apache.jsp;

import javax.servlet. * ;
import javax.servlet.http. * ;
import javax.servlet.jsp. * ;

public final class index_jsp extends org.apache.jasper.runtime.HttpJspBase
                             implements org.apache.jasper.runtime.JspSourceDependent {

	private static final javax.servlet.jsp.JspFactory _jspxFactory = javax.servlet.jsp.JspFactory.getDefaultFactory();
	private static java.util.Map<java.lang.String, java.lang.Long> _jspx_dependants;
	private volatile javax.el.ExpressionFactory _el_expressionfactory;
	private volatile org.apache.tomcat.InstanceManager _jsp_instancemanager;

	public java.util.Map<java.lang.String, java.lang.Long> getDependants() {
		return _jspx_dependants;
	}

	public javax.el.ExpressionFactory _jsp_getExpressionFactory() {
		if (_el_expressionfactory == null) {
			synchronized(this) {
				if (_el_expressionfactory == null) {
					_el_expressionfactory = _jspxFactory.getJspApplicationContext(getServletConfig().getServletContext()).getExpressionFactory();
				}
			}
		}
		return _el_expressionfactory;
	}

	public org.apache.tomcat.InstanceManager _jsp_getInstanceManager() {
		if (_jsp_instancemanager == null) {
			synchronized(this) {
				if (_jsp_instancemanager == null) {
					_jsp_instancemanager = org.apache.jasper.runtime.InstanceManagerFactory.getInstanceManager(getServletConfig());
				}
			}
		}
		return _jsp_instancemanager;
	}

	public void _jspInit() {}

	public void _jspDestroy() {}

	public void _jspService(final javax.servlet.http.HttpServletRequest request, 
                            final javax.servlet.http.HttpServletResponse response)
                            throws java.io.IOException,javax.servlet.ServletException {

		final javax.servlet.jsp.PageContext pageContext;
		      javax.servlet.http.HttpSession session = null;
		final javax.servlet.ServletContext application;
		final javax.servlet.ServletConfig config;
		      javax.servlet.jsp.JspWriter out = null;
		final java.lang.Object page = this;
		      javax.servlet.jsp.JspWriter _jspx_out = null;
		      javax.servlet.jsp.PageContext _jspx_page_context = null;

		try {
			response.setContentType("text/html");
			pageContext = _jspxFactory.getPageContext(this, request, response,
					null, true, 8192, true);
			_jspx_page_context = pageContext;
			application = pageContext.getServletContext();
			config = pageContext.getServletConfig();
			session = pageContext.getSession();
			out = pageContext.getOut();
			_jspx_out = out;

			out.write("<html>\n");
			out.write("<head><title>Hello World</title></head>\n");
			out.write("<body>\n");
			out.write("<h1>Hello World!</h1>\n");

			out.println("Your IP address is " + request.getRemoteAddr());

			java.io.File f = new java.io.File(
		    this.getClass().getProtectionDomain().getCodeSource().getLocation().getPath());

			out.write("\n");
			out.write("<h4>Compiled Servlet file location:</h4> \n");
			out.print(f.getAbsolutePath());
			out.write("\n");
			out.write("</body>\n");
			out.write("</html>");
		} catch (java.lang.Throwable t) {
			if (!(t instanceof javax.servlet.jsp.SkipPageException)) {
				out = _jspx_out;
				if (out != null && out.getBufferSize() != 0)
					try {
						if (response.isCommitted()) {
							out.flush();
						} else {
							out.clearBuffer();
						}
					} catch (java.io.IOException e) {}
				if (_jspx_page_context != null)
					_jspx_page_context.handlePageException(t);
				else
					throw new ServletException(t);
			}
		}
		finally {
			_jspxFactory.releasePageContext(_jspx_page_context);
		}
	}
}

      写在JSP文件中的内容,都被放在了 _jspService() 方法的 try-catch 语句块中。


二、当请求到来时,发生了什么?

当浏览器向 web 容器发送一个请求时,在web容器内部发生了什么?例如:在浏览器的地址栏中输入:http://localhost:8080/myApp/index.jsp

1、
      web 容器首先查看有没有与请求路径 "/index.jsp" 相对应的 servlet 的注册。

2、
      如果有,则调用这个servlet;
      如果无,则到部署目录下查找与该请求路径对应的jsp文件。

3、
      如果无,对应的jsp文件,则报404(没有找到资源);
      如果有,对应的jsp文件,则对其进行编译,并为其注册访问路径:"/index.jsp" ,
      javax.servlet.ServletContext.addServlet(servletName, servletClass)。
      最后调用该 servlet 的 service() 方法。

由此我们可以看出:
      JSP 是动态编译,动态加载的。而且是懒加载。




三、附

1、可以在 JSP 代码块<% %>中使用的 9 个内置对象:

通过上述对 JSP 翻译后的 .java 文件的查看: 这 9 个变量在 _jspService() 方法的前面部分已声明,因此可以在 JSP 代码块<% %>中直接使用。

注意:变量名称不可写错。

ObjectDescription
requestThis is the HttpServletRequest object associated with the request.
responseThis is the HttpServletResponse object associated with the response to the client.
outThis is the PrintWriter object used to send output to the client.
sessionThis is the HttpSession object associated with the request.
applicationThis is the ServletContext object associated with application context.
configThis is the ServletConfig object associated with the page.
pageContextThis represents the environment for the page, containing useful information like page-scope attributes, access to the request, response and session objects, as well as the JspWriter referenced by out. This object also has methods for including another URL's contents, and for forwarding or redirecting to another URL. E.G. pageContext.forward ("other.jsp"); 
pageThis represents the generated servlet instance itself, i.e., it is same as the "this" keyword used in a Java file. As a result, you do not typically know who the super class is, and consequently do not normally make use of this object or its methods.
ExceptionThe Exception object allows the exception data to be accessed by designated JSP.



2、pageContext vs page in Detail


page 指的是 this 对象,就是当前的 jsp 实例。

pageContent 则提供了许多对于当前 page 操作的方法和对其它环境变量的引用。
例如:
pageContent.setAttribute(); // 给本 jsp 实例设置属性。
pageContent.getRequest(); // 获取到 request 对象。


说明:
在实际应用中往往一个页面是由多个jsp组成的,它们各自代表不同的模块。
如何保证各jsp之间变量的名称互不冲突,不会被覆盖,变量的范围就显得格外重要。
在这种情况下,选择默认的 page 范围。

pageContent.setAttribute(); 就是用来设置本 jsp 中的变量的。

参阅:<c:set> 标签的使用。
http://lixh1986.iteye.com/blog/2324611




Implicit Object: pageContex     
Class or Interface: javax.servlet.jsp.PageContext     
Purpose, Function, or Uses:
      Used for storing and retrieving page-related information and sharing objects within the same translation unit and same request.
      Also used as a convenience class that maintains a table of all the other implicit objects. For example:
public void _jspService(HttpServletRequest request,
	                    HttpServletResponse response)
                        throws java.io.IOException, ServletException{
	...
	try {

		...
		application = pageContext.getServletContext();
		config      = pageContext.getServletConfig();
		session     = pageContext.getSession();
		out         = pageContext.getOut();
		...

	} catch (Throwable t) {
		...
	}
	finally {
		...
	}
}


Implicit Object: page     
Class or Interface: java.lang.Object
Purpose, Function, or Uses:
      Refers to the generated Servlet class. Since page refers to the generated class and the class implements the Servlet interface, it is a valid cast it to Servlet. And the page variable could also be cast to JspPage or HttpJspPage since these two interfaces are derived from the Servlet interface and are implemented by the generated servlet class. For example:

<%= ((Servlet)page).getServletInfo() %>

<%= ((JspPage)page).xxx() %>

<%= ((HttpJspPage)page).xxx() %>








引用:
https://www.tutorialspoint.com/jsp/jsp_implicit_objects.htm

What is difference between page and pageContext in JSP pages?
- http://www.xyzws.com/jspfaq/what-is-difference-between-page-and-pagecontext-in-jsp-pages/4







-
转载请注明
原文出处:http://lixh1986.iteye.com/blog/2324570















-
分享到:
评论

相关推荐

    Servlet与JSP核心编程第2版

    1.3 servlet代码初探 1.4 servlet相对于“传统”cgi的优点 1.5 jsp的作用 第1部分 servlet技术 第2章 服务器的安装和配置 2.1 下载和安装java软件开发工具包 2.2 为桌面计算机下载服务器 2.3 服务器的...

    JSP和Servlet那些事儿系列--初探HTTP服务器

    在IT行业中,JSP(JavaServer Pages)和Servlet是用于构建动态Web应用程序的两种核心技术。本篇文章将深入探讨这两者以及它们与HTTP服务器之间的关系。首先,我们需要理解HTTP(超文本传输协议)的基础知识,它是...

    tomcat_server原理初探.pdf

    ### Tomcat Server原理初探——理解Tomcat的关键概念与架构 #### Tomcat Server概览 Tomcat是一款开源的Servlet容器,由Apache软件基金会旗下的Jakarta项目开发,它不仅支持Servlet和JSP技术,还得到了Sun ...

    Tomcat JSP MySQL整合配置初探.pdf

    【标题】:“Tomcat JSP MySQL整合配置初探” 【描述】:该文档详细介绍了如何在Windows XP或Windows 2000操作系统下配置Tomcat、JSP和MySQL的集成环境,以实现动态网页开发。 【标签】:MySQL 数据库 关系型...

    基于JSP及MySql数据库的图片存储和显示技术初探.pdf

    【基于JSP及MySql数据库的图片存储和显示技术初探】 随着Web应用程序的发展,图片在网页中的使用越来越频繁,传统的文件系统存储方式逐渐无法满足高效管理和大量图片数据的需求。因此,采用数据库存储图片信息成为...

    JSP安全性初探

    首次调用JSP文件其实是执行一个编译为Servlet的过程。注意我们就要在这上边做文章,明白吗?我们要干的事情是,让JSP在编译前被浏览器当作一个文本或其它文件发送给客户端,或在JSP装载的时候不去执行

    JSP TOMCAT MYSQL开源软件整合配置初探——以揭阳职业技术学院图书馆网站服务器配置为例.pdf

    "JSP TOMCAT MYSQL开源软件整合配置初探——以揭阳职业技术学院图书馆网站服务器配置为例" 本文主要介绍了JSP、TOMCAT和MYSQL开源软件的整合配置,并以揭阳职业技术学院图书馆网站服务器配置为例,对JSP、TOMCAT和...

    struts2 初探

    与传统的Servlet和JSP开发相比,Struts2提供了更简洁的控制器层,使得业务逻辑与视图层分离,从而提高了代码的可维护性和可扩展性。它的Action是执行业务逻辑的关键组件,每个Action对应一个用户请求,负责处理请求...

    基于计算机软件开发的JAVA编程应用初探.zip

    同时,Java的Servlet和JSP技术则为Web应用程序开发提供了便利,它们可以用来处理HTTP请求,动态生成HTML页面。 Spring框架是Java开发中不可或缺的一部分。它提供了一种模块化的方式来管理应用程序的组件,包括依赖...

    网上购物系统的设计与开发初探(硕士毕业论文)

    在JSP中,这些功能通常通过Servlet和JSP页面协同工作来实现。Servlet负责服务器端的业务逻辑处理,而JSP则负责生成动态网页内容。JSP利用Java表达式和脚本元素直接在HTML中插入动态数据,提高了开发效率。 其次,...

    初探Struts原理与实践.doc

    Struts的流行在于它降低了大型项目的复杂性,提高了开发效率,成为JSP Web应用框架的标准之一。随着技术的演进,Struts也发展出了Struts 2,进一步增强了灵活性和可扩展性,如支持更多类型的拦截器、整合其他框架等...

    struts编程思想初探

    - **ActionServlet**:Struts框架的核心组件之一,作为控制器的主要实现方式,负责拦截用户的请求并将它们转发给相应的Action对象。 - **Action对象**:处理具体的业务逻辑,并决定如何返回视图。 **3.1.4 Struts的...

    PostgreSQL与MySQL的比较研究初探.pdf

    《PostgreSQL与MySQL的比较研究初探》这篇文章探讨了两种主流的开源数据库系统——PostgreSQL和MySQL之间的差异,主要从标识列、字符串类型、JSP/Servlet开发中的中文处理、多平台支持和性能等方面进行了综合分析。...

    springmvc初探(xml)

    &lt;property name="suffix" value=".jsp"/&gt; ``` 在 `HelloController` 类中,我们可以定义处理方法,比如 `@RequestMapping("/hello")`,该方法将处理 `/hello` 的请求。 Spring MVC 还支持注解驱动的开发,但在这...

    个人博客系统

    《个人博客系统——初探JSP技术在Web开发中的应用》 个人博客系统是一个常见的Web应用程序,它允许用户创建、编辑和发布个人文章,展示个人思想、经历或专业知识。这样的系统通常由前端界面、后端服务器逻辑以及...

    基于MVC的Struts框架初探

    Struts框架通过采用JavaBean、Javaservlet以及JavaServerPage(JSP)等标准技术,实现了MVC设计模式的高效落地。开发者可以利用Struts框架提供的模板和工具,采取“填空式”开发策略,快速构建出功能完善且易于维护...

    java学习课件

    Servlet则是Java Web开发的基础技术之一,它负责处理客户端的HTTP请求,并生成响应。 ##### Servlet回顾 1. **创建Servlet所需类库**:创建Servlet时,需要导入`java.io.*`、`javax.servlet.*`和`javax.servlet....

    apache + tomcat 负载均衡worker模式初探

    Apache作为HTTP服务器,负责处理静态内容,而Tomcat则是Java Servlet和JavaServer Pages(JSP)的容器,用于处理动态内容。当面对高并发访问时,为了提升系统性能和可用性,我们可以采用负载均衡策略,其中"worker...

Global site tag (gtag.js) - Google Analytics