一 、JSP
1.1 jsp简介
1.1.1 jsp概念
- jsp几点特征
- 跨平台
- 业务代码相分离
- 组件重用
- 预编译
1.2 jsp的执行流程
- 总结:
- jsp能够编写html代码,本质上是因为底层用的servlet直接输出
- jsp之所以能够直接是用request对象,是因为编写的代码全部落入了service 内部,在service内部,已经声明了request,response,session,application等对象。
1.3 jsp的基本语法
1.3.1 jsp基本文件
jsp的注释不会显示在源码上,更加安全,所以在jsp页面中推荐使用jsp注释
1.3.2 jsp中书写java代码的三种方式
1.3.2.1 脚本片段
格式:<%java代码片段%>
作用: 在jsp翻译后的_JSPService方法中,潜入java代码
代码:
<% for(int j = 0 ; j < 5 ;j++){%>
Hello World!!!<br>
<%}%>
效果:
1.3.2.2 脚本声明
格式: <%!脚本声明格式%>
作用: 在类的成员位置上声明方法和变量
1.3.2.3 脚本表达式
格式: <%=表达式%>
作用: 代替response向页面输出内容
二、 EL表达式
作用: 代替jsp中脚本表达式的功能,简化对java代码的操作。
2.1EL表达式的格式和作用
- 格式: ${ 表达式内容}
- 作用: 主要是从域对象中查找指定数据。
代码1:
<h3>获取域中的简单数据</h3>
<%
pageContext.setAttribute("pkey","pvalue");
request.setAttribute("rkey","rvalue");
session.setAttribute("skey","svalue");
application.setAttribute("akey","avalue");
request.setAttribute("aa.bb","bbcds");
%>
2.1.1 简单查找
以代码1为准备数据:
获取pageContext域中的数据: <br>
老方式: <%=pageContext.getAttribute("pkey")%> <br>
EL方式:${pageScope.pkey}
2.1.2 获取域中的复杂数据(复杂查找)
准备数据(代码2):
<%
//向域中存放数组
request.setAttribute("arr",new String[]{"杨玉环","貂蝉","王昭君","西施","吾王"});
//向域中存放list
ArrayList<String> list = new ArrayList();
//添加数据
list.add("栗山未来");
list.add("时崎狂三");
list.add("五河琴里");
request.setAttribute("list",list);
//向域中存放MAP
HashMap<String, String> map = new HashMap<>();
map.put("name","Saber");
map.put("age","18000");
request.setAttribute("map",map);
//向域中存放实体
User user = new User("Archer", "男", 1500);
request.setAttribute("user",user);
%>
2.1.2.1 方式1:获取数组,list集合中的元素
格式: ${属性名称[index]}
获取域中的数组: <br>
EL方式 : ${arr[4]}
2.1.2.2 方式2:获取map集合中的值
格式: ${属性名称.key}
获取域中的map: <br>
EL方式 :${map.name}--- ${map.age}
2.1.2.3 方式3:获取实体中的值
格式: ${属性名称.实体中的属性名}
获取域中的实体: <br>
老方式:
<%=((User)request.getAttribute("user")).getName()%>
<%=((User)request.getAttribute("user")).getAge()%>
<%=((User)request.getAttribute("user")).getSex()%> <br>
EL方式: ${user.name}--${user.age}--${uer.sex}
2.2 EL执行运算
EL中的算数运算,逻辑运算与java中基本一致,下面仅说明两者不一致的地方。
2.2.1 算数运算符
准备数据:
request.setAttribute("a",3);
request.setAttribute("d","d");
```
**+(加号):**
```java
a+d=${a+d} <%-- + 只能数值相加,不能字符串拼接,否则会报错--%>
2.2.2 逻辑运算符
注意: 逻辑运算符中的异或“^”,EL不支持!
2.2.3 empty运算符
empty运算符是用来判断获取的数据是否为空,或者当前获取的集合,是否没有任何数据。为空,则返回true。
三 、 JSTL
3.1 ForEeach
格式:
<c:forEach items="${list}" var=“L”>
${L}
</c:forEach>
1. var:在不循环对象的时候,保存的是控制循环的变量;在循环对象的时候,保存的是被循环对象中的元素
2. items:指定要循环的对象
3. varStatus:保存了当前循环过程中的信息(循环的开始、结束、步长、次数等)
4. begin:设置循环的开始
5. end:设置循环的结束
6. step:设置步长——间隔几次循环,执行一次循环体中的内容
准备数据(代码3):
<%
//向域中存放list
ArrayList<String> list = new ArrayList();
//添加数据
list.add("栗山未来");
list.add("时崎狂三");
request.setAttribute("list",list);
//向域中存放MAP
HashMap<String, String> map = new HashMap<>();
map.put("name","Saber");
map.put("age","18000");
request.setAttribute("map",map);
//向域中存放实体
List<User> userList = new ArrayList<User>();
userList.add(new User("大熊","女",39));
request.setAttribute("userList",userList);
%>
代码查找:
- 查找list集合元素
<c:forEach items="${list}" var="L">
${L}
</c:forEach>
2.查找map集合元素
<c:forEach items="${map}" var="M">
${M.key}----${M.value}
</c:forEach>
- 查找userList数据
<c:forEach items="${userList}" var="user" >
${user.name}-${user.sex}-${user.age}
</c:forEach>
3.2 if标签
属性名 | 是否支持EL | 属性类型 | 属性描述 |
---|---|---|---|
test | true | Boolean | 决定是否处理标签体中的内容条件表达式 |
var | false | String | 用于指定将test属性的执行结果保存到某个web域中的某个属性的名称 |
scop | false | String | 指定将test属性的执行结果保存到哪个web域中 |
test:判断是否执行标签体中的内容(true:执行)
var:用来保存testy属性的结果,并保存到指定容器中。
scope:指定保存数据的容器。
四、MVC和三层架构
4.1 MVC设计模式
M:model模型
- 封装数据—JavaBean
- 主要封装数据,业务处理
V:view视图: - 页面展示—jsp
- 作用:页面展示
C:controller 控制器: - 控制执行流程 —servlet
- 作用:与客户端交互
注意: MVC不是java特有的,现在几乎所有的B/S结构的软件都采用了MVC设计模式。
4.1.2 JSP Model2
Model2使用到的技术有:Servlet、JSP、JavaBean。Model2 是MVC设计模式在Java语言的具体体现。
-
JSP: 视图层,用来与用户打交道。负责接收用来的数据,以及显示数据给用户;
-
** Servlet:** 控制层,负责找到合适的模型对象来处理业务逻辑,转发到合适的视图;
-
JavaBean: 模型层,完成具体的业务工作,例如:转账等。
4.2三层架构
- 表示层: 也称web层,与浏览器进行数据交互的
- 业务逻辑层: 也称service层,专门用于处理业务逻辑的
- 数据访问层: 也称dao层,与数据库进行数据交换。将数据库的一条记录与JavaBean进行对应。