一、JSP
(一)JSP指令
<%@ 指令名称 属性名1=属性值1 属性名2=属性值2 ... %>
用于配置JSP,导入资源文件。
1.page,配置JSP页面
例:<%@ page import=“java.util.ArrayList” %>
- contentType:等同于response.setContentType()
- import:导包
- errorPage:页面异常后跳转至错误页面
- isErrorPage:标识当前页面是否错误页面(true,可以使用内置对象exception)
2.include,导入页面的资源文件
例:<%@include file=“top.jsp”%>
3.taglib,导入资源库
例:<%@ taglib prefix=“c” uri=“http://java.sun.com/jsp/jstl/core” %>
(二)JSP注释
html注释:<!-- -->
,仅适用于html代码段
jsp注释:<%-- --%>
,推荐使用,适用于所有代码段
(三)JSP内置对象,重要!
变量名 | 真实类型 | 描述 |
---|---|---|
pageContext | PageContext | 当前页面共享数据,还可以获取其他八个内置对象 |
request | HttpServletRequest | 一次请求访问的多个资源(转发) |
session | HttpSession | 一次会话的多个请求间 |
application | ServletContext | 所有用户间共享数据 |
response | HttpServletResponse | 响应对象 |
page | Object | 当前页面(Servlet)的对象 this |
out | JspWriter | 输出对象,数据输出到页面上 |
config | ServletConfig | Servlet的配置对象 |
exception | Throwable | 异常对象 |
二、MVC开发模式
(一)JSP演变历史
- 早期,仅有servlet,只能使用response输出标签数据,比较麻烦
- 后来,出现JSP,简化了servlet开发,但过度使用jsp会造成java+html的混乱,难以维护和协作
- 现在,使用java的web开发,借鉴MVC开发模式,比较合理
(二)MVC
- M:Model,模型,通常指代JavaBean
- V:View,视图,通常指代jsp,用来展示数据
- C:Controller,控制器,用来获取用户的输入,调用模型,并将数据传递至视图进行展示
(三)优缺点
- 优点:程序耦合性低,方便维护,有利于分工协作,代码/模块重用性高
- 缺点:使项目架构变的复杂,对开发人员要求更高
三、EL表达式
(一)概念
Expression Language,表达式语言,替换和简化JSP中java代码的编写。
(二)语法及注意项
语法:${表达式}
注意项:JSP默认支持EL表达式,如果要忽略EL表达式,需设置page指令isELIgnored=“true”,忽略所有EL表达式。
(三)使用方式
1.运算
(1)算术运算符:+ - * / %
(2)比较运算符:> < >= <= == !=
(3)逻辑运算符:&& || !
(4)空运算符:empty
${empty list}
,判断字符串、集合、数组对象是否为null或者长度为0${not empty str}
,表示判断字符串、集合、数组对象是否不为null 并且 长度>0
2.获取值
EL表达式只能从域对象中获取值;
语法:${域名称.键名}
- pageScope --> pageContext
- requestScope --> request
- sessionScope --> session
- applicationScope --> application(ServletContext)
注意,${键名称}表示依次从最小到最大的域对象中查找是否有对应的值,直到找到为止,如果不存在则返回null。
3.获取对象、List、Map的值
对象:${域名称.键名.属性名}
,本质会调用对象的getter()方法。
List:${域名称.键名[索引]}
Map:${域名称.键名.key名称}
/${域名称.键名["key名称"]}
四、JSTL
(一)概念
Java Server Pages Standarded Tag Library,JSP标准标签库,是由Apache组织提供的开源JSP标签,用于简化和替换JSP页面上的java代码。
使用步骤:
- 导入JSTL相关的jar包
- 引入标签库:<%@ taglib prefix=“c” uri=“http://java.sun.com/jsp/jstl/core” %>
- 使用标签
(二)JSTL标签
1.if
语法:<c:if test="[布尔表达式]">内容</c:if>
test属性接受true/false,一般情况下会结合EL表达式使用,注意,if标签没有else,如果需要else需额外定义一个if标签。
<c:if test="${not empty list}">
list集合非空!
</c:if>
2.choose
相当于java代码的switch语句。
- choose标签等价于switch
- when标签等价于case
- otherwise标签等价于default
<%
request.setAttribute("number",7);
%>
<c:choose>
<c:when test="${number==1}">星期一</c:when>
<c:when test="${number==2}">星期二</c:when>
<c:when test="${number==3}">星期三</c:when>
<c:when test="${number==4}">星期四</c:when>
<c:when test="${number==5}">星期五</c:when>
<c:when test="${number==6}">星期六</c:when>
<c:when test="${number==7}">星期日</c:when>
<c:otherwise>number有误</c:otherwise>
</c:choose>
3.foreach
相当于java代码的foreach语句。
循环代码:
<%--
begin:开始值
end:结束值
var:临时变量
step:步长
varStatus:循环状态对象
index:容器中元素的索引,从0开始
count:循环次数,从1开始
--%>
<c:forEach begin="1" end="10" var="i" step="1" varStatus="s">
${i}==>${s.index}===>${s.count}<br/>
</c:forEach>
遍历代码:
<%--
items:容器对象
var:容器中元素的临时变量
varStatus:循环状态对象
index:容器中元素的索引,从0开始
count:循环次数,从1开始--%>
<c:forEach items="${list}" var="str" varStatus="s">
${s.index}==>${s.count}==>${str}<br/>
</c:forEach>
五、三层架构
- 界面表示层:用户看的界面。用户可以通过界面上的组件和服务器进行交互
- 业务逻辑层:处理业务逻辑
- 数据访问层:操作数据存储文件