day11_jsp/EL/JSTL学习笔记
一、jsp概述
JSP全称是Java Server Pages,它和servle技术一样,都是SUN公司定义的一种用于开发动态web资源的技术。
JSP实际上就是Servlet。
JSP这门技术的最大的特点在于:写jsp就像在写html,但它相比html而言,html只能为用户提供静态数据,而Jsp技术允许在页面中嵌套java代码,为用户提供动态数据。
jsp = html + java
html:静态内容。
servlet:服务器端的小应用程序。适合编写java逻辑代码,如果编写网页内容-->太苦逼。
jsp:适合编写输出动态内容,但不适合编写java逻辑。
Servlet负责那些事情?
1. 获取表单数据
2. 处理业务逻辑
3. 分发转向
提问:为什么JSP技术也是一种动态web资源的开发技术?
答:因为JSP技术允许在页面中嵌套java代码,以产生动态数据,并且web服务器在执行jsp时,web服务器会传递web开发相关的对象给jsp,
jsp通过这些对象,可以与浏览器进行交互,所以jsp当然也是一种动态web资源开发技术。
强调一个概念:
对现在的用户而言,认为通过浏览器看到的东西都是网页。
但我们程序员心里要清楚,开一个浏览器访问网页,这些网页有可能是一个html页面(即静态web资源),也有可能是一个动态web资源(即用servlet或jsp程序输出的)。
二、jsp的原理
1. IE浏览器在访问JSP页面时,Web服务器是如何调用并执行一个jsp页面的?(Servlet)
答:第一次:转译(翻译) --> 编译 --> 执行
第二次:执行
2. Web服务器在执行jsp页面时,是如何把Jsp页面中的html排版标签发送到客户端的?
答:out.print("<......>"); 或者 out.write("<......>");
3. Jsp页面中的java代码服务器是如何执行的?
答:服务器 --> .java文件 --> .class文件 --> 结果out回客户端
4. Web服务器在调用jsp时,会给jsp提供一些什么java对象(内置对象)?
答:HttpSession、ServletConfig、ServletContent、request、response、out等等。
三、jsp的最佳实践
Servlet:控制器。重点编写java代码逻辑。(获取表单数据、处理业务逻辑、分发转向)
JSP:代码显示模板。重点在于显示数据。(为什么显示数据不直接用.html文件呢?因为.jsp文件中可以插入java代码显示回显消息,简言之,jsp功能更强大)
示例:
lojin.jsp
doLogin.jsp(该jsp文件,先转译成java文件,注意:该jsp文件说白了其实就是纯的java代码,那么就最好不使用jsp文件了。)
success.jsp
但是用户关心的是只有显示给他们的页面,你怎么实现的,跟我(用户)没有关系。所以doLogin.jsp的代码可以放到src中。
四、jsp的基本语法
1、JSP的模版元素:简言之就是网页的静态内容
例如:html标签和普通文本。
2、JSP的脚本
2.1、小脚本
<% java代码 %>
2.1、表达式
<%= 2 + 3 %> 等价于out.print(2 + 3);
2.3、声明
<%! %> 表示在类中定义全局成员和静态块。
3、JSP注释
JSP注释:<%-- 被注释的内容 --%> 特点:安全,省流量
网页注释:<!-- 网页注释 --> 特点:不安全,费流量
4、JSP的3个指令
5、JSP的6个动作
6、JSP的9个内置对象
五、jsp的3个指令
JSP指令(directive)是为JSP引擎而设计的,它们并不直接产生任何可见输出,而只是告诉引擎如何处理JSP页面中的其余部分。
在JSP 2.0规范中共定义了三个指令:
page指令(页面级别)
include指令(导入其它页面的信息)
taglib指令(标签指令)
例如:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8" contentType="text/html; UTF-8"%>
语法:
<%@ 指令名称 属性1="属性值1" 属性2="属性值2 ...... %>
或者:
<%@ 指令名称 属性1=" %>
示例:
1、page
作用:page指令用于定义JSP页面的各种属性,无论page指令出现在JSP页面中的什么地方,它作用的都是整个JSP页面。
为了保持程序的可读性和遵循良好的编程习惯,page指令最好是放在整个JSP页面的起始位置。
属性:
1.1、import和java代码中的import是一样的。
<%@ page import="java.util.Date, java.util.List" %>
或者:
<%@ page import="java.util.Date" %>
<%@ page import="java.util.List" %>
JSP会自动导入(默认导入)以下的包:
import java.lang.*;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.jsp.*;
1.2、session: 表示是否会自动创建session对象。其默认值是true。
1.3、buffer: JSP中有javax.servlet.jsp.JspWriter输出字符流。设置输出数据的缓存大小,默认大小是8kb。建议最好不要改大小。
1.4、errorPage: 如果页面中有错误,则跳转到指定的资源。(即不让页面弹出404/500等错误)
errorPage="/uri"
如果写"/"则代表当前应用的目录下,绝对路径。
如果不写"/"则代表相对路径。
1.5、isErrorPage: 表示是否创建throwable对象。其默认值是false。作用:输出页面错误信息:by zero
1.6、contextType: contentType="text/html; charset=UTF-8" 告诉浏览器使用什么编码来解析文本。等同于 response.setContextType("text/html; charset=utf-8");
1.7、pageEncoding: 告诉JSP引擎(服务器)要转译(翻译)的文件使用的编码。
例如:<%@ page pageEncoding="gbk" %>
1.8、isELIgnored: 是否支持EL表达式。 默认是false,表示支持EL表达式。
例如:${1+1} 等价于out.print(1+1);
pageEncoding说明图:
2、include
include指令用于引入其它JSP页面,如果使用include指令引入了其它JSP页面,那么JSP引擎将把这两个JSP翻译成一个servlet。所以include指令引入通常也称之为静态引入。
静态包含:把其它资源包含到当前页面中。
<%@ include file="/include/header.jsp" %>
动态包含:
<jsp:include page="/include/header.jsp"></jsp:include>
两者的区别:转译(翻译)的时间段不同
前者:在翻译时就把两个文件合并
后者:不会合并文件,当代码执行到include时,才包含另一个文件的内容。
使用原则:能用静的就不用动的。原因之一是:可以省略一些代码的书写。
3、taglib
作用:在JSP页面中导入JSTL标签库。替换jsp中的java代码片段。
示例:
<%
if (5 > 3) {
out.print(5);
}
%>
<%-- 上下二种方式是等价的 --%>
<c:if test="${5>3}">
aaa
</c:if>
下面的这种方式很好用!后面慢慢体会。
六、jsp的6个动作
使用标签的形式来表示一段java代码。
如:
<jsp:include page="2.jsp"></jsp:include>
<jsp:include > 动态包含
<jsp:forward> 请求转发
<jsp:param> 设置请求转发的参数
<jsp:useBean> 创建一个对象
<jsp:setProperty> 给指定的对象属性赋值
<jsp:getProperty> 取出指定对象的属性值
示例:
七、jsp的9个内置对象
指在JSP的<%=%> 和<% %>中可以直接使用的对象,服务器给我们创建好的对象,直接拿过来用就行了。
例如:
<%=request.getParameter("name") %>
<%
Student stu = new Student();
stu.setName("tom");
out.print(stu.getName());
// request.getRequestDispatcher("/7.jsp").forward(request, response);
%>
对象名 |
类型 |
说明 |
request |
javax.servlet.http.HttpServletRequest |
|
response |
javax.servlet.http.HttpServletResponse |
|
session |
javax.servlet.http.HttpSession |
由session="true"控制开关 |
application |
javax.servlet.ServletContext |
|
exception |
java.lang.Throwable |
由isErrorPage="false"控制开关 |
page |
java.lang.Object 当前对象this |
当前servlet实例 |
config |
javax.servlet.ServletConfig |
|
out |
javax.servlet.jsp.JspWriter |
字符输出流,相当于printWriter对象 |
pageContext |
javax.servlet.jsp.PageContext |
当前页面的上下文 |
pageContext(重要):做自定义标签的时候会用到它,该域对象用的比较少,因为该域对象只在当前页面有效。
1、本身也是一个域对象:它可以操作其它三个域对象(request、session、application)的数据
void setAttribute(String name, Object value);
Object getAttribute(String name);
void removeAttribute(String name);
操作其它域对象的方法
void setAttribute(String name, Object value, int scope);
Object getAttribute(String name, int scope);
void removeAttribute(String name, int scope);
scpoe(域)的值:
PageContext.PAGE_SCOPE
PageContext.REQUEST_SCOPE
PageContext.SESSION_SCOPE
PageContext.APPLICATION_SCOPE
findAttribute(String name); // 自动从page、request、session、application依次查找,找到了就取值,然后结束查找。(很牛的方法,要记住)
2、它可以创建其它的8个隐式对象
在普通类中可以通过PageContext获取其他JSP隐式对象。自定义标签时使用。
3、提供了转发和包含的简易方法
pageContext.forward("2.jsp"); // 请求转发
八、四大域对象:实际开发如何用?
PageContext:pageConext 存放的数据仅在当前页面有效。开发时使用较少。当前页面存放数据用表单标签中的 <input type="hidden" />,且该存值方式用户看不到。
ServletRequest: request 存放的数据在一次请求(转发:可以传数据)内有效。使用非常多。
HttpSession: session 存放的数据在一次会话(多次请求)中有效。使用的比较多。例如:存放用户的登录信息、购物车功能。
ServletContext: application 存放的数据在整个应用范围内都有效。因为范围太大,应尽量少用。用于统计在线人数。
九、EL表达式
1、EL的概述和基本语法
EL表达式:expression language 表达式语言
作用:要简化jsp中java代码开发。
特点:具有很强的容错机制。
它不是一种开发语言,而是jsp中获取数据的一种规范。或者说,它把java底层代码进行了封装。
2、EL的具体功能
a、获取数据
个作用域中的数据。
${ s } 原理: ${ s } 等价于 pageContext.findAttribute("s");
注意1:${ s }取不到表单数据,若想取到表单数据,需要 ${ param.s } 这样才可以取到。
注意2:url?name=tom&pwd=123 这种方式就是get提交的表单方式,所以需要 ${ param.name } 才能取到值。
EL获取对于null这样的数据,在页面中表现为空字符串(""),不会报错,说明EL具有很强的容错机制。
${ s.name } 等价于 s.getName()方法
b、运算
empty
判断null、空字符串、没有元素的集合(即使集合对象本身不为null)都返回true。
三元运算符
c、隐式对象:11个
EL隐式对象引用名称 |
类型 |
JSP内置对象名称 |
说明 |
pageContext |
javax.servlet.jsp.PageContext |
pageContext |
一样的 |
pageScope |
java.util.Map<String, Object> |
没有对应的 |
pageContext范围中存放的数据,页面范围 |
requestScope |
java.util.Map<String, Object> |
没有对应的 |
请求范围数据 |
sessionScope |
java.util.Map<String, Object> |
没有对应的 |
会话范围数据 |
applicationScope |
java.util.Map<String, Object> |
没有对应的 |
应用范围数据 |
param |
java.util.Map<String, String> |
没有对应的 |
一个请求参数 |
paramValues |
java.util.Map<String, String[]> |
没有对应的 |
重名请求参数 |
header |
java.util.Map<String, String> |
没有对应的 |
一个请求消息头 |
headerValues |
java.util.Map<String, String[]> |
没有对应的 |
重名请求消息头 |
initParam |
java.util.Map<String, String> |
没有对应的 |
web.xml中全局参数 |
cookie |
java.util.Map<String, Cookie> |
没有对应的 |
key:cookie对象的name值 |
十、JSTL
1、什么是JSTL
JSTL(JavaServerPages Standard Tag Library)JSP标准标签库。
作用是:简化java代码。
EL表达式${...} 只能处理简单java代码,复杂的逻辑java代码就不行了!此时就用JSTL。
2、JSTL的作用
使用JSTL实现JSP页面中逻辑处理。如判断、循环等。
注意:在JSTL中想取值,必须加${值}。
3、使用JSTL
1)在JSP页面中添加taglib指令(prefix:前缀(相当于重新给uri起个名字))
2)使用JSTL标签
4、常用标签介绍
核心标签库:
> 通用标签:set、 out、 remove(了解就行,开发时根本不用个!)
> 条件标签:if choose
> 迭带标签:foreach
普通for循环
迭带器
day11_jsp/EL/JSTL学习笔记的更多相关文章
- JavaWeb 后端 <六> 之 EL & JSTL 学习笔记
一.EL表达式(特别重要)
- JavaEE EL & JSTL 学习笔记
1. EL表达式(特别重要)
- JSTL学习笔记(核心标签)
一.JSTL标签分类: 核心标签 格式化标签 SQL标签 XML标签 JSTL函数 二.核心标签 引用方式:<%@ taglib prefix="c" uri=& ...
- JSTL学习笔记
转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/6684442.html 一:JSTL用途 JSP标准标签库(JSTL)是一个JSP标签集合,它封装了JSP应用 ...
- EL表达式学习笔记
转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/6684424.html 一:EL表达式的用途 1.获取数据:(某个web域 中的对象,访问javabean的 ...
- Java Web学习笔记之---EL和JSTL
Java Web学习笔记之---EL和JSTL (一)EL (1)EL作用 Expression Language(表达式语言),目的是代替JSP页面中复杂的代码 (2)EL表达式 ${变量名} ( ...
- [原创]java WEB学习笔记43:jstl 介绍,core库详解:表达式操作,流程控制,迭代操作,url操作
本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当 ...
- [原创]java WEB学习笔记38:EL 中的 11个 隐含对象 详解
本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当 ...
- [原创]java WEB学习笔记42:带标签体的自定义标签,带父标签的自定义标签,el中自定义函数,自定义标签的小结
本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当 ...
随机推荐
- CCDrawNode类的引用
CCDrawNode Class Reference Inherits from CCNode : CCResponder : NSObject Declared in CCDrawNode.h 总览 ...
- mybatis 配置 log4j 日志
mybatis 配置 log4j 日志 使用Mybatis的时候,可能需要输出(主要是指sql,参数,结果)日志,查看执行的SQL语句,以便调试,查找问题. 测试Java类中需要加入代码: stati ...
- Css技术入门笔记01
在学习html的时候,html中的标签都具备了特定功能,或者含义,以及相应的样式效果.可是在有些时候我们可能仅仅希望使用 html标签把要显示的数据封装起来,而不需要任何的样式效果.这时就需要单独的标 ...
- (十七)TableView的本地性能优化
面试中常常会问TableView的性能优化. TableView只会加载能看到的Cell,每当有一个Cell进入视野范围内,就会调用. 存在着内存隐患,如果用户拖动的很快,所以内存会飙升的很快,因此要 ...
- 《java入门第一季》之类(Scanner类)
/* * Scanner:用于接收键盘录入数据. * * 前面的时候: * A:导包 * B:创建对象 * C:调用方法 * * System类下有一个静态的字段: * public static f ...
- JSP判断移动设备
日期: 2014年3月6日 人员::铁锚 看到了一篇很好的文章, <在天猫,前端做什么?>,里面有天猫php判断移动设备的正则(个人猜测),觉得很好用,于是就决定移植到JSP里面. jsp ...
- Android Studio Gradle 多渠道自动打包,动态修改HostUrl,签名apk,混淆配置详解
文/ skay csdn博客:http://blog.csdn.net/sk719887916/article/details/40541163 最近遇到项目从Eclispe迁移到Android st ...
- Hbase replication操作
1.修改hbase-site.xml文件 <property> <name>hbase.replication</name> <value>true ...
- HBase rest
HBase Rest 是建立在HBase java 客户端基础之上的,提供的web 服务.它存在的目的是给开发者一个更多的选择. 1.启动rest 服务 (1)hbase rest start 用默认 ...
- How tomcat works 读书笔记十七 启动tomcat 下
在上一节中,我们程序的起始位置还是Bootstrap,现在我们通过bat文件来启动这个类. 在分析catalina.bat之前,我们先看看几个简单的我们能用到的dos命令. 基础知识 1 rem 注释 ...