JSP&EL表达式&JSTL

(一)JSP基本概念

JSP:java server pages —-java服务器端的页面,就是能写java代码的HTML页面,扩展名是XXX.jsp

jsp的组成:HTML代码+java代码+jsp代码

主要作用是: servlet要展示页面信息的时候会特别麻烦
而jsp能更好的替代Servlet去展示信息
一句话:jsp作用很多,但是对于我们来说只做一件事情:接收servlet传递过来的数据,进行 展示

(二)jsp的使用

1.执行原理

jsp的底层就是一个Servlet
jsp—->继承HttpJspBase—->继承httpServlet
jsp的执行原理(重点-面试题):
1.访问jsp的时候,服务器找到对应的jsp文件.将jsp文件变成.java文件.并调用编译器编译成.class文件存放 在tomcat的work目录下
2.编译后的class文件会被服务器当做Servlet执行,自动生成内容,将内容返回给服务器
3.服务器拿到生成的内容,组装成响应信息,返回给浏览器
4.浏览器收到响应,展示内容

2.jsp的脚本(了解,没用)

<%….%> java程序片段
放在它里面的内容相当于放在了生成servlet的service方法中
直接做的service中java代码

<%=…%> 页面输出表达式
放在它里面的内容相当于放在了生成servlet的service方法中
直接做的页面输出语句


<%!…%> 声明成员
放在它里面的内容相当于放在了生成servlet的成员位置上

3.jsp的注释(了解,基本没用,快捷键能自己生成)

  1. html的注释: <!-- --><br /> <br /> java的注释: // /* */ /** */<br /> <br /> jsp的注释: <%-- --%>

4.jsp的指令

作用:声明jsp页面的一些属性
格式:<%@ 指令名 属性1=”值1” 属性2=”值2” ….%>

指令的分类:
page:声明jsp页面的属性
include:包含

taglib:导入标签库 (明天讲—el和jstl)
注意:
jsp页面中可以使用多个指令,
指令可以出现多次,
位置任意,一般都在页面的上面
page指令: 给页面设置属性
重要属性 (面试题)
import:导入jar包的 alt+/ 自动导包
contentType:设置响应流的编码(通知浏览器用什么编码打开),设置文件的mime类型
pageEncoding:设置页面的编码
contentType和pageEncoding的联系:
两者都出现的时候:各自使用各自的编码
两者只出现一个的时候:两个使用出现的编码
两者都不出现的时候:使用默认的编码 (iso-8859-1)


了解属性
language:声明当前jsp支持的脚本语言 目前只有 java
errorPage:当页面出现错误之后 跳转到指定的页面上(地址)
isErrorPage:当前是否是个错误页面(默认值是false)
当声明这是一个错误页面的时候,在页面中可以使用 exception这个内置对象

session:设置当前页面是否可以使用session内置对象 默认是可以是使用的



include指令:(掌握) 给当前页面做多个页面内容的包含
静态包含
格式:
<%@include file=”…” %>

注意:将被包含页面的内容复制到当前的jsp页面中,一起编译运行了,只生成一个java文件


taglib指令:导入标签库(明天学—-el和jstl标签)
格式:
<%@taglib prefix=”前缀名” uri=”名称空间” %>

5.jsp的内置对象(9个)

  1. jsp页面上可以直接使用的对象称之为内置对象<br /> 内置对象 类型<br /> request HttpServletRequest<br /> application ServletContext<br /> session HttpSession<br /> out JspWriter JSP字符输出流,负责写响应体<br /> <br /> exception Throwable 异常信息的封装对象,一般不会有,isErrorPage="true"<br /> config ServletConfig 不用<br /> page Object(代表着本页的实例对象)<br /> response HttpServletResponse<br /> pageContext PageContext JSP最小的作用域,一般不使用这个作用域存储数据<br /> <br /> <br /> <br /> <br />pageContext对象: <br /> ①可以获取其他八大内置对象(了解)<br /> 比如:制作一个工具类,参数是pageContext,可以根据pageContext获取8大内置对象<br /> <br /> <br /> <br /> ②可以从别的作用域中查找数据<br /> pageContext.findAttribute(String name); //获取对应的值<br /> 先从最小的pageContext作用域中寻找,如果能找到,直接使用<br /> 找不到,继续找request,如果能找到,直接使用<br /> 找不到,继续找session,如果能找到,直接使用<br /> 找不到,继续找application,如果能找到,直接使用<br /> 最后都没找到,返回null<br /> <br /> if(pageContext.getAttribute("name")!=null)<br /> {<br /> return pageContext.getAttribute("name");<br /> }else if(request.getAttribute("name")!=null)<br /> {<br /> return request.getAttribute("name");<br /> }else if()<br /> ...<br /> else<br /> {<br /> return null; <br /> }<br /> <br /> <br /> ③pageContext可以操作其他作用域(了解)<br /> <br /> setAttribute()<br /> getAttribute()<br /> removeAttribute();<br /> <br /> <br /> 实例:<br /> 上下两句效果完全等价<br /> session.setAttribute("msg2", "33333333333");<br /> pageContext.setAttribute("msg2", "33333333333",pageContext.SESSION_SCOPE);<br /> <br /> <br />----------------------------------------------------------------------------------------------------- <br />

6.jsp的域对象(4个)

ServletContext(application): 作用范围:当前整个项目(公共的共享数据)
session: 作用范围:一次会话(私有数据)
request: 作用范围:一次请求,不管多少次转发

pageContext: 作用范围:当前页面
不用它去存数据—因为还不如变量
1 获取其它8大内置对象
2 获取其它域中的数据
3 给其它的域中存数据

数据的作用范围:pageContext四大域对象的使用选择
四大域作用:他们都是用于数据共享的
page域 :当前页面 不用 (范围太小)
request域 :当前请求和当前请求的转发 一次请求用
session域 :一次会话 多次请求用
* application域 :整个应用 很少用(范围太大,有线程安全问题)

————————————————————————————————————————————————

7.jsp的动作标签(了解)

在jsp页面使用请求转发

相当于<%request.getRequestDispatcher(..).forward(..)%>

动态包含
将被包含页面运行后的结果包含了进来.(修改—将所有jsp页面都编译了)

(三)EL表达式基本概念

作用:用来替代jsp脚本的
格式: ${el表达式}
功能: 1.获取域中的数据(重点)
简单数据的获取
复杂数据的获取
对象属性值的获取
2.执行运算
+ - * /
3.el的内置对象的使用(3+2)

(四)EL获取域中的数据

  1. <br /> 1 获取简单的数据<br /> ${pageScope|requestScope|sessionScope|applicationScope.属性名}<br /> <br /> 2 获取复杂的数据<br /> 获取数组<br /> ${pageScope|requestScope|sessionScope|applicationScope.属性名[index]}<br /> 获取list<br /> ${pageScope|requestScope|sessionScope|applicationScope.属性名[index]}<br /> <br /> ps:对于el来说:数组和list集合的获取方式相同<br /> <br /> 获取map<br /> ${pageScope|requestScope|sessionScope|applicationScope.属性名.键名} <br /> 便捷方式:<br /> ${属性名}<br /> 依次从小到大 pageContext,request,session,application 获取指定名称的属性<br /> 若找到了则返回,且结束该次查找<br /> 若找不到 返回""<br /> <br /> 注意: 一旦属性名中出现了".""+""-"等特殊符号的时候,就不能使用便捷查找了,必须使用以下方式<br /> ${xxxScopoe["属性名"]}<br /> <br /> 3 获取对象属性值<br /> 定义类<br /> 获取方式:<br /> ${属性名.属性}

(五)EL执行运算

1 + - /
注意: + 只用来做加法,不是用来做连接的 (无论是整数还是字符串,如果字符串不是数字型,会报错)
特点:只做运算,能做就做,不能做就报错

2 empty(掌握) 判断一个容器的长度是否0
如果容器长度为0 返回true
如果容器长度不为0 返回false

可以判断一个对象是否为空
如果对象为null 返回true
如果对象不为null 返回false

not empty—>取反值
! empty—>取反值

3 支持三元运算符 > < == && || !


总结:在el的表达式中可以直接就做+ -
/ ${+ - * /}
也可以直接就在里面做判断
也可以做三元运算

(六)EL获取web常见的对象

el的内置对象(11个)

—-四个域对象
(了解)pageScope
(掌握)requestScope
(掌握)sessionScope
(掌握)applicationScope

—和请求参数相关的el内置对象
(了解)param 将页面的参数进行了封装 String=String
(了解)paramValues 将页面的参数进行了封装 String=数组

—和请求头相关的el内置对象
(了解)header 将页面的请求头数据进行了封装 String=String
(了解)headerValues 将页面的请求头数据进行了封装 String=数组

—全局初始化参数的el内置对象
(了解)initParam 将全局的初始化参数进行了封装 String=String


(掌握)cookie 将浏览器带过来的cookie进行了封装 String=Cookie对象
(掌握)pageContext

pageContext (相当于jsp中pageContext)
${pageContext.request.contextPath}—-获取当前项目的项目名

(七)jstl的概念和分类

jsp标准的标签库语言
jsp要想用它,必须先导jstl的标签库 (taglib)

jstl的分类:
core:核心 (if判断 foreach循环) 只有这个需要掌握,其他过时了,不需要掌握
fmt:国际化或者格式化(过时了)
sql:和sql相关的(过时了)
xml:和xml相关的(过时了)
函数库(过时了)

(八)jstl的使用

jstl的使用步骤:
1.导入jar包(两个jar包)
2.在页面上导入标签库
<%@taglib prefix=”c” uri=”http://java.sun.com/jsp/jstl/core“ %>
c:if使用
格式:

条件成立的时候输出的内容


c:forEach使用
格式1:

${变量名 }

注意:
varStatus使用
常用属性:
count:记录当前是第几个
first:判断当前元素是否为第一个
last:判断当前元素是否为最后一个

例如:

${i }


格式2:高级

${变量名}

1.在页面对日期进行转换

导入类库
<%@taglib prefix=”fmt” uri=”http://java.sun.com/jsp/jstl/fmt“ %>
jsp代码:${lmxi.ceuidate} 是后台传来的实体类 ceuidate是Date类型属性(在实体类里面)


_'_>

效果
JSP-EL表达式[笔记] - 图1
//**
新增用户时候需要先查出来显示在页面再回显

id=“datepicker-a3” name=“departureTime”
value=>

$(document).ready(function() {
$(‘#datepicker-a3’).datetimepicker({
format: “yyyy-mm-dd hh:ii”,
autoclose: true,
todayBtn: true,
language: “zh-CN”
});
});
效果:
JSP-EL表达式[笔记] - 图2

2.CheckBox回显fn:contains函数(字符串比较的方法)

java代码
@RequestMapping(“/jumpAddSysRole”)
public ModelAndView jumpAddSysRole(ModelAndView mv, String id) {
//查询用户有用的role
List sysRoleListChecked = this.sysRoleService.findRoleById(id);//通过id查询用户所的角色信息
StringBuilder sb =new StringBuilder();//开始拼接
if (sysRoleListChecked != null && sysRoleListChecked.size()>0) { //先判断一下
for (SysRole sysRole : sysRoleListChecked) {
sb.append(sysRole.getRoleName()); //拼接用户所拥有的角色.
sb.append(“,”);
}
}
//查询所有的role
List sysRoleListAll = this.sysRoleService.findAllRole();
mv.addObject(“RoleNameCheckedStr”, sb.toString()); //用户被选中的字符串拼接结果
mv.addObject(“sysRoleListAll”, sysRoleListAll); //所有的角色框
mv.setViewName(“user-role-add”); //发送给页面
return mv;
}
引入类库:
<%— EL函数库,提供都是用来操作字符串相关的方法 —%>
<%@ taglib prefix=”fn” uri=”http://java.sun.com/jsp/jstl/functions“ %>
jsp页面
<c:if test=”${fn:contains(RoleNameCheckedStr,role.roleName) }”>checked</c:if> >
用c:if标签判断一下,
${fn:contains(RoleNameCheckedStr,role.roleName) } 意思是如果RoleNameCheckedStr包含 role.roleName 中的字符串就返回true,否则就返回false

fn:contains方法 判断一个中是否有指定的字符或者字符串,boolean类型

点击 :使用说明网址

OGNL表达式

(一)基本介绍

OGNL表达式:它是apache提供的一个表达式语言,在struts2框架中也有使用
Object Graphic Navigation Language 对象图导航语言
它的写法就是#{对象.对象}方式,访问的方法就是访问对象中的getXXX或者setXXX方法
${user.username} user setUsername getUsername