Day07 动态页面技术(JSP)
一、JSP的简介
1、JSP是什么
- JSP全名是Java Server Pages,它是建立在Servlet规范之上的动态网页开发技术。
- 在JSP文件中,HTML代码与Java代码共同存在,其中,HTML代码用来实现网页中静态内容的显示,Java代码用来实现网页中动态内容的显示。
- 为了与传统HTML有所区别,JSP 文件的扩展名为.jsp。
2、JSP运行原理
- JSP的工作模式是请求/响应模式
- 如果项目发布在Tomcat的webapps目录中,源文件和.class文件可以在“Tomcat 安装目录/work/Catalinalocalhost/项目名/org/apache/jisp"下找到,如图所示。.
- 查看源代码发现该类继承HttpJspBase类,而HttpJspBase类是HttpSevlet的一个子类,由此可见index_jsp类就是一个Servlet。
- 所以,JSP的本质是Servlet
二、JSP基本语法
1、JSP脚本元素
1.1 JSP Scriptlets(一段代码段)
声明service方法内部的局部变量
<%
java代码(变量、方法、语句等)
%>
1.2 JSP声明语句
声明servlet成员变量和方法
<%!
定义的变量和方法等
%>
1.3 JSP表达式
将程序数据输出到客户端,即service方法内部out.print()
<%=
expression
%>
2、JSP注释
<%-- jsp注释 --%>
<% //java注释 %>
<!-- html注释 -->
三、JSP指令
jsp的指令是指导jsp翻译和运行的命令,jsp包括三大指令:
1、page指令
属性最多的指令(实际开发中page指令默认即可,不用做修改)
,根据不同的属性,指导整个页面特性
格式:<%@ page 属性名1= “属性值1” 属性名2= “属性值2” …%>
常用属性如下:
language:jsp脚本中可以嵌入的语言种类contentType
:有效的文档类型,HTML格式为text/html。翻译后的Servlet中是response.setContentType(text/html;charset=UTF-8)pageEncoding
:当前jsp文件的本身编码。未设置contentType时,contentType和pageEncoding的值一样。
session:默认为true,表示内置session对象,false反之。
import:导入java的包errorPage
:当前页面出错后跳转到哪个页面
isErrorPage:当前页面是一个处理错误的页面
buffer:JSP缓存大小(默认8kb),暂指out缓存区的大小。
autoFlush:是否自动刷新isELIgnored
:是否忽略EL表达式,false表示不忽略,使用EL表达式
2、include指令
页面包含(静态包含)指令,可以将一个jsp页面包含到另一个jsp页面中
格式:<%@ include file=“被包含的文件地址”%>
3、taglib指令
在jsp页面中引入标签库(jstl标签库、struts2标签库)
格式:<%@ taglib uri=“标签库地址” prefix=“前缀”%>
四、JSP内置/隐式对象
jsp被翻译成servlet之后,service方法中有9个对象定义并初始化完毕,我们在jsp 脚本中可以直接使用这9个对象。
1、out对象
out 对象是javax. servlet jsp JspWriter类的实例对象
,它的作用与ServletResponse getWriter()方法返回的 PrintWriter 对象非常相似,都是用来向客户端发送文本形式的实体内容
。不同的是,out 对象的类型为JspWriter,它相当于一种带缓存功能的PrintWriter。
2、pageContext对象
jsp页面的上下文对象。
page对象与pageContext对象不是一回事。
作用如下:
2.1 pageContext是一个域对象
<body>
<%
pageContext.setAttribute("name", "page域对象");
//使用pageContext向指定的其他域对象中存数据
pageContext.setAttribute("name", "request域对象", PageContext.REQUEST_SCOPE);
pageContext.setAttribute("name", "session域对象", PageContext.SESSION_SCOPE);
pageContext.setAttribute("name", "application域对象", PageContext.APPLICATION_SCOPE);
%>
<!-- 使用request取值 -->
<%=request.getAttribute("name") %>
<!-- 使用pageContext取值 -->
<%=pageContext.getAttribute("name", PageContext.REQUEST_SCOPE)%>
<!-- findAttribute会从小到大搜索域的范围中的name
pageContext域也可以称为page域
page域<request域<session域<application域 -->
<%=pageContext.findAttribute("name") %>
</body>
2.2 可以获得其他8大隐式对象
例如:
pageContext.getRequest()
pageContext.getSession()
应用:
当一个方法需要好几个对象作为参数时,只需让pageContext作为参数即可。
五、JSP的四个域对象范围
- page:表示当前页,通常没用。jsp标签底层使用。
- request:表示一次请求。通常一次请求就一个页面,但如果使用请求转发,可以涉及多个页面。
- session:表示一次会话。 可以在多次请求之间共享数据。
- application:表示一个web应用(项目)。可以整个web项目共享,多次会话共享数据。
六、JSP动作元素(动作标签)
1、页面包含(动态包含)
<jsp:include page=“relativeURL” flush=“true | false” />
page
属性:指定被引入资源的相对路径。
flush属性:指定是否将当前页面的输出内容刷新到客户端,默认为false。
动态包含和静态包含的区别
- include指令:
<%@include file="" %>
,静态包含
。
当前页面和被包含的页面,合并成后生产一个servlet源码。 - include标签:
<jsp:include page=""></jsp:include>
,动态包含
。
当前页面和被包含的页面,分别生产servlet源码和字节码,运行时,由tomcat进行合并输出。
2、请求转发
<jsp:forward page=“要转发的资源” />
七、JSP代码重用
- (1)jsp代码是可以重用
- (2)jsp代码如何重用?
建立jsp页面 A,并在A中保存重用代码
在当前页面 B 中引入A<jsp:include page="A.jsp" />
还可以再次引入A<jsp:include page="A.jsp" />
- (3)B可以将参数传给A
在A中的< jsp:include >标签中写入<jsp:param name="name" value="jack"/>
在B中写入${param.name}
- 示例
demo01.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<h1>我是可以重用的jsp页面</h1>
${param.name}
${param.url}
</body>
</html>
demo02.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<jsp:include page="demo01.jsp">
<jsp:param name="name" value="jack"/>
<jsp:param name="url" value="http://www.baidu.com"/>
</jsp:include>
<h1>我是引入可重用jsp的页面</h1>
<jsp:include page="demo01.jsp"></jsp:include>
</body>
</html>
本文地址:https://blog.csdn.net/qq_43639081/article/details/109366957