JSP
全名为Java Server Pages,中文名叫java服务器页面,其根本是一个简化的Servlet设计,它[1] 是由Sun Microsystems公司倡导、许多公司参与一起建立的一种动态网页技术标准。JSP技术有点类似ASP技术,它是在传统的网页HTML(标准通用标记语言的子集)文件(*.htm,*.html)中插入Java程序段(Scriptlet)和JSP标记(tag),从而形成JSP文件,后缀名为(*.jsp)。 用JSP开发的Web应用是跨平台的,既能在Linux下运行,也能在其他操作系统上运行。
原理:
jsp实质上是servlet,jsp访问时,会生成一个.java和.class文件来处理数据。通过out.write()进行输出(默认),其中的java类继承自httpServlet就是一个证据。
当然也可以用response.getWrite().write进行输出文字。
重定向和转发
重定向-----修改用户请求
转发------转发用户请求。
四大域对象:
java与jsp间常常通过域对象进行数据传递
pageContext:整个页面共享
request:转发的页面共享
session:整个会话过程共享
application:整个工程共享
九大内置对象:
request:请求对象,获取请求信息
pageContext:当前页面上下文对象
session:会话对象。可以获取会话信息。
application:ServletContext对象实例,可以获取整个工程的一些信息。
exception:异常对象只有在jsp页面的page 指令中设置 isErrorPage="true" 的时候才会存在
config:ServletConfig对象实例,可以获取Servlet的配置信息
out:输出流
page:表示当前Servlet对象实例(无用,用它不如使用this对象)
response:响应对象。可以设置响应信息
九大内置对象,都是我们可以在【代码脚本】中或【表达式脚本】中直接使用的对象。
jsp中的三种脚本介绍
1)第一种,声明脚本:
声明脚本格式如下:
<%!
java 代码
%>
在声明脚本块中,我们可以干4件事情
1.我们可以定义全局变量。
2.定义static静态代码块
3.定义方法
4.定义内部类
几乎可以写在类的内部写的代码,都可以通过声明脚本来实现
2)第二种,表达式脚本(***重点,使用很多):
表达式脚本格式如下:
<%=表达式 %>
表达式脚本 用于向页面输出内容。
表达式脚本 翻译到Servlet程序的service方法中 以 out.print() 打印输出
out 是jsp的一个内置对象,用于生成html的源代码
注意:表达式不要以分号结尾,否则会报错
表达式脚本可以输出任意类型。
比如:
1.输出整型
2.输出浮点型
3.输出字符串
4.输出对象
<%-- 测试当前页面作用域 --%> <%=pageContext.getAttribute("key") %><br/> <%=request.getAttribute("key") %><br/> <%=session.getAttribute("key") %><br/> <%=application.getAttribute("key") %><br/>
表达式脚本 用于向页面输出内容。
3)第三种,代码脚本(*****重点,使用最多):
代码脚本如下:
<% java代码 %>
代码脚本里可以书写任意的java语句。
代码脚本的内容都会被翻译到service方法中。
所以service方法中可以写的java代码,都可以书写到代码脚本中
<% // out输出 out.write("这是out的第一次输出<br/>"); // out flush之后。会把输出的内容写入writer的缓冲区中 out.flush(); // 最后一次的输出,由于没有手动flush,会在整个页面输出到客户端的时候,自动写入到writer缓冲区 out.write("这是out的第二次输出<br/>"); // writer的输出 response.getWriter().write("这是writer的第一次输出<br/>"); response.getWriter().write("这是writer的第二次输出<br/>"); %>
代码脚本执行代码逻辑
在jsp中使用纯java代码或java表达式会使jsp页面太笨重,所以引进EL表达式和JSTL
E L的全称:Expression Language,就是表达式语言。可以输出表达式的值。跟jsp的表达式脚本一样。计算表达式的值后输出。
EL表达式出现的目的是为了使JSP写起来更加简单,让jsp的代码更佳简化。
EL表达式的最主要功能就是从域对象中获取数据,并且输出
EL表达式,获取域对象数据(*****重点)
使用EL表达式获取数据的语法: “${标识符}”
第一点:当EL表达式输出的key不存在的时候,输出的是空串””
第二点:EL表达式在域对象中搜索属性的顺序是pageContext,request,session。Application
EL表达式可以从域对象中获取数据
1、EL表达式获取域数据的顺序
EL 表达式语句在执行时,会用标识符为关键字分别从page、request、session、application四个域中查找对应key的对象。
找到则返回相应数据。找不到则返回空串。(注意,不是null,而是空字符串)
1.2、EL表达式,获取域对象数据(*****重点)
使用EL表达式获取数据的语法: “${标识符}”
第一点:当EL表达式输出的key不存在的时候,输出的是空串””
第二点:EL表达式在域对象中搜索属性的顺序是pageContext,request,session。Application
EL表达式可以从域对象中获取数据
1、EL表达式获取域数据的顺序
EL 表达式语句在执行时,会用标识符为关键字分别从page、request、session、application四个域中查找对应key的对象。
找到则返回相应数据。找不到则返回空串。(注意,不是null,而是空字符串)
2、获取javaBean普通属性、数组属性、List集合属性,以map属性中的数据。
例如:
${ user.username } // 获取user对象中。username属性值
${ list[0] } // 访问有序集合(或数组)中给定索引的元素
${ map.key } // 访问map集合中指定key的属性值
${ map[“key”] } // 访问特殊字符串的key的属性值
注意:[] 中括号除了可以访问带有顺序的集合和数组的元素之外。
还可以访问特殊的key值
1.3、EL 表达式--运算。
1)关系运算
2)逻辑运算
3)算数运算
4)empty运算符(***常用)
empty运算是判断一个对象或者集合是否为空。返回boolean值。
对象为null时,返回true
如果是空的字符串,返回true
如果是空的Object数组(Object数组.length == 0),返回true
空的集合,返回true
空的map,返回true
empty运算测试代码:
<h1>EL empty 运算</h1> 对象为null,empty为真 ---->>>>${ empty nullObject }<br/> 空的字符串,empty为真------>>>>${ empty emptyStr }<br/> 空的数组,empty为真------>>>>${ empty emptyArr }<br/> 空的list集合,empty为真---->>>>${ empty emptyList }<br/> 空的map集合,empty为真----->>>>${ empty emptyMap }<br/>
1.4、EL表达式中11个隐含对象。
EL表达式 中隐含11个对象,这11个对象我们都可以直接使用!!!
1.5、EL表达式获取域对象中的数据(****重点)
pageScope <=== 对应 ===> pageContext 域中的属性
requestScope <=== 对应 ===> request 域中的属性
sessionScope <=== 对应 ===> session 域中的属性
applicationScope <=== 对应 ===> ServletContext 域中的属性
<% // 在四个域中存放数据,进行获取 pageContext.setAttribute("key", "pageContext-value"); request.setAttribute("key", "request-Value"); session.setAttribute("key", "session-value"); application.setAttribute("key", "application-value"); %> <%-- 从不同的域中获取数据 --%> page域中key的值:${ pageScope.key }<br/> request域中key的值:${ requestScope.key }<br/> session域中key的值:${ sessionScope.key }<br/> application域中key的值:${ applicationScope.key }<br/>
1.6、pageContext访问Jsp中内置对象(用的不多)。
通过pageContext对象。我们可以直接获取jsp中的一些内置对象,
比如:
request对象,
session对象,
Servletconfig对象,
ServletContext对象,
然后获取一些我们需要的信息。
常用的功能获取
协议:
服务器ip:
服务器端口:
获取工程路径:
获取请求方法:
获取客户端ip地址:
获取会话的id编号:
pageContext使用示例代码
<body> 协议:${ pageContext.request.scheme }<br/> 服务器ip:${ pageContext.request.serverName }<br/> 服务器端口:${ pageContext.request.serverPort }<br/> 获取工程路径:${ pageContext.request.contextPath }<br/> 获取请求方法:${ pageContext.request.method }<br/> 获取客户端ip地址:${ pageContext.request.remoteHost }<br/> 获取会话的id编号:${ pageContext.session.id }<br/> </body>
pageContext对象最常用的功能就是获取上下文路径(也就是工程路径名)
工程名(上下文路径):${ pageContext.request.contextPath }
但是在实际项目中。为了缩短代码量,会把request对象放在pageContext域对象中。然后再使用,比如说
<%
// 先把request对象放到pageContext域对象中
pageContext.setAttribute(“req”,request);
%>
然后EL表达式代码改为
工程名(上下文路径):${ req.contextPath }
1.7、EL表达式其他隐含对象的使用。
jsp的常用标签(重点****)
<%-- 静态包含 --%>
<%-- 动态包含 --%>
<%-- 转发 --%>
2、JSTL标签库(次重点****)
JSTL标签库 全称是指 JSP Standard Tag Library JSP标准标签库。是一个不断完善的开放源代码的JSP标签库。
EL表达式主要是为了替换jsp中的表达式脚本,而标签库则是为了替换代码脚本。这样使得整个jsp页面变得更佳简洁。
JSTL由五个不同功能的标签库组成。
在jsp标签库中使用taglib指令引入标签库
CORE 标签库
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
XML 标签库
<%@ taglib prefix="x" uri="http://java.sun.com/jsp/jstl/xml" %>
FMT 标签库
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
SQL 标签库
<%@ taglib prefix="sql" uri="http://java.sun.com/jsp/jstl/sql" %>
FUNCTIONS 标签库
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
此处省略...................................
jsp的常用标签(重点****)
1)静态包含--很常用
<%@ include file="" %>
静态包含是把包含的页面内容原封装不动的输出到包含的位置。
2)动态包含--少用
<jsp:include page=""></jsp:include>
动态包含会把包含的jsp页面单独翻译成servlet文件,然后在执行到时候再调用翻译的servlet程序。并把计算的结果返回。
动态包含是在执行的时候,才会加载。所以叫动态包含。
3)页面转发--常用
<jsp:forward page=""></jsp:forward>
<jsp:forward 转发功能相当于
request.getRequestDispatcher("/xxxx.jsp").forward(request, response); 的功能。