一、JSP内置对象
●内置对象
因为SP的本质是Servlet,在JSP文件经过转译之后,生成JAVA代码,在运行时JSP给我们准备好了九个可以直接使用而不用我们自己去new的对象,这九个对象我之为内置对象.
内置对象完全由SP自行去维护,我们直接使用即可。
●九大内置对象
confia ;page ;exception;request ;response ;session ;application ;out ;pageContext
●四个域对象
pageContext page域 当前页面内可用
request reqeust域 一次请求
session session域 一次会话
application application域 整个项目运行
●响应对象
response 响应对象
●输出流对象
out 打印流对象
●其他三个对象
servletConfig 由于JSP本身也是一个Servlet,所以容器也会给准备一个ServletConfig
page 就是JSP转换的Servlet的对象,也就是当前SP对象本身
exception 异常对象在错误提示页上使用,当isErrorpage=true才具有该对象
●注意事项:
•response对象
当服务器创建request对象时会同时创建用于响应这个客户端的response对象。
•out对象
是JspWriter类的实例,不是PrinterWriter的实例;用来在response对象中写入内容。JspWriter类包含了大部分java.io.PrintWriter类中的方法。不过,JspWriter增了一些专为处理缓存而设计的方法。另外JspWriter类会抛出IOExceptions异常。
最初的JspWriter类对象根据页面是否有缓存来进行不同的实例化操作。可以在page指令中使用buffered='false"属性来轻松关闭缓存。
•pageContext对象
PageContext类的实例,用来代表整个JSP页面;提供对SP页面所有对象以及命名空间的访问。
●Servlet与JSP的联系和区别
联系:
1.JSP和Servlet都是Sun公司推出的动态网页技术
2.基于Servlet开发页面的繁琐性,推出JSP来简化页面开发
3.JSP本质上是一个Servlet,会翻译成一个Servlet
区别:
1.JSP使人们把显示和逻辑分隔成为可能,这意味着两者的开发可并行进行;而Servlet并没有把两者分开。
2.JSP是在HTML代码里写JAVA代码,框架是HTML;而Servlet是在JAVA代码中写HTML代码,本身是个JAVA类。
3. Servlet需要在web.xml中配置,而JSP无需配置。
4.目前JSP主要用在视图层负责显示,而Servlet主要用在控制层负责调度
JSP表面上是一个HTML,本质上是一个Servlet。
●JSP的使用总结
1.创建Jsp文件,在项目的web目录下创建。
2.使用page指令设置Jsp的转译细节(一般自动生成的就够用)
3.使用tablib指令引入第三方的自定义标签来使用(JSTL标签)
4.使用HTML,CSS,JQuery完成页面的开发
5.使用<%%>声明java脚本片段完成数据的动态拼接
6. 获取request或者session中的数据拼接到当前页面中(内置对象)
四、EL表达式学习
1.问题
Servlet负责请求的处理;jsp负责请求处理结果的展示。
往往是使用Servlet处理完请求,将请求结果数据放在request域中,然后转发到jsp页面,在jsp页面通过<%%>也就是java脚本的方式取出request域中的据,然后进行展示。
也可以将Servlet处理请求后的结果放在session域中,然后将请求重定向到jsp页面,在jsp页面通过<%%>也就是java脚本的方式取出session域的数据,然后进行展示。
虽然Servlet结合jsp的方式已经极大的简化了开发功能和页面的操作。但在jsp页面中取域中的数据要使用<%%>和HTML代码进行拼接的方式展示数据,是比较麻烦,而且不利于阅读。
•可以在jsp页面中使用EL表达式来获取域对象中的数据
●特点
1.可以获取作用域对象中的数据
2.底层使用的是反射,在使用的时候可以通过键名即可获取对应的值
3.简化了在jsp页面中使用<%%>获取域对象数据的方式
●使用
基本语法
1.${键名},键名是域对象中存储的数据的键
2.${键名.属性名.属性名..},可以获取域对象中级联属性的值
3.${键名[角标]},获取域对象中存储的list集合或者数组中指定角标的数据
4.注意:${}不仅可获取域对象中的数据,而且会将该数据打印到浏览器中。如果获取不到数据,也不会报错,只是不显示而已。
•作用域数据查找顺序
使用EL表达式获取域数据的时候,如果没有指明作用域,那会按照作用域由小到大的顺序去找,直到找到为止:pageContext ---> request ---> session ---> application
●指定获取某个作用域中的数据
•${pageScope.键名} 获取page域对象中的数据
• ${requestScope.键名} 获取request域对象中的数据
•${sessionScope.键名} 获取session域对象中的数据
•${applicationScope.键名} 获取application域对象中的数据
●获取request对象中的请求数据
${param.键名},可以获取request中携带的请求参数的数据
●EL表达式可以使用比较运算和算术运算
${键名 逻辑运算符 键名}
${键名 算术运算符 键名}
注意:+表示的是算术运算,而不是字符串拼接。
●JDK8新特征
•Lambda 表达式:
Lambda表达式基于数学中的入演算得名,直接对应于其中的lambda抽象,是一个匿名函数,即没有函数名的函数。
•Lambda 表达式好处:
使用Lambda 表达式可使代码变的更加简洁紧凑。并且Lambda表达式可和StreamAPI等相结合,使代码更加简洁紧凑。Lambda 表达式经常用来替代部分匿名内部类。
•Lambda 表达式的语法
(parameters) -> expressiom或(parameters) ->( statements;
参数:要重写的方法的形参列表
->:lambda运算符
表达式/语句体:要重写的方法的方法体
•Lambda 表达式的本质:Lambda表达式是一种匿名函数(不是匿名内部类),简单地说,它是没有声明的方法,也即没有访问修饰符、返回值声明和名字。它实质属于函数式编程的概念。(不是匿名内部类的,此点在此不做展开)。
注意:
Lambda表达式如果多个参数,参数外的()不可省略。
有返回值的Lambda表达式,如果方法体只有一条语句,可同时省略return和{}。
虽然使用 Lambda 表达式可以对某些接口进行简单的实现,但并不是所有的接口都可以使用Lambda 表达式来实现。Lambda 规定接口中只能有一个需要被实现的抽象方法,不是规定接口中只能有一个方法,称为函数式接口。
• 参数类型可以省略不写
•如果只有一个参数,()可以省略不写