这里是修真院前端小课堂,每篇分享文从

【背景介绍】【知识剖析】【常见问题】【解决方案】【编码实战】【扩展思考】【更多讨论】【参考文献】

八个方面深度解析前端知识/技能,本篇分享的是:

【什么是jsp?jsp的内置对象有哪些?】

1、背景介绍

百度百科是这么介绍jsp的:“jsp是一种动态网页技术标准。它出现的根本原因是为了简化servlet的设计,是由Sun Microsystems公司倡导、许多公司参与一起建立的一种动态网页技术标准。”

从以上的介绍可以得出,servlet是先出的,jsp是后出的。

所以,想要了解jsp,先学习一下servlet。

在地址栏输入"test3"访问该servlet,浏览器返回结果如下。

如果你右键查看网页源代码,可以看到是非常普通的HTML代码。

也就是,在servlet中,各种拼接HTML代码,最终返回给客户端一个HTML页面。
我们想要做的动态的网站,如果所有的HTML页面都通过这样的方式来形成,那岂不太繁琐了。
于是,诞生了jsp。

那么jsp是啥样的呢?

去浏览器访问的结果:

可以看到,jsp页面中的

<% for(int i=0; i<4;i++) {
等嵌入的长得像java代码都消失了。而helloworld这句话出现了4次。于是猜测,jsp是否就是HTML页面嵌入java代码,然后通过某种机制去执行这些java代码,最终返回给我们想要生成的HTML页面?

在系统的某个路径下,你可以找到被tomcat解析成java类的jsp页面。而且一个是.class文件,另一个是java文件。
这不正是我们所熟悉的java类和它被编译成.class字节码文件吗?

打开test_jsp文件看一下,发现关键的部分:

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;charset=UTF-8");
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("\r\n");
out.write("\r\n");
out.write("<html>\r\n");
out.write("<head>\r\n");
out.write(" <title>测试</title>\r\n");
out.write("</head>\r\n");
out.write("<body>\r\n");
out.write("\r\n");
out.write(" ");

for(int i=0; i<4;i++) {

  out.write("\r\n");
out.write(" helloWorld! <br>\r\n");
out.write("\r\n");
out.write(" ");

}

  out.write("\r\n");
out.write("\r\n");
out.write("</body>\r\n");
out.write("</html>\r\n");
} 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);
}

}
2、知识剖析:
来看一下jsp的执行流程:

注意,只有jsp是新创建或是修改后第一次访问时,jsp parser才会将其编译成servlet程序。之后调用JSDK将对应的servlet程序编译成servlet字节码。

而且,它并非是将页面本身发送给客户端,而是把页面执行的结果发送给客户端。
客户端收到这个文件后,就可以正常显示在客户端了。

比如我要要访问test.jsp,然后利用Tomcat的解析器,他会将jsp文件转化为java文件,这个java文件就是servlet,
所以jsp本质上就是servlet。
jsp能实现的,servlet也能实现。不管你最终写的是一个多么复杂的jsp文件,它最后总能转化为一个html文件。

jsp的9个内置对象和4个作用域:

request 请求对象  类型 javax.servlet.ServletRequest 作用域 Request
response 响应对象 类型 javax.servlet.SrvletResponse 作用域 Page
pageContext 页面上下文对象 类型 javax.servlet.jsp.PageContext 作用域 Page
session 会话对象 类型 javax.servlet.http.HttpSession 作用域 Session
application 应用程序对象 类型 javax.servlet.ServletContext 作用域 Application
out 输出对象 类型 javax.servlet.jsp.JspWriter 作用域 Page
config 配置对象 类型 javax.servlet.ServletConfig 作用域 Page
page 页面对象 类型 javax.lang.Object 作用域 Page
exception 例外对象 类型 javax.lang.Throwable 作用域 page
同样 来看一个例子:
这里有两个jsp页面,page01和page02。

jsp useBean 标签表示 创建一个由class属性指定的类的实例,然后把它绑定到其名字由id属性给出的变量上。
那这里我创建了4个字符串缓冲类的实例,他们的作用域分别是page, request, session,application。

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

     pageEncoding="UTF-8"%>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<jsp:useBean id="pageVar" scope="page" class="java.lang.StringBuffer"/>
<jsp:useBean id="requestVar" scope="request" class="java.lang.StringBuffer"/>
<jsp:useBean id="sessionVar" scope="session" class="java.lang.StringBuffer"/>
<jsp:useBean id="applicationVar" scope="application" class="java.lang.StringBuffer"/>
<html>
<head>

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>JSP内置对象作用域</title>

</head>
<body>

<%

pageVar.append("page01");
requestVar.append("page01");
sessionVar.append("page01");
applicationVar.append("page01");

%>
<jsp:forward page="page02.jsp"/>
</body>
</html>
<%@ page language="java" import="java.util.*" contentType="text/html; charset=UTF-8"

     pageEncoding="UTF-8"%>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<jsp:useBean id="pageVar" scope="page" class="java.lang.StringBuffer"/>
<jsp:useBean id="requestVar" scope="request" class="java.lang.StringBuffer"/>
<jsp:useBean id="sessionVar" scope="session" class="java.lang.StringBuffer"/>
<jsp:useBean id="applicationVar" scope="application" class="java.lang.StringBuffer"/>
<html>
<head>

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>JSP内置对象作用域</title>

</head>
<body>
这里是page02,是从page1转来的<br/>
name
<%

pageVar.append("page02");
requestVar.append("page02");
sessionVar.append("page02");
applicationVar.append("page02");

%>
<h2>page</h2> = <%=pageVar.toString()%><br/>
<h2>request</h2> = <%=requestVar.toString()%><br/>
<h2>session</h2> = <%=sessionVar.toString()%><br/>
<h2>application</h2> = <%=applicationVar.toString()%><br/>

</body>
</html>
jsp forward 标签表示 当走到这里的时候,页面会跳转到page02.jsp。 这刚好就是一个会话的场景,

现在我们刷新一下页面,可以看到,page作用域变量的输出的值为page02,原本它的page01已经不见了。

request作用域的变量只在当前请求的中有效,当前的请求就是从page01到page02的一次跳转。
所以它的值把page01和page02都显示出来了。

session作用域的变量为当前会话,也就是只要浏览器不关闭,page02能一直叠加到上去。
application 对所有应用有效,也就是只要这个应用启动着,都要叠加。

“我们相信人人都可以成为一个工程师,现在开始,找个师兄,带你入门,学习的路上不再迷茫。

这里是技能树.IT修真院:http://www.jnshu.com,初学者转行到互联网行业的聚集地。"

欢迎加IT交流群565734203与大家一起讨论交流

什么是jsp?jsp的内置对象有哪些?的更多相关文章

  1. jsp篇 之 Jsp中的内置对象和范围对象

    Jsp中的内置对象: 在jsp页面代码中不需要声明,直接可以使用的对象. 一共有[9个内置对象]可以直接使用. 对象类型           名字 PageContext          pageC ...

  2. JavaWeb -jsp文件和内置对象的解析

    jsp文件和内置对象的解析 对page解析 JSP九大内置对象(自带,无需new) 1 out:输出对象 2 request:请求对象,存储“客户端像服务端发送的请求信息” 3 response:响应 ...

  3. JSP中的内置对象和Struts中的Web资源的详解

    JSP中的内置对象有如下几种: request :继承于HttpServletRequest, HttpServletRequest继承ServletRequest, 获得的Request对象的方法: ...

  4. jsp有哪些内置对象?作用分别是什么?(至少三个)

    jsp有哪些内置对象?作用分别是什么?(至少三个) 解答: 1)request表示HttpServletRequest对象.它包含了有关浏览器请求的信息,并且提供了几个用于获取cookie, head ...

  5. JSP有哪些内置对象

    JSP有哪些内置对象? 1.page:JSP网页本身; 2.request:用户端请求,此请求会包含来自GET/POST请求的参数; 3.session:请求有关的会话; 4.application: ...

  6. Spring,SpringMVC,MyBatis,Hibernate,Servlet的生命周期,jsp有哪些内置对象,Tomcat,Cookie和Session的作用以及区别,oracle,MYSQL等面试题总结

    1. 什么是Spring,谈谈你对Spring的理解 Spring是我们JAVA开发人员在搭建后台时选用的一个轻量级的开源框架,Spring框架目前也是功能丰富,十分优秀企业级采用最多的一个框架. S ...

  7. JSP九个内置对象

    JSP内置对象有: 1.request对象      客户端的请求信息被封装在request对象中,通过它才能了解到客户的需求,然后做出响应.它是HttpServletRequest类的实例. 2.r ...

  8. jsp中的内置对象(9个)、作用

    jsp内置对象 定义:可以不加声明就在JSP页面脚本(Java程序片和Java表达式)中使用的成员变量 JSP共有以下9种基本内置组件(可与ASP的6种内部组件相对应): 1.request对象 客户 ...

  9. jsp九个内置对象、四个域对象及Servlet的三大域对象

    一,什么是内置对象? 在jsp开发中会频繁使用到一些对象,如ServletContext HttpSession PageContext等.如果每次我们在jsp页面中需要使用这些对象都要自己亲自动手创 ...

  10. JSP 9个内置对象

    JSP内置对象(隐式对象)是JSP容器为每个页面自动实例化的一组对象,开发者可直接使用,也被称为预定义变量. JSP容器提供了9个内置对象 request // javax.servlet.http. ...

随机推荐

  1. JavaSE高级编程之多线程

    4. 多线程 4.1 基本概念:程序.进程和线程 程序.进程和线程 程序:为了完成特定的任务,用某种语言编写的一组指令的集合.程序是一段静态的代码,静态对象. 进程:是程序的一次执行过程或正在运行的程 ...

  2. Qt:QNetworkReply

    0.说明 QNetworkReply对象包含了Manager发送的请求头和返回的数据. 它继承自QIODevice,所以可以用各种read获取其中返回的数据: QByteArray data = re ...

  3. 网络爬虫深究-初识HTTP和https常识

    网络爬虫专题--HTTP基本原理 URI和URL.URN的关系 超文本 HTTP和HTTPS URI和URL 首先,我们来了解一下URI和URL,URI,即统一资源标志符,URL,即统一资源定位符. ...

  4. npm cnpm yarn 安装

    安装node.js,其中已经集成了npm,可以将npm切换到国内镜像 $ npm config set registry https://registry.npm.taobao.org -- 配置后可 ...

  5. 使用Three.js实现神奇的3D文字悬浮效果

    声明:本文涉及图文和模型素材仅用于个人学习.研究和欣赏,请勿二次修改.非法传播.转载.出版.商用.及进行其他获利行为. 背景 在 Three.js Journey 课程示例中,提供了一个使用 Thre ...

  6. Redis安装——windows版

    下载地址   : https://github.com/MicrosoftArchive/redis/releases/tag/win-3.2.100 双击进行安装,然后将安装目录配置到环境变量里,打 ...

  7. 使用http-server 模拟接口数据 mock data

    首先创建文件夹 mkdir mockData&&cd mockData 安装http-server npm i http-server 创建数据文件 touch index.json ...

  8. Net中委托之一

    1.委托的用法 委托是一种特殊的类型 a. 委托可以类外定义,也可以在类里面定义 b. 委托的操作步骤 1.委托的声明 2.委托的实例化 3.委托的调用 2.委托实例 amespace MyDeleg ...

  9. dotnet 委托的实现解析(2)开放委托和封闭委托 (Open Delegates vs. Closed Delegates)

    前言 这是个人对委托的理解系列第二篇,部分翻译自 Open Delegates vs. Closed Delegates – SLaks.Blog,好像还没人翻译过,加上部分个人理解.希望能对大家理解 ...

  10. Ubuntu 11.04 LAMP+JSP环境安装过程

    安装LAMP命令:sudo apt-get install apache2 php5 libapache2-mod-php5 mysql-server libapache2-mod-auth-mysq ...