JavaWeb学习笔记——JSP
JSP (Java Server Pages)
JSP全称Java Server Pages(Java服务器页面),是一种动态网页开发技术。它使用JSP标签在HTML网页中插入Java代码。标签通常以<%
开头以%>
结束
JSP可以理解为一个特殊的页面,其中可以定义HTML标签和Java代码,用于简化书写
JSP原理
- 服务器解析请求消息,寻找是否存在
index.jsp
资源 - 如果寻找到
index.jsp
,会将index.jsp
转换为.java
文件 - 编译
.java
文件并生成.class
字节码文件 - 最后由字节码文件提供访问
JSP本质上是一个Servlet
JSP脚本
JSP用来定义Java代码的方式
① <% Java代码 %>:定义的Java代码在service
方法中,service方法中可以定义的内容均可以在这里定义
② <%! Java代码 %>:定义的Java代码在JSP装换的Java类中的成员
位置,可以定义成员变量,成员方法等
③ <%= Java代码 %>:定义的Java代码会输出到页面上,可以定义输出语句内的内容
JSP内置对象
在JSP页面中不需要创建获取,可以直接使用的对象
变量名 | 真实类型 | 作用 |
---|---|---|
request | HttpServletRequest | 请求对象 |
response | HttpServletResponse | 响应对象 |
out | JspWriter | 输出流对象,与response.getWriter()相似 |
pageContext | pageContext | 当前页面共享数据,还可以获取其他8个内置对象 |
session | HttpSession | 一次会话的多个请求件共享数据 |
application | ServletContext | 所有用户之间共享数据 |
page | Object | 当前页面对象 |
config | ServletConfig | Servlet的配置对象 |
exception | Throwable | 异常对象 |
response.getWriter() 和 out 的区别
<body>
<%
response.getWriter().write("this is response");
%>
<%
out.print("this is out");
%>
</body>
以上代码定义了两个JSP脚本用来输出内容到页面,正常情况下,程序应当按照顺序执行,即先执行response输出再执行out输出,输出结果也证明了这一点
如果我们将两个脚本换一下位置
<body>
<%
out.print("this is out");
%>
<%
response.getWriter().write("this is response1");
%>
</body>
这时按照正常思路,应当先执行out输出,再执行response输出,然而输出结果却依然是先执行了response输出
这是因为在tomcat服务器给客户端做出响应之前,会先从response缓冲区中寻找数据,再去out缓冲区中寻找数据,所以response.getWriter()
的输出永远在out
之前
JSP指令
用于配置JSP页面,导入资源文件
JSP指令格式
<%@ 指令名称 属性名1=属性值1 属性名2=属性值2 %>
多个属性之间用
空格
隔开
JSP指令分类
include:导入页面的资源文件
属性
· file:要导入的页面资源文件
page:配置JSP页面
属性
① contentType:等同于response.setContentType()
,可以设置响应体的MIME类型以及字符集,和当前JSP页面的编码(仅限高级IDE)
② pageEncoding:设置当前JSP页面的编码
③ buffer:设置缓冲区大小
④ import:导入包
⑤ errorPage:当前页面发生异常后会自动跳转到指定的错误页面
⑥ isErrorPage:标识当前页面是否为错误页面,默认为false
若标注当前页面为错误页面,则可以使用内置对象exception
taglib:导入资源
① prefix:自定义前缀
② uri:导入资源的位置
JSP注释
HTML注释
<!-- -->
HTML注释只能注释HTML代码片段
JSP注释
<%-- --%>
可以注释所有内容
MVC开发模式
M:Model,即模型,用来完成具体的业务操作 ——JavaBean
V:View,即视图,用来展示数据——JSP
C:Controller,即控制器,用来获取请求参数,调用模型,将数据交给视图来展示——Servlet
EL表达式
Expression Language 表达式语言,可以替换和简化JSP中Java代码的书写
EL表达式语法
${ 表达式 }
JSP中是默认支持EL表达式的,如果不希望JSP解析EL表达式,可以使用两种方法
- 设置
page
指令中的isElIgnored
为true
,设置之后JSP中的所有EL表达式都会被忽略 - 在EL表达式之前添加
\
——\${}
可以忽略单个EL表达式
EL运算符
算数运算符
运算符 | 描述 |
---|---|
+ | 加法 |
- | 减法 |
* | 乘法 |
/ (div) | 除法 |
% (mod) | 取余 |
<body>
<h4>算数运算符</h4>
${1 + 1}<br>
${2 - 1}<br>
${4 / 2}<span>等同于</span>${4 div 2}<br>
${5 % 3}<span>等同于</span>${5 mod 3}<br>
</body>
显示结果为
算数运算符
2
1
2.0等同于2.0
2等同于2
比较运算符
运算符 | 描述 |
---|---|
> | 大于 |
< | 小于 |
>= | 大于等于 |
<= | 小于等于 |
== | 等于 |
!= | 不等于 |
<body>
<h4>比较运算符</h4>
${1 > 2}<br>
${3 < 5}<br>
${3 == 3}<br>
${3 != 3}<br>
</body>
显示结果为
比较运算符
false
true
true
false
逻辑运算符
运算符 | 描述 |
---|---|
&& (and) | 与运算 |
|| (or) | 或运算 |
! (not) | 非 |
<body>
<h4>逻辑运算符</h4>
${true && false}<span>等同于</span>${true and false}<br>
${true || false}<span>等同于</span>${true or false}<br>
${!true}<span>等同于</span>${not true}<br>
</body>
显示结果为
逻辑运算符
false等同于false
true等同于true
false等同于false
空运算符
运算符 | 描述 |
---|---|
empty | 判断字符串,集合,数组的对象是否为null、长度是否为0 |
<body>
<%
List list = new ArrayList();
String str = "123";
request.setAttribute("List",list);
request.setAttribute("String",str);
%>
${empty List}
${empty String}
</body>
显示结果为
true false
EL获取域中的值
EL表达式只能从域对象中获取值
EL取值语法
- ${域名称.键名} 从指定的域中获取指定键的值
域名称 | 获取值的对象 |
---|---|
pageScope | pageContext |
requestScope | request |
sessionScope | session |
applicationScope | application(ServletContext) |
<body>
<%
// 存储数据
request.setAttribute("request","msgR");
session.setAttribute("session","msgS");
pageContext.setAttribute("page","msgP");
application.setAttribute("application","msgA");
%>
<p>获取值</p>
${requestScope.request}
${sessionScope.session}
${pageScope.page}
${applicationScope.application}
</body>
显示结果
获取值
msgR msgS msgP msgA
- ${键名}
在这中写法下,会从最小域开始依次寻找指定键名的对应值,直到寻找到为止
<body>
<%
// 存储数据
request.setAttribute("request","msgR");
session.setAttribute("msg","msgS");
pageContext.setAttribute("msg","msgP");
application.setAttribute("application","msgA");
%>
<p>获取值</p>
${msg}
</body>
显示结果
获取值
msgP
由于pageContext
域对象的范围要小于session
,所以当找到ageContext
中的对应值后即会输出,若希望使用session
中的对应值,则需要添加域名称
EL获取对象值
${域名称.键名.属性名}
本质上会调用对象对应属性的getter方法
示例代码
<body>
<%
Person p = new Person();
p.setName("Person");
p.setAge(20);
p.setSex("M");
request.setAttribute("Person",p);
%>
<p>获取对象值</p>
${requestScope.Person}
</body>
若直接获取对象,则会将对象的地址值输出出来
获取对象值
domain.Person@13adae1
若希望获取对象的详细值,则需要通过对象的属性
来获取
对象的属性
指的是,在getter
和setter
中,去掉get
或set
,然后将剩下的内容首字母变小写,得到的内容则为对象的属性
在示例代码中,Person类存在一个setName()
方法,以此为例
方法名 | 去掉get或set | 属性名 |
---|---|---|
setName | Name | name |
即Person类存在一个属性为name
,可以通过这个属性来获取Person的name值
${requestScope.Person.name}
输出结果为
获取对象值
Person
EL获取List中的值
${域名称.键名[索引]}
<body>
<%
List list = new ArrayList();
list.add("a");
list.add("b");
list.add("c");
request.setAttribute("List",list);
%>
<p>获取List值</p>
${requestScope.List}
</body>
若直接获取List,则会输出List的所有内容
获取List值
[a, b, c]
通过添加索引可以获取List中指定的内容
${requestScope.List[0]}
获取List值
a
如果出现下标越界的情况,EL表达式会直接输出空字符串而不会报错
若List中存储了一个对象,通过索引和属性也可以输出对象的具体属性值
<body>
<%
Person p = new Person();
p.setName("P");
List list = new ArrayList();
list.add("a");
list.add("b");
list.add("c");
list.add(p);
request.setAttribute("List",list);
%>
<p>获取List值</p>
${requestScope.List[3].name}
</body>
输出结果为
获取List值
P
EL获取Map中的值
${域名称.键名.key}
${域名称.键名["key"]}
<body>
<%
Map map = new HashMap();
map.put("name","name");
map.put("age",20);
request.setAttribute("Map",map);
%>
<p>获取Map值</p>
${requestScope.Map.name}
${requestScope.Map["age"]}
</body>
输出结果为
获取Map值
name 20
同样的,如果Map中也存放了对象,同样可以使用key和属性名来获取对象的属性值
JSTL
JavaServer Page Tag Library JSP标准标签库
由Apache提供的开源JSP标签,用于简化和替换JSP中的Java代码
步骤
- 导入JSTL jar包
- 使用
taglib
指令引入标签库
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
- 使用标签
常用的JSTL标签
① if
相当于Java中的
if
语句
属性
test:必须属性,接受boolean表达式,如果表达式为true
则显示内容,为false
则不显示内容
<body>
<c:if test="true">
显示内容
</c:if>
<c:if test="false">
不显示内容
</c:if>
</body>
一般情况下,test的属性值会结合EL表达式一起使用
② choose
相当于Java中的
switch
语句
相关标签
① when :相当于case
② otherwise:相当于default
<body>
<%
request.setAttribute("num",5);
%>
<c:choose>
<c:when test="${num == 3}">3</c:when>
<c:otherwise>other</c:otherwise>
</c:choose>
</body>
输出结果为 other
③ foreach
相当于Java中的
for
语句
属性
begin:起始值
end:结束值
var:临时变量
step:步长
varStatus:循环状态对象,存在属性index
—索引,count
—循环次数
iteam:容器对象
作用
- 完成重复操作,如
for(int i = 1; i <= 5; i++){
System.out.print("1");
}
JSTL实现
<body>
<c:forEach begin="1" end="5" var="i" step="1">
1
</c:forEach>
</body>
- 遍历,如
for(int i : array){
System.out.print(i);
}
JSTL实现
<body>
<%
int[] array = {1,2,3,4,5};
request.setAttribute("array",array);
%>
<c:forEach items="${array}" var="i">
${i}
</c:forEach>
</body>
三层架构
三层架构是一种软件设计架构,为了符合“高内聚,低耦合”思想
界面层(表示层 / web层)
用户看到的界面,用户可以通过界面上的组件和服务器进行交互,接受用户参数,封装数据,调用业务逻辑层
业务逻辑层(service层)
用来处理业务逻辑,组合DAO层中的简单方法,形成复杂功能(业务逻辑操作)
数据访问层(操作层 / DAO层)
用来操作数据,存储文件,只定义了对于数据库最基本的CRUD操作
评论