# 今日内容 :
1. JSP :
(1. 指令
(2. 注释
(3. 内置对象
2. MVC 开发模式
3. EL 表达式
4. JSTL 标签
5. 三层架构
## JSP :
1. 指令
* 作用 :用于配置JSP页面,导入资源文件
* 格式 :
<%@ 指令名称 属性名1=属性值1 ... %>
* 分类 :
(1. page :配置jsp页面的
* ContextType : 等于 response.setContextType()
a. 设置响应体的mime类型以及字符集
b. 设置当前jsp页面的编码 (只能是高级开发 工具ide才能生效,如果使用低级,则需要设置pageEncoding属性设置)
* import 导包
* errorPage :当前页面发生异常后,会自动跳转到指定页面
* isErrorPage :标识当前页面是否是错误页面
a. true :是,可以使用内置对象exception
b. false :否 。默认值,不可使用
(2. include : 页面包含的, 导入页面的资源文件 (不常用)将资源中的其他jsp页面包含进该jsp页面
(3. taglib : 导入资源,引入标签库,如jstl标签库
* <%@taglib prefix="" uri="" %>>
* prefix : 前缀,自定义的
2. 注释 :
(1. html注释 :
<!-- --> :只能注释html代码片段
(2. jsp注释 :
<%-- --%> : 可以注释所有
3. 内置对象
* 在JSP页面中不需要创建,直接使用 的对象
* 一共有9个 :(前4个为域对象)
变量名 真实类型 作用
* pageContext PageContext 当前页面共享数据 ——可以获取其他的八个对象
* request HttpServletRequest 一次请求访问的多个资源(转发)
* session HttpSession 一次会话的多个请求(重定向)
* application ServletContext 所有用户间共享数据 (服务器开启被创建,服务器关闭被销毁)
* response HttpServletResponse 响应对象
* page Object 当前页面(Servlet)的对象 this
* out JspWriter 输出对象,数据输出到页面上
* config ServletConfig Servlet的配置对象
*exception Throwable 异常对象
## MVC : 开发模式
1. JSP演变历史
(1. 早期只有Servlet,只能使用resonse 输出标签数据,非常麻烦
(2. 后来有jsp,简化了Servlet的开发,如果过度使用jsp,在jsp中既写大量的Java代码,又写html标签,造成难以维护,难以分工写作。
(3. 再后来,Java web的开发,借鉴mvc开发模式,使得程序的设计更加合理性。
2. MVC :
(1. M : Model ,模型 —— JavaBean
* 完成具体的业务操作,如 :查询数据库,封装对象
(2. V : View ,视图 —— JSP
* 展示数据
(3. C : Controller ,控制器 —— Servlet
* 获取用户的输入
* 调用模型
* 将数据交给视图层展示
* 优缺点 :
a. 优点 :
(1. 耦合性低 :方便维护,可以利于分工协作
(2. 重用性高 :
b. 缺点 :
(1. 使得项目架构变得复杂,对开发人员要求较高。
## EL表达式 :
1. 概念 :Expression Language : 表达式语言
2. 作用 : 替换和简化jsp页面中java代码的编写
3. 语法 : $P{表达式}
4. 注意 :
* JSP默认是支持EL表达式的。如果要忽略EL表达式
(1. 设置jsp中page指令中 : isELIgnored="true" 。忽略当前jsp页面中所有的el表达式
(2. \${表达式} :忽略当前这个el表达式
5. 使用 :
(1. 运算 :
* 运算符 :
a. 算数运算符 : + - * / (div) %(mod)
b. 比较运算符 : > < >= <= != ==
c. 逻辑运算符 :&& (and) ||(or) !
d. 空运算符 : empty
* 功能 : 用于判断字符串、集合、数组对象是否为null 并且长度是否为 0
* ${empty list} : 判断字符串、集合、数组对象是否为null 或者 长度 为 0
* ${not empty list} : 表示判断字符串、集合、数组对象是否不为null,并且长度 >0
(2. 获取值
a. el 表达式只能从域对象中获取值
b. 语法 :
1.${域名称.键名} : 从指定域中获取指定键的值
* 域名称 :
(1. pageScope --> pageContext
(2. requestScope --> request
(3. sessionScope --> session
(4. applicationScope --> application(ServletContext)
* 举例 :在request 域中存储了 name = 张三
* 获取 : ${requestScope.name}
2. ${键名} : 表示依次从最小的域中查找是否有该键对应的值,直到找到为止。
${name}
3. 获取对象 、List集合 、Map集合的值
(1.对象 :${域名称.键名.属性名}
* 本质上会调用对象的getter方法
注意 :通过对象的属性来获取
* setter或getter 方法 ,去掉set 或 get ,将剩余部分,首字母变小写
* setName --> Name --> name
(2. List 集合 :${域名称.键名[索引]}
(3. Map集合 : ${域名称.键名.key} ${域名称.键名["key名称"]}
${requestScope.m.age}<br>
${m["age"]
(3. 隐式对象 :
* el表达式中有11个隐式对象 :
* pageContext :
* 获取jsp其他8个内置对象
* ${pageContext.request.contextPath} : 动态获取虚拟目录
## JSTL
1.概念 : JavaServer Pages Tag Library JSP标准标签库
* 是由Apache组织提供的开源的免费的jsp标签
2. 作用 : 用于简化和替换jsp页面的Java代码
3. 使用步骤 :
(1. 导入jstl相关的jar包 ( javax.servlet.jsp.jstl.jar jstl-impl.jar)
(2. 引入标签库 : taglib 指令 :<%@ taglib uri = "" prefix = "" %>
(3. 使用标签
4. 常用的JSTL标签
(1. if : 相当于Java代码的if语句
* c:if 标签
1. 属性 :
* test :必须属性,接收Boolean的表达式
* 如果表达式为 true ,则显示if标签的内容,如果为false ,则不显示标签体内容
* 一般情况下,test属性值会结合el表达式一起使用
2.注意 :c:if 没有else情况,想要else情况,则可以在定义一个c:if 标签
<%@ page import="java.util.List" %>
<%@ page import="java.util.ArrayList" %>
<%@ page import="org.w3c.dom.ls.LSInput" %>
<%@ page import="jdk.nashorn.internal.ir.LiteralNode" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<%--
c:if 标签
1. 属性 :
* test :必须属性,接收Boolean的表达式
* 如果表达式为 true ,则显示if标签的内容,如果为false ,则不显示标签体内容
* 一般情况下,test属性值会结合el表达式一起使用
2.注意 :c:if 没有else情况,想要else情况,则可以在定义一个c:if 标签
--%>
<c:if test="true">
<h1>我是真 .....</h1>
</c:if>
<%
//判断request 域中的一个list集合是否为空,如果不为null则显示遍历集合
List list = new ArrayList();
list.add("aaa");
request.setAttribute("list",list);
request.setAttribute("num",3);
%>
<c:if test="${not empty list}">
遍历集合
</c:if>
<c:if test="${num % 2 != 0}">
${requestScope.num}为奇数
</c:if>
</body>
</html>
(2. choose :相当于 switch
(3. foreach :相当于Java代码的for 循环
a. 完成重复的操作
for (int i = 0; i < 10; i++) {
}
* 属性 :
begin :开始值
end :结束值
var : 临时变量
step :步长
varstatus : 循环状态对象
index :容器中元素的索引从0开始
count : 循环次数
b. 遍历容器
List<User> list;
for (User user: list ) {
}
* 属性 :
items :容器对象
var : 容器中元素的临时变量
varStatus : 循环状态对象
index :容器中元素的索引从0开始
count :循环次数\
<%@ page import="java.util.List" %>
<%@ page import="java.util.ArrayList" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>>
<html>
<head>
<title>foreach</title>
</head>
<body>
<%--
foreach :相当于Java代码的for语句
1. 完成重复的操作
for (int i = 0; i < 10; i++) {
}
* 属性 :
begin :开始值
end :结束值
var : 临时变量
step :步长
varstatus : 循环状态对象
index :容器中元素的索引从0开始
count : 循环次数
2. 遍历容器
List<User> list;
for (User user: list ) {
}
* 属性 :
items :容器对象
var : 容器中元素的临时变量
varStatus : 循环状态对象
index :容器中元素的索引从0开始
count :循环次数
--%>
<c:forEach begin="1" end="10" var="i" step="1">
${i}<br>
</c:forEach>
<hr>
<%
List list = new ArrayList();
list.add("aaa");
list.add("bbb");
list.add("ccc");
request.setAttribute("list",list);
%>
<c:forEach items="${list}" var="l" varStatus="s">
${l}<br>
${s.index}<br>
${s.count}<br>
</c:forEach>
</body>
</html>
# 练习 :
* 需求 :在request域中有一个存有User对象的List集合,需要使用jstl + el 将 list集合中的数据展示到jsp 页面的表格table 中
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page import="java.util.List" %>
<%@ page import="java.util.ArrayList" %>
<%@ page import="com.zhulin.entity.User" %>
<%@ page import="javax.xml.crypto.Data" %>
<%@ page import="java.util.Date" %>
<%@ page import="sun.util.calendar.BaseCalendar" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>jstl_test</title>
</head>
<body>
<%
List<User> list = new ArrayList();
list.add(new User("张三",new Date(),"female"));
list.add(new User("李四", new Date(), "male"));
list.add(new User("王五", new Date(), "male"));
request.setAttribute("list",list);
%>
<table border="1" width="500" align="center">
<tr>
<th>编号</th>
<th>姓名</th>
<th>生日</th>
<th>性别</th>
</tr>
<%--数据行--%>
<c:forEach items="${requestScope.list}" var="user" varStatus="s">
<%--表格集数行为red--%>
<c:if test="${s.count % 2 != 0}">
<tr bgcolor="red">
<td>${s.count}</td>
<td>${user.name}</td>
<td>${user.birStr}</td>
<td>${user.gender}</td>
</tr>
</c:if>
<%--表格偶数行 green--%>
<c:if test="${s.count % 2 == 0}">
<tr bgcolor="green">
<td>${s.count}</td>
<td>${user.name}</td>
<td>${user.birStr}</td>
<td>${user.gender}</td>
</tr>
</c:if>
</c:forEach>
</table>
</body>
</html>