jsp 概述:
1.jsp是sun公司提供的一门动态资源的开发技术,servlet也是一门动态资源,单是不善于向页面中输出html的内容,于是sun提供了动态资源jsp,这个技术的支持允许在页面中书写html内容,展示内容,也可以书写java语句,用于处理逻辑。所以最终可以使用jsp页面替换掉servlet,。
2. jsp技术的出现就是为了见兼容java代码和html代码进行相关的便捷书写,能够使开发servlet的时候变得不是那么复杂难懂,页面体现出的简洁性
jsp原理:
1. 一个jsp页面在被访问的时候,会由jsp翻译引擎翻译成一个servlet文件去执行,向页面中输出数据。
2. 实验查找:启动服务器,找到当前工程的发布日志信息,在这个日志信息的下方获取一个c盘路径,这个路径可以找到当前工程的work目录,work目录内包含页面对应的servlet文件
3. 其实该servlet的文件名称就是页面中的jsp文件的翻译过来的servlet---->同样是java代码
4. 其中存在翻译jsp的翻译引擎每次进行发布的时候,翻译引擎将会根据jsp中的页面的代码从上到下进行翻译,html代码可以直接通过配对的形式进行在浏览器显示,浏览器有翻译引擎,能够进行html的翻译功能
jsp的语法:
1. 模板元素:在jsp中的模板元素代表的是html的静态元素,html的静态元素代表的是模板元素
2. 在jsp页面中的html内容,被jsp翻译引擎翻译位servlet之后,会变成模板元素进行输出
<body>this is a page</body>....都是模板元素,
3. 而在jsp中的模板元素,通过以流的形式在页面上进行输出,输出后的模板元素在经过浏览器的内部翻译引擎,进行静态页面的框架的搭建。
形式如下的,按照流的形式进行:,在页面进行不同程度的输出,进行静态框架的搭建
4. HTML元素最终servlet文件中会以out.write()输出到浏览器中
jsp脚本表达式 <%= %>:代表的是一个带有返回值的表达式,不能进行分号的结尾,否则不表达式,而是语句。
1.语法结构:<%= jsp脚本表达式%>,---->等号 = 代表的是返回值的赋值
2. jsp表达式中可以填写一个直接量,或者式一个带有返回值的表达式,jsp翻译引擎将jsp脚本表达式进行翻译成servlet文件后,会以out.print()的方法将表达式的结果输出到页面中,输出的页面是对应的servlet页面,被jsp翻译引擎翻译之后的servlet页面,进行对应值的解析,在servlet中进行以out.print()进行输出到静态页面中:<%= new Date().toLocaleString() %><==>等效于 out.print(new Date().toLocaleString());
3. 页面中的jsp脚本表达式在被servlet翻译为servlet文件后会以out.print()的方法将表达式的结果输出到页面中
jsp脚本片段:<%%>
1. 语法:<% JSP代码片段 %>
2. 其中可以填写成段的java代码,其中的java语句需要符合java语法语句的要求
3. 以下代码进行会原封不动的在页面中进行输出,作为java代码的出现去执行
4. 注意在书写脚本片段的时候,可以不完整,但是要保证多个脚本片段可以拼接为一段正确的java语句。
5. 注意是原封不动的进行编译输出在servlet的位置
<%
out.println("This is printed by out.println.");
System.out.println("This is printed by System.out.println.");
System.out.println("This is printed by System.out.println.");
System.out.println("This is printed by System.out.println.");
out.println("This is printed by out.println.");
%>
Jsp的声明:<%!%>
1.语法:<%! jsp声明%>
2. 翻译后的servlet文件如果需要使用成员变量和成员方法可以使用jsp声明来定义
3.声明的语法中:jsp的翻译引擎的程序,会将变量翻译到对应的servlet中的成员变量或者成员方法中去,静态块也会被放置到servlet中去
4 .声明的内容都会被抽取到成员变量中去
<!-- jsp的声明 -->
<%!
int num=10;
/* public void add11{
int k=0;
int c=9;
} */
static{}
%>
Jsp的注释:
注释:<%
//java注释被翻译后会出现在servlet文件中的对应位置,由于是注释,所以不会产生任何的输出
%>
html注释:<!-- html注释 -->会被jsp翻译引擎翻译成模板元素,由于是html注释,所以在servlet的出现,以out.write()进行输出在servlet中,但是在浏览器不产生任何的输出,在进行浏览器的解析的时候会被自动舍弃
jsp注释:<%-- jsp注释 --%>在被jsp翻译引擎翻译的过程中执行,会出现在servlet文件中,但是要慎用,容易出现文件嵌套丢失等效果。
JSP指令:
1 .jsp指令本身不会产生任何输出,用来规定当前jsp页面的引擎如何翻译jsp页面,通过指令身上的属性来规定页面如何被翻译
2. 指令分为三种:
- page 指令 ----用于指定jsp页面翻译引擎的属性
- include指令----用于在一个页面中引入另外一个页面 <%@include file="/_head.jsp"%>用来指令页面的包含属性页
- taglib指令 —— 用来引入标签库的的jar包
page指令:
1. page指令能在面中出现多次,可以出现在任意一行
2.page指令详解:
- language="java" 描述当前jsp页面使用的语言
- extends="package.class" :当前jsp翻译成servlet后要继承的类,注意此值一般是servlet的子类,不要去修改
- import ={"package.class"}:代表的是当前使用的包,要导入该页面的包的依赖程度
- seesion="true|false":用来指定当前页面是否使用seesion,如果设置为true,则翻译过来的servlet会有对session对象的引用,于是可以直接在jsp页面中使用seeison隐式对象,但是这将导致一旦访问jsp就会调用request.getSession()方法,可能导致不必要的空间浪费,如果确定jsp中不需要session可以设置为false,默认是false
- buffer="none" |8kb|sizekb|:out隐式对象所使用的缓冲区的大小
- auto Flush="true"|"false":out隐式对象是否自动刷新缓冲区,默认为true,不需要更改
- isThreadSafe="true"|"false": 翻译过来是否实现SingleThreadModel
- errorPage="relative_url": 如果页面出错,将要跳转的页面。除了在jsp中使用此属性指定错误页面外也可以在web.xml中配置整个web应用的错误页面,如果两个都设置则jsp中的属性起作用<error-Pagr></error-Pagr>表示的是在web.xml中进行全局的配置错误页面,通过状态码进行配置
- contentType="text/html; charset=utf-8" :负责在页面中设置当前页面的在浏览器器中使用的编码
- pageEncoding="utf-8":展示的是服务器(tomcat)在翻译jsp页面的时候使用的编码集,如果想防止乱码,应该保证文件的保存编码和jsp翻译成servlet使用的编码以及输出到页面中的编译三者完全一致
- 在不指定contentType的时候,pageEncoding可以用于指定contentType中的字符集,servlet会根据服务器中使用的编码,进行浏览器响应的时候,检测到pageEncoding中的编码集进行使用
-
include指令:
- 该指令用于向页面中进行另外一套页面的包含,
- 使用格式 <%@ include file="url%> 在当前位置进行包含,一般是静态 的页面,并进行相关的输出在对应位置进行展示
taglib指令:
- 标签库使用
九大隐对象:
- 在jsp页面中被jsp翻译引擎翻译为servlet文件后,每次访问页面后都会在服务器内部有对象进行对servlet中的service方法执行,在service方法中定义了9个隐式对象,这九个隐式对象可以直接在jsp页面中获取并使用
- 什么是隐式对象,意思是内存的对象调用service方法之后便会产生九个对象,而这九个对象在service被调用的时候创建,但是我们页面中看不到这些对象,底层源码中已经帮我们进行封装起来了,不显式的出现,而是隐式的出现,称为隐式对象,但是这些对象确是能够被直接使用在jsp本页面中,使用的方法是将jsp页面翻译成servlet页面的时候,进行使用,查看被tomcat服务器中翻译的servlet文件源码中可以查看到。
- 九大隐式对象:
1. request :代表request对象
2. response:代表response对象
3. page:代表servlet对象 底层 ---page = this
4. out:代表out对象
5. config:代表servletConfig对象
6. exception:代表Exception对象
7. pageContext :代表pageContext对象,用于获取虚拟路径
5. session :代表Session对象
6. application :代表servletContext对象,用于获取的是当前的路径对象
pageContext隐式对象详解:
功能一:用户获取其他八大对象
1. 在jsp页面中,tomcat的jsp翻译引擎将jsp页面翻译成servlet页面之后提供了九大隐式对象
2. 九大隐式对象进行的获取通过pageContext对象进行获取,之前的话是将九大隐式对象都提供在jsp也页面中,后面进行优化为其他隐式对象提供可获取对象的入口,通过这个入口可以获取其他隐式对象的引用——pageContext
功能二:作为域对象进行使用
1. 域对象 ,如果一个对象身上有一个可以被看见的范围,在这个范围内 可以利用对象身上的map实现数据共享,这个对象就可以称为域对象,域范围可以使用在Web应用中进行确定
2. 设置域对象:
- setAttribute(String name,Object obj);
- 获取域对象,由于通过是映射map来进行存储数据(数组+链表)
- getAttribute(String key)
- 移除域对象
- removeAttribute()
- 获取域中的对象的所有键名
- getAttributeNames()
3. 生命周期:
- 在访问jsp页面时,pageContext对象创建,生命周期开始
- 在结束访问jsp页面时,pageContext对象销毁,生命就此消亡--->pageContext代表的是当前页面
4.作用范围:整个jsp页面,当前jsp页面
4. 主要功能:在整个jsp页面中共享数据,进行数据的共享
5. 代码实现:可以通过jsp脚本表达式进行输出数据
功能三:操作其他域中的属性
- setAttribute(String name,Object obj,int scope);
- getAttribute(String name,int scope)
- removeAttrubute(String name,int scope)
- getAttributeNamesInScope();
代码实现:
<h3>pageContext操作其他域中属性</h3>
<%
// 向指定域中设置值 (APPLICATION_SCOPE 代表 servletcontext 域 )
pageContext.setAttribute("country","China",PageContext.APPLICATION_SCOPE);
pageContext.setAttribute("country","US",PageContext.SESSION_SCOPE);
pageContext.setAttribute("country","UK",PageContext.REQUEST_SCOPE);
//PAGE_SCOPE 代表 pageContext 域
pageContext.setAttribute("country","Japan",PageContext.PAGE_SCOPE);
%>
<%=pageContext.getAttribute("country",PageContext.APPLICATION_SCOPE)%>
<%=pageContext.getAttribute("country",PageContext.SESSION_SCOPE)%>
<%=pageContext.getAttribute("country",PageContext.REQUEST_SCOPE)%>
<%=pageContext.getAttribute("country",PageContext.PAGE_SCOPE)%>
四大作用域的名称:
1. pageContext域 ——PAGE_SCOPE---->当前页面的域范围
2. request域 —— REQUEST_SCOPE----->请求域的范围
3. SESSION域 —— SESSION_SCOPE----->Session域的存在范围
4. ServletContext域 ——APPLICATION_SCOPE----->web应用域范围
功能三:自动搜寻域
1. findAttribute会在四个作用域中,由小到大的搜索范围指定名称的域属性
2. 如果在某个域中获的属性,则不会向更大的域进行属性的获取
3. 范围:ServletContext>Session>request>pageContext
功能四:便捷的请求转发
1.pageContext.forward(url);