jsp的原理性的概述:
1.jsp页面的本质就是一个servlet,而servlet的本质就是一个java代码,一个封装了http协议的相关属性的代码
2. jsp页面的存在是为了适应开发的需求,对于金泰资源和动态资源的一种综合性的页面的代码编写程序
3. jsp页面中不仅支持html代码的编写,同时还支持servlet也就是java代码的编写的操作,早期很受欢迎,解放了成功程序员从不许从前台的静态资源中书写一系列的代码进行解析从而获取前台的参数等的方式
4. jsp是html页面的升级版,在html页面中嵌入动态的java代码,所以也称之为动态资源
5. 嵌入动态代码java的方式是通过jsp的指令来进行识别的 <%@ page contentType="text/html;charset=UTF-8" language="java" %>;通过该指令在服务器端的辨识会采用jsp的解析翻译引擎进行翻译成Servlet的形式,最终操作还是通过操作Servlet的代码进行实现的,并且需要jdk的支持
jsp的翻译过程分析:
1. 书写jsp的简单页面,直接发布在tomcat服务器中,服务器会将jsp页面进行解析成servlet代码,一旦要进行发布才会有jsp页面的翻译过程,翻译成 . java文件和.class文件,进行一定的书写过程,存在的发布目录 [tomcat]/ work/Catalina/[虚拟主机]\[web应用]\org\apache\jsp\xxx.java文件
2. 接下来详细的描述下,jsp被翻译的过程
- jsp的翻译过程还是通过对应的在浏览器的页面展示出来,浏览器会根据对应的标签语言,进行识别,浏览器能够识别标记语言,通过在浏览器中显示的页面的环境进行解释执行
- out表示的是,servlet中原生的request.getWriter()的对象,可以直接在页面上进行书写html代码,out.write();
- out.print()--->输出的是java的代码的输出形式,输入流进行转换直接向浏览器进行输出了,相当于java代码中的控制台的作用,输入流可以改变流的流向,也就是输出的方向
- 可以使用在web的开发中直接在jsp中页面获取对应的值,和相关的效果的语句
_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("<html>\r\n");
out.write(" <head>\r\n");
out.write(" <title>hello world</title>\r\n");
***** out.print(new Date().toGMTString());
out.write(" </head>\r\n");
out.write(" <body>\r\n");
out.write(" hello.jsp\r\n");
out.write(" </body>\r\n");
out.write("</html>\r\n");
模板元素:
什么是模板元素:
1. 在jsp中有模板元素的概念,其他手时候不叫模板元素
2. 模拟元素在jsp的页面中指的是html元素,也就是html的内容称之为模板元素
静态页面:
<html>
<head>
<title>hello world</title>
</head>
<body>
hello.jsp
<%=new Date().toGMTString()%>
</body>
</html>
在jsp中被tomcat容器进行翻译,直接向页面中展示,被浏览器进行识别
out.write("\r\n");
out.write("\r\n");
out.write("<html>\r\n");
out.write(" <head>\r\n");
out.write(" <title>hello world</title>\r\n");
out.write(" </head>\r\n");
out.write(" <body>\r\n");
out.write(" hello.jsp\r\n");
out.write(" ");
out.print(new Date().toGMTString());
out.write("\r\n");
out.write(" </body>\r\n");
out.write("</html>\r\n");
脚表达式:
- 什么是脚本表达式?
- 脚本表达式指的是能够在一个页面中进行引入其他语言的一种机制,能够进行编译对应的语言
- jsp中的脚本呢表达式就是 java语言,通过书写脚本表达式能够进行java的代码的编译,从引入java语言
- 格式: <%= 表达式片段%> ——->特别注意的是脚本表达式只能是一个语句的输出,不是片段,一个表达式,不能有分号的存在,如果存在分号,那么就是一个语句而不是表达式了
在jsp的翻译引擎中的实现:out.print(new Date().toGMTString());
在jsp页面中的实现:<%=new Date().toGMTString()%> 通过标签来进行识别对应的语句关系,对标签式敏感的
脚本片段:
- 能够书写一堆的java代码的jsp代码块,能够进行一定的书写风格
- 配套要求:<% 若干的java语句%> --->能够及逆行配套使用即可,tomcat将会对此进行调用java的编译机制进行一定的翻译。能够执行java代码的逻辑行为
- 特别注意:所有的脚本表达式和脚本片段的位置,在什么地方被翻译,就在什么地方进行执行和展示,位置是一样
- 将 <%%>--->识别为java的代码片段
- 将<%= %>--->识别为java表达式
- jsp中的代码实现:
<%
for (int i = 0; i < 3; i++) {
System.out.println("我爱中国");
}
%>
- jsp在tomcat的翻译引擎中的代码:
for (int i = 0; i < 3; i++) {
System.out.println("我爱中国");
}
jsp的声明:
jsp中的声明只能是将java代码进行显示的声明,实在被翻译成servlet时进行一定的展示
范围:声明为对应的成员变量或者成员方法,一般是不使用的,容易造成线程不安全的机制,有域的存在
作用:主要用来为翻译过来的servlet增加成员变量成员方法,以及静态变量,静态资源等
格式: <%! 若干语句%>
jsp注释:<%-- 注释内容--%>
jsp中的九大隐式对象的出现:
出现的原因:
- 当jsp中被进行加载进入tomcat服务器中时,将会被翻译成servlet进行在java环境中进行执行
- java中的支持必须使用面向对象的方式,但是对象不能时凭空而来,于是为了方便程序员的工作,tomcat中有个机制专门做了一件事,就是每个jsp页面被加载翻译成servlet的时候,将会生成九大隐式对象,能够实现servlet的执行
- 类和calss包已经在编程环境中出现,根据对应的类进行一定的初始化即可,产生了新的对象能够进行一定的使用
九大隐式对象:
page (this)、request、response、 servletConfig(config)、 servletContext(application)、
session(Httpsession) 、out (jspWriter)、 pageContext(当前页面环境的对象)、exception(Throwable类型异常信息对象)
上面的九大隐式对象都是直接被tomcat进行生成的,每次的生成都会产生对应的对象,仅仅是产生对象
部分在tomcat中翻译的jsp创建隐式对象的过程如下
```
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;
PageContext对象详解:
1. 代表的是当前jsp页面的执行环境的对象
pageContext是代表当前jsp页面运行环境的对象。
作为入口对象可以获取其他八大隐式对象 ---.展现的都是隐式对象的表示原则,通过隐式对象获取
getPage()方法返回page隐式对象
getRequest()方法返回request隐式对象
getResponse()方法返回response隐式对象
getServletConfig()方法返回config隐式对象
getServletContext()方法返回application隐式对象
getSession()方法返回session隐式对象
getOut()方法返回out隐式对象
getException()方法返回exception隐式对象
作为域对象的使用:仅在当前页面中有效,域对象的范围是最小的
setAttribute(Object name,Object value) ---->类似于存在当前的页面中的域才能进行获取对应的值的存在
getAttribute(Object name)
removeAttribute(Object name)
getAttributeNames()
生命周期:
当当前的jsp页面访问被开始的时候,pageContext对象生命周期的开始,当当前的jsp页面结束时,pageContext域生命周期结束
作用范围:
当前jsp页面范围内共享数据,只在当前页面内进行数据的共享
可以作为四大作用域的的操作入口:
pageContext也是一个域,但也作为一个通用的入口,可以进行获取其他域中的属性
域中常量的存在形式,在jsp中的表现的形式:
PageContext.APPLICATION_SCOPE
PageContext.SESSION_SCOPE
PageContext.REQUEST_SCOPE
PageContext.PAGE_SCOPE
当进行属性查找的时候,pageContext会根据从小到大的范围进行数据的搜寻,如果找到则进行返回,找不到则返回对应null值表示的形式 方法: findAttribute(String name).
便捷的请求转发:使用pageContext对象
pageContext.forward(”path“)
jsp页面中存在的指令:
1. 语法:<%@ jsp指令名称 属性名=“属性值”...%>
2. page指令:指定jsp页面的基本属性,指定了jsp翻译引擎在翻译成servlet的过程中的行为,标识将jsp页面进行翻译成servlet页面
3. include指令:指定当前jsp页面包含其他的页面
4. taglib指令:引入jsp中的便捷的标签库的使用
总结:
所有的jsp页面最后中都是要被翻译成servlet页面,所以标签库中肯定有page指令
page指令可以在jsp的页面中任意进行出现
page指令一共就4个指令,但是里面的属性比较多
servlet页面的本身就是java代码,如果想要进行书写Java代码便需要进行导包
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ page import="java.util.Date" %> --->进行键值对的表现形式,属性值(引号标识)
属性集:
language="java" 当前JSP使用的开发语言
extends="package.class" 当前jsp翻译成servlet后要继承的类,注意此值必须是一个servlet的子类,一般情况
下不要改
import="{package.class |
package.*}, ..."
导入需要使用到的包 java.lang.*;javax.servlet.*;javax.servlet.jsp.
*;javax.servlet.http.*;
session="true | false" 用来指定当前页面是否使用session,如果设置为true,则翻译过来的servlet中将会
有对session对象的引用,于是可以直接在jsp中使用session隐式对象。但是这将导
致一旦访问jsp就会调用request.getSession()方法,可能导致不必要的空间浪费。如
果确定jsp中不需要session可以设为false
[ buffer="none | 8kb |
sizekb" ]
out隐式对象所使用的缓冲区的大小
[autoFlush="true | false"] out隐式对象是否自动刷新缓冲区,默认为true,不需要更改
[ isThreadSafe="true |
false" ]
翻译过来的servlet是否实现SingleThreadModel
[ errorPage="relative_url" ] 如果页面出错,将要跳转到的页面,除了在jsp中使用此属性指定错误页面外也可以
在web.xml中配置整个web应用的错误页面,如果两个都设置则jsp中的此属性起作
用
[ isErrorPage="true | false" ] 如果设置此属性为true,翻译过来的servlet中将含有Exception隐式对象,其中封装的就
是上一个页面中抛出的异常对象
page指令 a.
JSP指令 6.
分区 Day13-JSP 的第 3 页
是上一个页面中抛出的异常对象
[ contentType="mimeType
[ ;charset=characterSet ]" |
"text/html ;
charset=ISO-8859-1" ]
和jsp乱码相关的指令,用来指定jsp输出时,设置的Content-Type响应头用来指定浏览
器打开的编码
[ pageEncoding="characterS
et | ISO-8859-1" ]
服务器翻译jsp时使用的编码集.如果向防止jsp乱码,应该保证文件的保存编码和jsp翻
译成servlet用的编码以及输
<%@include file=""%>
页面总是重复出现的话,可以进行抽取出来,成为一个单独的页面进行下一个页面的引入,方便引入,比如网页的头部和尾部的页面就是这样。
在当前jsp页面中引入其他jsp页面,组合成一个jsp进行输出,如果网页某部分重复的出现
很多次,可以独立成一个单独的jsp而在其他jsp中进行引入即可。
<%@ taglib uri="" prefix=""%>
在当前页面中引入标签库。--->在javaee5及以上的版本的中都嵌套了对应的标签库的形成,每个标签库被进行植入到了jdk中,只要进行引用就可以。
cookie存在浏览器中的信息
http协议不支持中文 支持iso-8859-1
URL编码的解决机制
直接操作http协议的过程,非通信过程
session的原理:基于cookie进行一定的工作的
jsp的编码翻译原理的概述,java的服务页面
Request.getWriter--->out
第一次被访问的时候,被翻译成一个servlet
模板元素:直接在html页面中的元素就是模板元素出浏览器 --->进行翻译的结果
脚本表达式:将输出的结果直接进行打印到页面,先执行java代码,再次进行输出到浏览器的页面
include:静态包含,其他的包含都是动态包含,在源码级别进行了包含
jsp中的九大隐式对象:jsp中才是存在的,被翻译的过程中存在的对象
PageContext :表示的是当前页面运行环境的对象,其他八大对象的获取
el表达式中的11个内置对象
请求参数进行获取对应的数字。 parm对象
代表请求头的对象