-
JSP概述
在 Servlet中书写后台逻辑代码和前台页面代码,十分复杂,如果页面构成繁琐,则servlet编写有很大难度。于是sun公司提供一种可以在页面中书写HTML和Java代码的技术。这门技术简化了前台和后台代码的切换操作,提升了开发的便利性。这门技术就是JSP。
JSP是Sun公司提供的一门动态资源开发技术。-
JSP原理
a. jsp页面在第一次被访问的时候,会被jsp翻译引擎翻译为一个Servlet文件。其中页面的HTML和Java代码全部包含在文件内。访问jsp页面,就是访问这个Servlet文件,会使其中的Service()方法执行。
b. index_jsp.java文件内的类继承了HttpJspBase.HttpJspBase是一个Servlet,所以当前类也是一个Servlet
c. 实验:
i. 自行寻找work目录下的jsp页面
work目录:[tomcat]/work/Catalina/[localhost]/…… -
模板元素
语法:
页面中的html元素在被访问时,会被jsp翻译引擎翻译为模板元素。页面中的模板元素,在翻译为servlet文件后,会以out.write()的方式输出到浏览器中。
-
JSP脚本表达式
语法:<%=JSP脚本表达式%> 直接量或具有返回值的表达式request.getContextPath()
脚本表达式会被jsp翻译引擎翻译为表达式的结果值。页面中的jsp脚本表达式,在被翻译为servlet文件时,会放在servlet文件对应的位置上,在计算结果后,通过out.print()输出到页面。
-
JSP脚本片段
语法:<%JSP脚本片段%>
脚本片段会被jsp翻译引擎翻译为java代码。页面中的JSP脚本片段,在被翻译为servlet文件时,会被原封不动的翻译成java语句,出现在servlet文件的对应位置。并且脚本片段可以书写成多个部分。每一个部分都可以不完整。但是需要保证这些不完整的部分在翻译为servlet文件后,可以组成完整的java代码,即可编写。
-
JSP声明
语法:<%!jsp声明%>
页面中的jsp声明,在被jsp翻译引擎翻译为servlet文件时,会变成成员变量或方法jsp声明可以看做是整个类的变量和方法,如果需要调用,则可以在页面中的任意位置调用。
-
JSP注释
HTML注释会被翻译为模板元素,但是由于是HTML注释的内容,所以不会在页面中产生输出
语法:<%-- JSP注释 --%><%//java注释%> java注释会被翻译为java代码,出现在servlet文件对应的位置,由于是注释,所以不会产生任何的代码输出。
<%-- JSP注释 --%> jsp注释在被翻译为servlet文件的过程中,就会被抛弃。不会出现在servlet文件中。注意:慎用! -
JSP指令
语法:<%@ 指令名称 属性名=“属性值”%>
<%@ page language=“java” import=“java.util." pageEncoding=“utf-8”%>
jsp指令本身不产生任何的输出,只是用来规定jsp翻译引擎如何翻译当前页面的。
注意:jsp指令可以出现在页面中的任意一行。
jsp指令可以在页面中多次出现。
a. jsp指令形式:
page指令 用于规定jsp翻译引擎如何翻译当前页面
include指令 用于导入页面
taglib指令 用于引入外部的标签库
i. page指令:
声明当前jsp页面的基本属性。控制jsp翻译引擎如何翻译jsp到servlet。
language=“java” 当前JSP使用的开发语言
extends=“package.class” 当前jsp翻译成servlet后要继承的类,注意此值必须是一个servlet的子类,一般情况下不要改 HttpJspBase
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中的此属性起作用.在web.xml中可以配置标签,用户作为整个web应用的友好错误提示页面。
[ isErrorPage=“true | false” ] 如果设置此属性为true,翻译过来的servlet中将含有Exception隐式对象,其中封装的就是上一个页面中抛出的异常对象
[ contentType=“mimeType [ ;charset=characterSet ]” | “text/html ; charset=ISO-8859-1” ] 和jsp乱码相关的指令,用来指定jsp输出时,设置的Content-Type响应头用来指定浏览器打开的编码
[ pageEncoding=“characterSet | ISO-8859-1” ] 服务器翻译jsp时使用的编码集.如果向防止jsp乱码,应该保证文件的保存编码和jsp翻译成servlet用的编码以及输出到浏览器后浏览器打开的编码一致.此属性一旦设置好,翻译引擎会间接帮我们设置content-type属性.
b. include指令
<%@include file=“url”%>
引入其他页面
<%@include file="/head.jsp" %>
this is index
<%@include file="/foot.jsp" %>
c. taglib指令
<%@taglib uri="" prefix=""%>
引入外部的标签库 -
九大隐式对象
在jsp页面被翻译为servlet文件之后,有九个对象可以直接使用,又没有显式的定义,所以这九个对象就称之为九大隐式对象
page 代表servlet文件的隐式对象
request 代表HTTP请求隐式对象
response 代表HTTP响应隐式对象
application 代表当前web应用的隐式对象
config 代表当前servlet配置信息的隐式对象
session 代表session会话的隐式对象
out 代表向页面输出的缓冲区的隐式对象out.write ()out.print()
exception 代表上一个页面错误信息的隐式对象
pageContext 代表当前jsp页面上下文的隐式对象 -
pageContext详解
pageContext代表的是当前jsp页面上下文的隐式对象。可以在jsp页面内直接调用。
a. pageContext功能一–其他八大隐式对象的入口
pageContext.getPage();—获取page隐式对象
pageContext.getRequest();—获取request隐式对象
pageContext.getResponse();—获取response隐式对象
pageContext.getSession();—获取session隐式对象
pageContext.getServletConfig();—获取config隐式对象
pageContext.getServletContext();—获取application隐式对象
pageContext.getException();—获取exception隐式对象
pageContext.getOut();—获取out隐式对象
b. pageContext功能二–作为域对象使用
域对象:如果一个对象身上有一个可以被看见的范围,在这个范围内利用对象身上的map实现数据的共享,这个对象就可以称之为域对象。
操作api:
setAttribute(String name,Object obj);
getAttribute(String name);
removeAttribute(String name)
getAtrributeNames();
生命周期:
在访问jsp页面时,产生pageContext对象,生命周期开始。
在结束访问jsp页面是,pageContext对象销毁,生命周期结束。
作用范围:
整个jsp页面。
主要功能:
在整个jsp页面内共享数据。
i. 案例操作pageContext域中属性
功能二–pageContext作为域对象使用
<%
pageContext.setAttribute(“name”, “丽丽”);
%>
<%=pageContext.getAttribute(“name”) %>c. 功能三–操作其他域中属性:
setAttribute(String name Object obj,int scope);//scope
getAttribute(String name,int scope);
removeAttribute(String name scope);
getAttributeNamesInScope(int scope);
功能三–获取设置其他域中的值
<%
pageContext.setAttribute(“country”, “China”, PageContext.APPLICATION_SCOPE);
pageContext.setAttribute(“country”, “US”, PageContext.SESSION_SCOPE);
pageContext.setAttribute(“country”, “UK”, PageContext.REQUEST_SCOPE);
pageContext.setAttribute(“country”, “Canada”, 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) %>PageContext.APPLICATION_SCOPE application域 PageContext.SESSION_SCOPE session域 PageContext.REQUEST_SCOPE request域 PageContext.PAGE_SCOPE page域
d. 功能四—自动搜寻域
使用自动搜寻域,会由小到大的搜索四个域中指定名称的域属性。一旦在较小范围内搜索到结果,则不会再向更大范围的域进行搜索。
自动搜寻域
<%=pageContext.findAttribute(“country”) %>
e. 功能五—便捷的请求转发
pageContext.forward(url); -
作用域概述
作用域:一个可以共享数据的范围可以称之为作用域。 -
四大作用域:
由大到小排序:
a. ServletContext — application
代表当前web应用的对象
生命周期:
当web应用被加载,servletContext对象创建。
当web应用被销毁,servletContext对象销毁。
作用范围:
整个web应用。
主要功能:
在整个web应用中共享数据。
b. Session — session
代表当前会话的对象
生命周期:
request.getSession()方法调用的时候,session对象产生
意外身亡:服务器意外关闭,session会立刻销毁。如果服务器正常关闭,数据会以文件的形式保留在磁盘上,这个过程称之为钝化。在服务器再次启动时,会重新读取这个文件,这个过程称之为活化。
自杀:调用session.invalidate()可以主动释放session对象。
超时死亡:如果一个session超过30分钟没有被使用,则会由服务器将其销毁。这个销毁的时间可以通过web.xml中的session-config标签来设置。默认为30分钟。
作用范围:
整个会话范围
主要功能:
在整个会话范围内实现数据共享
c. request — request
代表HTTP请求对象
生命周期:
请求链起始时,request对象创建。
请求链结束是,request对象销毁。
作用范围:
整个请求链。
主要功能:
在整个请求链中共享数据。
d. pageContext —pageContext
生命周期:
在jsp页面被访问时创建。
在jsp页面结束访问时销毁。
作用范围:
整个jsp页面
主要功能:
在整个jsp页面内共享数据
-
-
标签技术概述
在jsp页面中有HTML语句和java语句相互嵌套,如果java的逻辑代码和页面的HTML组成代码都十分复杂,两者有掺杂在一起,页面的可读性和可维护性都将降低。为了解决这个问题,产生了标签技术。用它来替换页面中的java语句,这样页面中只会出现HTML代码,整体的可读性和可维护性都会提升。-
常用的JSP标签技术
jsp标签
sun公司提供的标签技术 - 目前用的比较少
el表达式
便捷易用 - 使用非常广泛 - 但只是表达式无法实现复杂功能
jstl标签库
提供了大量强大的标签支持,是目前应用最广泛的标签库
自定义标签
sun提供的标签库开发接口,允许开发人员自己来开发特定功能的标签 - 通常用在框架级别的开发中,普通开发人员很少使用
其他第三方标签
以后了解 -
EL表达式概述
在jsp页面内的<%= JSP脚本表达式%> 都可以使用EL表达式来替换。
EL Expression Language 表达式语言
在javaee5及其以上版本中,都已经默认包含了el表达式的相关开发包,无需手动导入。 -
使用方式
语法:${ el表达式 }
可以获取常量、变量、数组、列表、映射、javabean等中的数据 -
EL特点:
EL表达式不能设置值,只能获取值
EL表达式只能获取域中的属性
EL表达式不能遍历 -
获取常量
el表达式获取常量
<%=123 %> <%=123.123 %> <%="abc"%> <%=true%> ${123 } ${123.123 } ${"abc" } ${true } -
获取变量
a. 获取指定域中的属性
el表达式获取域中的变量
<%
pageContext.setAttribute(“name”, “朴大胖”, PageContext.APPLICATION_SCOPE);
pageContext.setAttribute(“name”, “曹二胖”, PageContext.SESSION_SCOPE);
pageContext.setAttribute(“name”, “李三瘦”, PageContext.REQUEST_SCOPE);
pageContext.setAttribute(“name”, “丽丽”, PageContext.PAGE_SCOPE);%> <%=pageContext.getAttribute("name") %> <%=request.getAttribute("name") %> <%=session.getAttribute("name") %> <%=application.getAttribute("name") %> ${pageScope.name} ${requestScope.name} ${sessionScope.name } ${applicationScope.name } i. el表达式中的四大作用域 el表达式 jsp脚本表达式 pageScope PAGE_SCOPE requestScope REQUEST_SCOPE sessionScope SESSION_SCOPE applicationScope APPLICATION_SCOPE
b. 自动搜寻域
自动搜寻域
<%=pageContext.findAttribute(“name”) %>
${name}
c. 获取数组中的数据
获取数组中数据
<%
String[] names ={“a”,“b”,“c”,“d”};
pageContext.setAttribute(“names”, names);
%>
${names[0]}
${names[1]}
${names }
d. 获取链表中的数据
获取链表中的数据
<%
List list = new LinkedList();
list.add(“aaa”);
list.add(“bbb”);
list.add(“ccc”);
pageContext.setAttribute(“l”, list);
%>
${l[0]}
e. 获取映射中的数据
获取映射中的数据
<%
Map<String,String> map = new HashMap<String,String>();
map.put(“name”, “自行车”);
map.put(“age”, “18”);
map.put(“wife”,“丽丽”);
map.put(“addr”, “安徽”);
request.setAttribute(“map”, map);
request.setAttribute(“w”, “wife”);
%>
${map}
${map.name}
<%-- ${map.wife.first} --%>
${map[“wife”] }
[wife]: ${map[w]}
f. 获取javabean中的数据
在一个类中,如果存在私有化属性,这些属性包含get或set任意一个方法,则这些私有化的属性就可以称之为javabean属性,类中存在这些属性,这个类就是javabean的类。
获取javabean中的数据
<%
Person p = new Person(“阿斯顿”,18,“女”);
pageContext.setAttribute(“p”,p);
%>
<%=p.getName() %>
p . n a m e i . 在 j s p 脚 本 表 达 式 中 使 用 p . g e t X x x ( ) 方 法 获 取 的 数 据 , 在 e l 表 达 式 中 都 可 以 使 用 {p.name} i. 在jsp脚本表达式中使用p.getXxx()方法获取的数据,在el表达式中都可以使用 p.namei.在jsp脚本表达式中使用p.getXxx()方法获取的数据,在el表达式中都可以使用{p.xxx}的方式来获取。
ii. 如果javabean中的getXxx()方法发生了修改,则el表达式也要随之修改。
例如:
getName() ${p.name}
getNamex() ${p.namex} -
获取执行运算的结果
a. 算术运算
算术运算
${3+2}
${3-2}
${3/2 }
${3*2 }
${3%2 }
${3+“2”}
${3-“2” }
b. 关系运算
关系运算
${3>2 }
${3<2 }
${3==2 }
${3!=2 }
${3>=2 }
${3<=2 }
c. 逻辑运算
逻辑关系
${true && false }
${true and false }${true || false } ${true or false } ${!true } ${not true }
d. empty运算
empty运算用于判断当前域中属性是否为空。
Empty运算规则:如果对象为null 字符串为空 集合、数组、映射没有任何元素 empty操作都会返回true,否则false
empty运算
<%
String str = null;
pageContext.setAttribute(“str”, str);String s =""; pageContext.setAttribute("s", s); String[] names = {}; pageContext.setAttribute("names", names); List list = new LinkedList(); pageContext.setAttribute("list", list); Map<String,String> map = new HashMap(); pageContext.setAttribute("mapx", map); List listx = new LinkedList(); listx.add("abc"); pageContext.setAttribute("listx", listx); %> ${empty str } ${empty s } ${empty names} ${empty list } ${empty mapx } ${empty listx }
e. 三元表达式运算
三元表达式
<%
Map<String,String> mapx = new HashMap();
mapx.put(“name”, “”);
pageContext.setAttribute(“mapx”, mapx);
%>
${empty mapx.name?“曹洋”:mapx.name} -
el表达式的内置对象–11个
a. el表达式中的域对象 —4个
pageScope
requestScope
sessionscope
applicationScopeb. 代表请求头的内置对象
header 获取一个返回值为Map<String,String>的内置对象
headerValues 获取一个返回值为Map<String,String[]>的内置对象
request.getHeader(“host”)
${header.host}
c. 代表请求参数的内置对象
param 获取一个返回值为Map<String,String>的内置对象
paramValues 获取一个返回值位Map<String,String[]>的内置对象
request.getParameter(“username”)
${param.username}
d. 获取初始化请求参数的内置对象
initParam 获取一个返回值为Map<String,String>的内置对象
initParam.url
e. 获取浏览器中的cookie信息的内置对象
cookie 获取一个返回值为Map<String,Cookie>的内置对象
cookie.JSESSIONID.name
cookie.JSESSIONID.value
f. 获取pageContext内置对象
<%=request.getContextPath()%>
${pageContext.request.contextPath} -
el表达式调用java方法
略。
-
web基础day12---jsp
最新推荐文章于 2021-08-14 15:48:59 发布