一、EL技术
1.EL 表达式概述
EL(Express Lanuage)表达式可以嵌入在jsp页面内部,减少jsp脚本的编写,EL出现的目的是要替代jsp页面中脚本的编写。
2.EL从域中取出数据(EL最重要的作用)
jsp脚本:<%=request.getAttribute(name)%>
EL表达式替代上面的脚本:${requestScope.name}
EL最主要的作用是获得四大域中的数据,格式${EL表达式}
EL获得pageContext域中的值:${pageScope.key}
;
EL获得request域中的值:${requestScope.key}
;
EL获得session域中的值:${sessionScope.key}
;
EL获得application域中的值:${applicationScope.key}
;
EL从四个域中获得某个值${key}
;—取全域,同样是依次从pageContext域,request域,session域,application域中获取属性,在某个域中获取后将不在向后寻找
<%
//存储字符串
String str = "aaaaaa";
pageContext.setAttribute("str", str);
%>
<%
//存储对象
User user = new User();
user.setUsername("zhangsan");
user.setPassword("123");
request.setAttribute("user", user);
%>
<%
//存贮集合
User user1 = new User() ;
user1.setUsername("lisi") ;
user1.setPassword("123");
User user2 = new User() ;
user2.setUsername("wangwu");
user2.setPassword("345") ;
List<User> list = new ArrayList<User>() ;
list.add(user1);
list.add(user2);
session.setAttribute("list", list) ;
%>
<!-- 脚本法取数据 通过内置对象 -->
<!-- 获得普通字符串 -->
<%=pageContext.getAttribute("str")%>
<!-- 获得User对象的值 -->
<%
User requestUser = (User) request.getAttribute("user");
out.write(requestUser.getUsername());
%>
<!-- 获得List<User>的值 -->
<%
List<User> listUser =(List) session.getAttribute("list");
out.write(listUser.get(1).getUsername());
%>
<hr/>
<!-- el表达式取数据 -->
<!-- 获得普通字符串 -->
${pageScope.str}
<!-- 获得User对象的值 -->
${requestScope.user.username}
<!-- 获得List<User>的值 -->
${sessionScope.list[1].username }
<hr/>
<!-- 全域el -->
<!-- 获得普通字符串 -->
${str }
<!-- 获得User对象的值 -->
${user.username }
<!-- 获得List<User>的值 -->
${list[0].username }
${list[1].username }
3.EL的内置对象11个
pageScope,requestScope,sessionScope,applicationScope
—- 获取JSP中域中的数据
param,paramValues - 接收参数.
相当于request.getParameter() rquest.getParameterValues()
header,headerValues - 获取请求头信息
相当于request.getHeader(name)
initParam - 获取全局初始化参数
相当于this.getServletContext().getInitParameter(name)
cookie - WEB开发中cookie
相当于request.getCookies()—cookie.getName()—cookie.getValue()
pageContext - WEB开发中的pageContext.
pageContext获得其他八大对象
${pageContext.request.contextPath}:获得项目的路径
4.EL执行表达式
例如:
${1+1}
${empty user}:empty表示判断对象是否为空,为空返回true,否则返回false。
${user==null?true:false}
二、JSTL技术
1.JSTL概述
JSTL(JSP Standard Tag Library),JSP标准标签库,可以嵌入在jsp页面中使用标签的形式完成业务逻辑等功能。jstl出现的目的同el一样也是要代替jsp页面中的脚本代码。JSTL标准标准标签库有5个子库,但随着发展,目前常使用的是他的核心库
2.JSTL下载与导入
JSTL下载:
从Apache的网站下载JSTL的JAR包。进入“http://archive.apache.org/dist/jakarta/taglibs/standard/binaries/”网址下载 JSTL的安装包。jakarta-taglibs-standard-1.1.2.zip,然后将下载好的JSTL安装包 进行解压,此时,在lib目录下可以看到两个JAR文件,分别为jstl.jar和standard.jar。 其中,jstl.jar文件包含JSTL规范中定义的接口和相关类,standard.jar文件包含用于 实现JSTL的.class文件以及JSTL中5个标签库描述符文件(TLD)。
第一步:将jstl.jar和standar.jar两个jar包导入工程的lib中即可。
第二步:使用jsp的taglib指令导入核心标签库
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
3.JSTL核心库的常用标签
1)<c:if test=””></c:if>
标签
其中test是返回boolean的条件
<!-- if判断 -->
<c:if test="true">
xxx
</c:if>
<c:if test="false">
123
</c:if>
<c:if test="true?true:false">
1=1
</c:if>
<!-- 此处的1=1不会输出,因为true?true:false三目判断是无用的,因为test里面只能接受true或者false,其他字符或者表达式都默认为false -->
2)<c:forEach></c:forEach>
标签
使用方式有两种组合形式:
方式1——for循环:
<c:forEach begin="从多少开始" end="到多少结束" var="每次循环的变量"></c:forEach>
对应: for( i=? ; i<>==? ; int i )
方式2——增强for:
<c:forEach items="objs" var="obj "></c:forEach>
对应: foreach(Object obj : objs)
注:标签中间是显示输出的数据,因此可以在标签中间加入html代码
1)遍历List<String>
的值
2)遍历List<User>
的值
3)遍历Map<String,String>
的值
4)遍历Map<String,User>
的值
5)遍历Map<User,Map<String,User>>
的值
entry.key—–User
entry.value——List
<!-- foreach方式1——普通for循环 -->
<c:forEach begin="0" end="5" var="i">
<br/>${i }
</c:forEach>
<br/>
<%
//List<String>
List<String> stringList = new ArrayList<String>() ;
stringList.add("zhangsan");
stringList.add("lisi");
stringList.add("wangwu");
request.setAttribute("stringList", stringList);
//List<User>
User user1 = new User() ;
user1.setUsername("zhangchi") ;
user1.setPassword("123");
User user2 = new User() ;
user2.setUsername("shige") ;
user2.setPassword("123");
User user3 = new User() ;
user3.setUsername("dashabi");
user3.setPassword("345") ;
List<User> userList = new ArrayList<User>();
userList.add(user1);
userList.add(user2);
userList.add(user3);
session.setAttribute("userList", userList);
//Map<String,String>
Map<String,String> stringMap = new HashMap<String,String>() ;
stringMap.put("name", "zhangsan");
stringMap.put("sex", "nan");
stringMap.put("eamil", "zhangsan@qq.com");
pageContext.setAttribute("stringMap", stringMap);
Map<String,User> userMap = new HashMap<String,User>();
userMap.put("user1",user1);
userMap.put("user2",user2);
userMap.put("user3",user3);
application.setAttribute("userMap", userMap);
%>
<!-- foreach方式2——增强for -->
<h1>遍历stringList的值</h1>
<c:forEach items="${stringList }" var="str">
str=${str }<br/>
</c:forEach>
<h1>遍历userList的值</h1>
<c:forEach items="${userList }" var="user">
user=${user.username }<br/>
</c:forEach>
<h1>遍历stringMap的值</h1>
<c:forEach items="${stringMap }" var="map">
${map }<br/>
</c:forEach>
<h1>遍历userMap的值</h1>
<c:forEach items="${userMap }" var="usermap">
${usermap.value.username }<br/>
</c:forEach>
三、javaEE的开发模式
1.什么是模式
模式在开发过程中总结出的“套路”,总结出的一套约定俗成的设计模式
2.javaEE经历的模式
model1模式:
技术组成:jsp+javaBean
model1的弊端:随着业务复杂性 导致jsp页面比较混乱
model2模式
技术组成:jsp+servlet+javaBean
model2的优点:开发中 使用各个技术擅长的方面
servlet:擅长处理java业务代码
jsp:擅长页面的现实
MVC:—- web开发的设计模式
M:Model—模型 javaBean:封装数据
V:View—–视图 jsp:单纯进行页面的显示
C:Controller—-控制器 Servelt:获取数据–对数据进行封装–传递数据– 指派显示的jsp页面
3.javaEE的三层架构
服务器开发时 分为三层
web层:与客户端交互
service层:复杂业务处理
dao层:与数据库进行交互
开发实践时 三层架构通过包结构体现
MVC与三层架构有什么关系?
javaEE三层架构+MVC
web层:收集页面数据,封装数据,传递数据,指定响应jsp页面
service层:逻辑业务代码的编写
dao层:数据库的访问代码的编写