01_EL表达式的概述
全称是Expression Language
主要作用
获取域对象中的数据并输出
执行运算并将结果输出
获取WEB开发中的常用对象
格式
${}
02_EL表达式获取并输出其他类型的对象 ---javabean对象 数组 集合 map
el表达式作用: 替代jsp页面中的<% 主要是用来展示数据的
1,从4个域对象中根据键的名字获取值
User u = new User("zhangsan",23);
pageContext.setAttribute("aaa", u);
获取:${aaa }
2,获取对象中的属性和集合中的元素
数组/集合:使用数组/集合名[索引] 来获得元素
int[] arr = {1,2,3,4,5};
pageContext.setAttribute("bbb", arr);
获取:${bbb[1] }
对象/map集合:使用对象名或者map名["属性名"] 来获取对应的属性值(标准写法)
User u = new User("zhangsan",23);
pageContext.setAttribute("ccc", u);
获取:${ccc["username"] }
对象/map集合:使用对象名或者map名.属性名 来获取对应的属性值(简化写法)
User u = new User("zhangsan",23);
pageContext.setAttribute("ccc", u);
获取:${ccc.age}
有一种例外,map集合有一个键值对,键是"a b c",值是"zzz"
Map<String,String> map = new HashMap();
map.put("abc","www");
map.put("a b c","zzz");
pageContext.setAttribute("fff", map);
获取:${fff["a b c"] } 只能用标准写法
03_使用EL表达式进行运算并输出结果
注意点:
1,pageContext.setAttribute("username", ""); 或者 pageContext.setAttribute("username", null);
表明没有设置 用${ empty username }获取的就是true
2,数组里面没有元素 用${empty list }获得的是true
3,el表达式不能嵌套
04_EL表达式内置对象的概述 *****一个对象和10个map集合*****
pageContext 是JSP页面的上下文对象,代表了JSP页面
pageScope 封装了pageContext域对象的数据
requestScope 封装了request域对象的数据
sessionScope 封装了session域对象的数据
applicationScope 封装了application域对象的数据
param 封装了表单提交的数据,Map的value类型是String
paramValues 封装了表单提交的数据,Map的value类型是String[]
header 封装了请求头,Map的value类型是String
headerValues 封装了请求头,Map的value类型是String[]
cookie 封装了客户端带来的cookie
initParam 封装了WEB应用的初始化参数
requestScope 和 request对象区别
request对象,除了那3个方法(setAttribute,getAttribute,removeAttribute),还可以获取分发器,进行转发和包含,还可以得到请求行,请求头
但是requestScope没有这些方法,他只是一个作为域对象存储数据的map集合,他只能获取数据,对于其他功能是没有的,是阉割版的4大域对象
作用:如果出现重名的属性,我们就可以使用EL表达式中跟域对象相关的对象来获取
requestScope里面有一个username属性
sessionScope里面也有一个username属性
如果直接用${username} 获取的就是requestScope里面的username属性
如果就是要获取sessionScope里面的username属性 ${sessionScope.username}
05_测试EL表达式的内置对象
注意点:
获取web应用的根路径;${pageContext.request.contextPath}
直接写cookie,得到是浏览器携带过来的cookie的map集合.键是cookie的名字,值是cookie对象
pageContext 页面上下文对象(完整的对象)
比如:${pageContext.request.contextPath} 相当于 pageContext.getRequest().getContextPath()
pageScope requestScope sessionScope applicationScope 是4个域对象存储数据的map集合,如果出现了同名的属性,就可以使用这4个来获取
比如:${sessionScope.username} 相当于 pageContext.getAttribute("username",SESSION_SCOPE);
param paramValues 就是表单提交过来的数据的map集合
比如:${param.password} 相当于 request.getParamter("password")
header headerValues 就是请求头中数据的map集合
比如:${header["User-Agent"]} 相当于 request.getHeader("User-Agent")
cookie 就是浏览器携带过来的所有的cookie的map集合 键是cookie的名字,值是cookie对象
map.put("username",new Cookie("username","zhangsan")) 类似这样把cookie对象放到map集合里面
比如:${cookie.username} 得到的是一个cookie对象 ${cookie.username.value} 得到的是cookie对象里面的值
initParam 就是得到初始化参数的map集合 获得的是应用的初始化参数<context-param> 标签里面的值
比如:${initParam.username} 相当于 ServletContext.getInitParam("username")
01_JSTL的概述
全称是JSP Standard Tag Library,JSP标准标签库, core核心库 //xml库 jdbc库 国际化库
JSTL由开源组织Apache所提供和维护,
JSTL主要作用是移除JSP页面中的Java代码,
JSTL提供了一系列的标签库,主要使用JSTL的核心标签库。
使用步骤
将JSTL的相关jar包导入到WEB-INF/lib
在JSP页面中使用taglib指令导入标签库
在JSP页面中使用标签库里的标签
02_IF标签
设置数据的标签
var 声明一个变量
value 设置这个变量的值
scope 放在什么位置
<c:set var="username" value="itcast" scope="session"></c:set>
if标签
test:可以接EL表达式如果结果为true,则会执行if标签体里面的语句
<c:if test="$ {num > 3}">
<h1>黑马程序员</h1>
</c:if>
练习
判断session域对象中username的值是否等于itheima,如果是则显示欢迎登陆,否则显示用户名错误!
03_choose标签
choose是按照顺序判断内部的when标签里面的test是条件否成立,如果有一个成立,就会执行里面标签体,choose就结束了
当choose里面所有的when标签的条件都不成立的时候,就会执行otherwise的语句
类似java中的switch语句 choose相当于switch,when相当于case,otherwise相当于default
<c:set var="username" value="itcast" scope="session"></c:set>
<c:choose>
<c:when test="${username == 'itheima'}">
<h1>欢迎登陆!</h1>
</c:when>
<c:otherwise>
<h1>用户名错误!</h1>
</c:otherwise>
</c:choose>
根据交通信号灯做出不同的反应
04_forEach标签
主要作用是对数组对象或者集合对象进行遍历的操作,
通常和EL表达式组合使用,
forEach标签所遍历的通常是域对象中的数组对象或者集合对象。
第一种:类似 普通的for循环
begin:从几开始遍历
end:遍历到几
var:声明一个变量
额外的属性
step 步长
<c:forEach begin="1" end="100" var="i" step="2">
${i }<br />
</c:forEach>
第二种:类似增强for循环
items:等待遍历的集合或者数组对象
var:遍历的临时变量
<c:forEach items="${list }" var="i">
${i }<br>
</c:forEach>
额外的属性
varStatus:用来声明一个用来记录遍历状态的变量
他有两个属性
count:统计当前遍历了多少次(做表格的时候可以生成前面的序号)
index:统计当前遍历元素的索引
<c:forEach items="${list }" var="i" varStatus="status">
${status.count}--list[${status.index}]--${i }<br>
</c:forEach>
01_开发模式
模式一
JSP + JavaBean
JSP 获取数据,封装数据,显示数据,控制流程跳转,处理业务逻辑
JavaBean 增删改查
模式二(MVC)
JSP + Servlet + JavaBean
v JSP 显示数据
C Servlet 获取数据,封装数据,传输数据(域对象),控制流程跳转,处理业务逻辑
M JavaBean 增删改查
设计模式 23种 大话设计模式
mvc设计模式 很多图形化界面都有 移动端
三个阶段
1,只有Servlet,没有jsp,痛苦
2,抛弃Servlet,全部用jsp,操作数据库,操作xml,处理国际化 可读性非常差
3,MVC + 三层架构 各司其职 jsp擅长输出页面 Servlet处理业务逻辑 程序比较清晰
MVC和三层架构不是一个概念 三层架构是java独有的
02_MVC三层架构
表示层
客户端(浏览器)
Servlet:获取数据,封装数据
jsp: 显示数据
业务逻辑层
service:处理业务逻辑
数据访问层
dao:增删改查
db:数据库
好处
1,可以分工合作
各层依赖性比较低,可以实现解耦,分工明确,实现团队的协作开发
2,代码的重用性比较高
3,Struts hibernate Spring 其实对应着我们这3层
Struts 表示层框架 也就是web层(处理乱码,封装数据,处理业务逻辑,实现页面的跳转)
hibernate 数据持久化框架 对应着dao 面向对象
Spring 业务逻辑层 核心技术 IOC(依赖注入或者控制反转)
AOP(面向切面编程) 核心思想:解除耦合性,通过配置文件,在运行的时候把对象注入进来