- 浏览: 1116044 次
文章分类
- 全部博客 (379)
- S2SH (16)
- stuts2 (0)
- java语言 (81)
- JSP (17)
- <html>元素 (11)
- javaweb (4)
- web容器 (3)
- ext (23)
- javaScript (48)
- ant (1)
- liferay (1)
- sql (9)
- css (42)
- 浏览器设置 (3)
- office_world (1)
- eclipse (4)
- 其它 (28)
- 操作系统 (5)
- android (6)
- Struts2 (11)
- RegEx (3)
- mysql (5)
- BigDATA (1)
- Node.js (1)
- Algorithm (10)
- Apache Spark (1)
- 数据库 (5)
- linux (2)
- git (1)
- Adobe (3)
- java语言,WebSocket (1)
- Maven (3)
- SHELL (1)
- XML (2)
- 数学 (2)
- Python (2)
- Java_mysql (1)
- ReactJS (6)
- 养生 (4)
- Docker (1)
- Protocols (3)
- java8 (2)
- 书籍 (1)
- Gradle (2)
- AngularJS (5)
- SpringMVC (2)
- SOAP (1)
- BootstrapCSS (1)
- HTTP协议 (1)
- OAuth2 (1)
最新评论
-
Lixh1986:
Java并发编程:自己动手写一把可重入锁https://blo ...
Java之多线程之Lock与Condition -
Lixh1986:
http://win.51apps.com.cn/https: ...
temp -
ztwsl:
不错,支持很好
HttpServletRequest和ServletRequest的区别 -
guodongkai:
谢谢您能将知识精华汇编总结,让初学者们从原理中学会和提高。
javaScript之function定义 -
kangwen23:
谢谢了,顶顶
struts2中的ValueStack学习
一、被编译后的JSP
1、写一个JSP文件:index.jsp
注意:在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 容器为我们做的:
写在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 代码块<% %>中直接使用。
注意:变量名称不可写错。
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:
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:
引用:
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
-
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 代码块<% %>中直接使用。
注意:变量名称不可写错。
Object | Description |
request | This is the HttpServletRequest object associated with the request. |
response | This is the HttpServletResponse object associated with the response to the client. |
out | This is the PrintWriter object used to send output to the client. |
session | This is the HttpSession object associated with the request. |
application | This is the ServletContext object associated with application context. |
config | This is the ServletConfig object associated with the page. |
pageContext | This 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"); |
page | This 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. |
Exception | The 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
-
发表评论
-
javaWeb session失效时间设置
2018-04-25 14:19 2017session失效时间设置 session失效时间设 ... -
JSP 表达式 VS EL 表达式 用法比较
2017-06-21 06:03 1055应用场景: 根据访问路径URL,判断当前用户选择使用的语言。转 ... -
JSP之 @include VS jsp:include
2017-06-17 01:39 1420第一篇 对于可以重复使用的一段代码, 1、使用 <%@ ... -
JavaEE之(Servlet+Filter)环境搭建
2017-04-01 14:15 1061初学 Java Web 开发,请远 ... -
Servlet之单例与线程安全
2017-02-06 13:04 4442一、Servlet 是单例吗 不 ... -
Servlet之 destroy
2016-11-29 22:04 794只听说过 Servlet 何时 init(),何时 servi ... -
Servlet之JSP_03 JSTL/EL 表达式
2016-09-16 16:13 2319准备工作:在JSP 中启用 EL 表达式 <%@ ... -
Servlet之JSP_01概述
2016-09-15 20:42 1167一、什么是JSP JSP (Java Server Page ... -
Servlet之Servlet API
2016-09-13 19:10 1617一、在哪里 Java Servlet ... -
Servlet 的生命周期图
2014-12-31 03:18 957A servlet life cycle can be def ... -
在一个JSP页面中,操作数据库
2013-03-11 19:02 2790下面的代码是在一个jsp页面中实现数据库的操作。 也是为了加深 ... -
Servlet之Filter及FilterChain的使用详解
2013-01-07 20:06 2172在 JavaEE 中没有 Interceptor(拦截器)的概 ... -
out.print和out.write
2012-12-30 11:42 19440问题: 这是一个JSP页面: <%@ page l ... -
等幂操作——get方法与post方法
2012-12-23 20:13 1759幂等操作: 指的是对于同一数据,不论对其进行任何次幂操作,总 ... -
如何将jsp中<input>设为只读
2012-12-13 10:49 23340将一个input变为只读,可以使用 readonly 属性 和 ... -
Request的 getAttribute 和 getParameter
2012-12-03 19:57 1284getParameter 返回的是String, 用于 ...
相关推荐
1.3 servlet代码初探 1.4 servlet相对于“传统”cgi的优点 1.5 jsp的作用 第1部分 servlet技术 第2章 服务器的安装和配置 2.1 下载和安装java软件开发工具包 2.2 为桌面计算机下载服务器 2.3 服务器的...
在IT行业中,JSP(JavaServer Pages)和Servlet是用于构建动态Web应用程序的两种核心技术。本篇文章将深入探讨这两者以及它们与HTTP服务器之间的关系。首先,我们需要理解HTTP(超文本传输协议)的基础知识,它是...
### Tomcat Server原理初探——理解Tomcat的关键概念与架构 #### Tomcat Server概览 Tomcat是一款开源的Servlet容器,由Apache软件基金会旗下的Jakarta项目开发,它不仅支持Servlet和JSP技术,还得到了Sun ...
【标题】:“Tomcat JSP MySQL整合配置初探” 【描述】:该文档详细介绍了如何在Windows XP或Windows 2000操作系统下配置Tomcat、JSP和MySQL的集成环境,以实现动态网页开发。 【标签】:MySQL 数据库 关系型...
【基于JSP及MySql数据库的图片存储和显示技术初探】 随着Web应用程序的发展,图片在网页中的使用越来越频繁,传统的文件系统存储方式逐渐无法满足高效管理和大量图片数据的需求。因此,采用数据库存储图片信息成为...
首次调用JSP文件其实是执行一个编译为Servlet的过程。注意我们就要在这上边做文章,明白吗?我们要干的事情是,让JSP在编译前被浏览器当作一个文本或其它文件发送给客户端,或在JSP装载的时候不去执行
"JSP TOMCAT MYSQL开源软件整合配置初探——以揭阳职业技术学院图书馆网站服务器配置为例" 本文主要介绍了JSP、TOMCAT和MYSQL开源软件的整合配置,并以揭阳职业技术学院图书馆网站服务器配置为例,对JSP、TOMCAT和...
与传统的Servlet和JSP开发相比,Struts2提供了更简洁的控制器层,使得业务逻辑与视图层分离,从而提高了代码的可维护性和可扩展性。它的Action是执行业务逻辑的关键组件,每个Action对应一个用户请求,负责处理请求...
同时,Java的Servlet和JSP技术则为Web应用程序开发提供了便利,它们可以用来处理HTTP请求,动态生成HTML页面。 Spring框架是Java开发中不可或缺的一部分。它提供了一种模块化的方式来管理应用程序的组件,包括依赖...
在JSP中,这些功能通常通过Servlet和JSP页面协同工作来实现。Servlet负责服务器端的业务逻辑处理,而JSP则负责生成动态网页内容。JSP利用Java表达式和脚本元素直接在HTML中插入动态数据,提高了开发效率。 其次,...
Struts的流行在于它降低了大型项目的复杂性,提高了开发效率,成为JSP Web应用框架的标准之一。随着技术的演进,Struts也发展出了Struts 2,进一步增强了灵活性和可扩展性,如支持更多类型的拦截器、整合其他框架等...
- **ActionServlet**:Struts框架的核心组件之一,作为控制器的主要实现方式,负责拦截用户的请求并将它们转发给相应的Action对象。 - **Action对象**:处理具体的业务逻辑,并决定如何返回视图。 **3.1.4 Struts的...
《PostgreSQL与MySQL的比较研究初探》这篇文章探讨了两种主流的开源数据库系统——PostgreSQL和MySQL之间的差异,主要从标识列、字符串类型、JSP/Servlet开发中的中文处理、多平台支持和性能等方面进行了综合分析。...
<property name="suffix" value=".jsp"/> ``` 在 `HelloController` 类中,我们可以定义处理方法,比如 `@RequestMapping("/hello")`,该方法将处理 `/hello` 的请求。 Spring MVC 还支持注解驱动的开发,但在这...
《个人博客系统——初探JSP技术在Web开发中的应用》 个人博客系统是一个常见的Web应用程序,它允许用户创建、编辑和发布个人文章,展示个人思想、经历或专业知识。这样的系统通常由前端界面、后端服务器逻辑以及...
Struts框架通过采用JavaBean、Javaservlet以及JavaServerPage(JSP)等标准技术,实现了MVC设计模式的高效落地。开发者可以利用Struts框架提供的模板和工具,采取“填空式”开发策略,快速构建出功能完善且易于维护...
Servlet则是Java Web开发的基础技术之一,它负责处理客户端的HTTP请求,并生成响应。 ##### Servlet回顾 1. **创建Servlet所需类库**:创建Servlet时,需要导入`java.io.*`、`javax.servlet.*`和`javax.servlet....
Apache作为HTTP服务器,负责处理静态内容,而Tomcat则是Java Servlet和JavaServer Pages(JSP)的容器,用于处理动态内容。当面对高并发访问时,为了提升系统性能和可用性,我们可以采用负载均衡策略,其中"worker...