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

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

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

【什么是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. 哈工大 计算机系统 实验七 TinyShell

    所有实验文件可见github 计算机系统实验整理 实验报告 实 验(七) 题 目 TinyShell 微壳 计算机科学与技术学院 目 录 第1章 实验基本信息 - 4 - 1.1 实验目的 - 4 - ...

  2. urllib-访问网页的两种方式:GET与POST

    学习自:https://www.jianshu.com/p/4c3e228940c8 使用参数.关键字访问服务器 访问网络的两种方法: 1.GET 利用参数给服务器传递信息 参数data为dict类型 ...

  3. 如何在windows下成功的编译和安装python组件hyperscan

    摘要:hyperscan 是英特尔推出的一款高性能正则表达式引擎,一次接口调用可以实现多条规则与多个对象之间的匹配,可以支持多种匹配模式,块模式和流模式,它是以PCRE为原型开发,并以BSD许可证开源 ...

  4. HelloWorld:通过demo,构建黑盒模型

    在<源码阅读四步走,这才是阅读源码的正确姿势>一文中,给出了源码阅读的完整步骤. 本篇是<如何高效阅读源码>专题的第四篇,正式开始讲解阅读源码的具体方法! 程序界有个老传统,学 ...

  5. 【一】TSP、VRP、VRP模型介绍

    一. TSP问题数学模型 编辑 TSP,即Traveling Salesman Problem,也就是旅行商问题,又译为旅行推销员问题.货郎担问题,简称为TSP问题,是最基本的路线问题,该问题是在寻求 ...

  6. ElasticSearch安装 --- windows版

    文件下载地址: 链接:https://pan.baidu.com/s/1_Cy_Sy1-vOvsUxliM-EZHQ 提取码:qpcv 定义: Elasticsearch 是一个分布式的搜索和分析引擎 ...

  7. 实践1使用XGB实现酒店信息消歧

    XGB算法是决策树衍生出来的一种算法 场景:酒店的业务人员希望我们能够提供一个算法服务去为酒店信息做一个自动化的匹配,以通过算法的手段,找到那些确定相同的酒店和确定不同的酒店 以下代码为部分 理解业务 ...

  8. 自学java一路以来,心血心得整理分享

    ✿ 贴心提示:文章内容比较长,但都是干货,请大家耐心看完.时间不够充裕的小伙伴,建议收藏,一定要耐心看完,保证对你有后续学习java有所帮助. 一.推荐背景介绍 (一)我是怎么学的? ★ 非常普通的人 ...

  9. 1251-Client does not support authentication protocol requested by server; consider upgrading MySQL client。

    三:出现的一个错误在安装完MySQL的时候,我们现在一般都使用Navicat来连接数据库,可惜出现下面的错误:1251-Client does not support authentication p ...

  10. UOJ191口胡

    UOJ191,你失败的原因只有一个:你没有强制在线. 首先这个序列末位加加减减很烦,于是换成操作树,这样就变成查询链的信息了. 注意到一个向量 \((x_1,y_1)\) 比 \((x_2,y_2)\ ...