文章目录标题
1 JSP技术
1.1 概念
Java Server Pages: java 服务器端⻚⾯
原理: demo6.jsp 翻译成 demo6_jsp.java(间接继承HttpServlet),
再编译成 demo6_jsp.class, 最后由响应写出到客户端作为html显示
翻译后的java文件在work文件夹中, 修改jsp需要刷新页面才能重新翻译
jsp java
html元素 out.write("html元素")
<%%> service方法中的java代码
<%=表达式%> out.print(表达式);
<%!类的成员 %> 类的成员
原理:JSP本质上就是⼀个Servlet
JSP在第⼀次被访问时会被Web容器翻译成servlet,再执⾏,过程:
第⼀次访问 → helloServlet.jsp → helloServlet_jsp.java → 编译运⾏
PS:被翻译后的servlet在 Tomcat 的 work ⽬录中可以找到。
1.2 JSP脚本和注释
脚本: <%java代码%>
<%=表达式%>
<%!类的成员 %>
注释: //java注释(java脚本中) jsp中可见, java中可见
<!--html注释--> jsp中可见, java中可见, html可见
<%-- jsp注释 --%> jsp中可见
1.3 JSP指令
指令: <%@指令 %>
page: language - 只支持java
extends
isELIgnored - 是否忽略EL表达式,false-不忽略
errorPage - 相当于出现异常后转发
include: 静态页面包含 file="服务器端path"
特点: 被包含的页面[demo7]不会翻译成java文件, 直接将内容嵌
入包含页面[demo6]中
taglib: 引入标签库[类库] url="类库地址" prefix="前缀"
1.4 JSP的内置对象
在jsp⻚⾯中不需要获取和创建,可以直接使⽤的对象。
JSP⼀共有9个内置对象:
内置对象:
参数: request, response, config
域对象: application, session(session=true), pageContext
输出: out - JspWriter(自带8kb缓冲区,关闭缓冲区 buffer=none)
异常: exception(isErrorPage=true)
自己: page
pageContext:
作用1: 作为域对象使用, 可以操作其他三个域对象
作用2: 可以获得其他8个内置对象 getXXX()
作用3: findAttribute(name)
1. out对象
out的类型:JspWriter
out作⽤就是向客户端输出内容,⽅法:out.write()
out缓冲区默认8kb【buffer="8kb"】,可以设置成0,代表关闭out缓冲区,内容将直接写到respons缓冲区
2. pageContext对象
JSP⻚⾯的上下⽂对象,作⽤如下:
1. pageContext是⼀个域对象,范围:当前⻚⾯
2. pageContext可以向指定的其他域中存取数据
setAttribute(String name, Object obj, int scope)
getAttribute(String name, int scope)
removeAttrbute(String name, int scope)
findAttribute(String name)
依次从pageContext域,request域,session域,application域中获取属性,在某个域中获取后将不在向后寻找。
四⼤作⽤域的总结:
page域:当前JSP⻚⾯范围
request域:⼀次请求
session域:⼀次会话
application域:整个web应⽤
3. 可以获得其他8⼤隐式对象
例如:pageContext.getRequest(),pageContext.getSession()等。
1.5 JSP标签(动作)
- ⻚⾯包含(动态包含):<jsp:include page=“被包含的⻚⾯”/>
- 请求转发:<jsp:forward page=“要转发的资源” />
思考:静态包含与动态包含的区别?
2 EL 技术
2.1 EL 表达式概述
概念:Expression Language 表达式语⾔,表达式可以嵌⼊在JSP⻚⾯内部。
作⽤:要替代和简化JSP⻚⾯中脚本的编写。
语法:${表达式}
注意:jsp默认⽀持el表达式的。如果要忽略el表达式
1. 设置jsp中page指令中:isELIgnored="true" 忽略当前jsp⻚⾯中所有的el表达式
2. \${表达式} :忽略当前这个el表达式
2.2 使⽤
2.2.1 运算
运算符
1. 算数运算符: + 、- 、* 、/(div) 、%(mod)
2. ⽐较运算符: > 、<、>、=、<=、==、!=
3. 逻辑运算符: &&(and)、||(or) 、!(not)
4. 空运算符: empty
功能:⽤于判断字符串、集合、数组对象是否为null或者⻓度是否为0
${empty list}:判断字符串、集合、数组对象是否为null或者⻓度为0
${not empty str}:表示判断字符串、集合、数组对象是否不为null
并且 ⻓度>0
2.2.2 获取值
el表达式只能从域对象中获取值
语法:
1. ${域名称.键名}:从指定域中获取指定键的值
域名称:
pageScope → pageContext
requestScope → request
sessionScope → session
applicationScope → application(ServletContext)
举例:在request域中存储了name=张三
获取:${requestScope.name}
2. ${键名}:表示依次从最⼩的域中查找是否有该键对应的值,直到找到为⽌。
等同于findAttribute(String name)
3. 获取对象、List集合、Map集合的值
1. 对象:${域名称.键名.属性名}
本质上会去调⽤对象的getter⽅法
2. List集合:${域名称.键名[索引]}
3. Map集合:
${域名称.键名.key名称}
${域名称.键名["key名称"]}
举例:
EL获得普通字符串
EL获得User对象的值
EL获得List<String>的值
EL获得List<User>的值
EL获得Map<String, String>的值
EL获得Map<String, User>的值
EL获得Map<String, List<User>>的值
2.2.3 隐式对象
el表达式中有11个隐式对象
pageScope、requestScope、sessionScope、applicationScope
获取JSP中域中的数据
param、paramValues
接收参数
等同于:request.getParameter()、request.getParameterValues()
header、headerValues
获取请求头信息
等同于:request.getHeader(name)
initParam
获取全局初始化参数
等同于:this.getServletContext().getInitParameter(name)
cookie
WEB开发中cookie
等同于:request.getCookies()、cookie.getName()、cookie.getValue()
**pageContext
可以获得其他⼋⼤对象
重点:${pageContext.request.contextPath}:动态获取虚拟⽬录**
3 JSTL 技术
3.1 JSTL 概述
JavaServer Pages Tag Library ,JSP 标准标签库,可以嵌⼊在JSP⻚⾯中使⽤标签的形式完成业务逻辑等功能。是由Apache组织提供的开源的免费的jsp标签。JSTL标准标准标签库有5个⼦库,但随着发展,⽬前常使⽤的他的核⼼库。
JSTL出现的⽬的同EL⼀样也是要替换和简化JSP⻚⾯中的脚本代码。
3.2 使⽤步骤
3.2.1 JSTL下载
从Apache的⽹站下载JSTL的JAR包。
进⼊jstl安装包 ⽹址下载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)。
3.2.2 使⽤步骤
3.3 常⽤的JSTL标签
3.3.1 <c:if test=" ">
if:相当于java代码的if语句
3.3.2 <c:forEach>
foreach:相当于java代码的for语句
使⽤⽅式有两种组合形式:
<%-- 1. 模拟:for (int i = 0; i <= 5; i++) { sout(i) } --%>
<%-- begin: 从⼏开始
end: 到⼏结束(包含)
var: 临时变量, 将现在循环的值 i 存⼊到了page域中
--%>
<c:forEach begin="0" end="5" var="i">
${i} <br>
</c:forEach>
<%-- 2. 模拟:String[] strList = {"lucy", "tom", "jack"};
for(String str : strList) { sout(str) }
--%>
<%-- items: 要遍历的集合或者数组
var: 遍历出来的每⼀个元素, 将这个元素存⼊到了page域中 起名为xx
varStatus: 记录当前遍历状态的对象, index-下标 count-序号
--%>
<c:forEach items="${strList}" var="str" varStatus="s">
${s.count} -- ${str} <br>
</c:forEach>
举例:
遍历List的值
遍历List的值
遍历Map<String, String>的值
遍历Map<String, User>的值
遍历Map<User, Map<String, User>>的值
4 JavaEE开发模式
4.1 MVC
4.2 JavaEE 三层架构
1. 界⾯层(表示层):也称web层,⽤户看的界⾯。⽤户可以通过界⾯上的组件和服务器进⾏交互。
2. 业务逻辑层:也称service层,处理业务逻辑的。
3. 数据访问层:也称dao层,操作数据存储⽂件,与数据库进⾏交互。
开发实践时,三层架构通过包结构体现。