目录
JSP是什么:
JSP是JAVAEE平台下的技术规范,它允许使用特定的标签在HTML代码中插入JAVA代码, 实现动态页面处理,所以JSP就是HTML与JAVA的结合体。JSP技术可以快速的实现一个页面的开发,相比使用Servlet实现页面开发轻松多了
JSP与Servlet的区别:
- JSP以源文件的形式部署容器中,而Servlet是需要将字节码文件部署到容器中
- JSP部署到web目录的根目录下或子目录下,而Servlet需要部署到WEB_INF/class目录中
- JSP中的HTML代码会被JSP引擎放入到Servlet的out.print()中,而在Servlet中我们需要自己通过响应字符输出流生成响应的页面
- JSP更擅长页面显示(HTML+JAVA),Servlet更擅长处理请求产生响应,也就是逻辑控制
JSP运行原理
JSP技术特点
JSP和Servlet是本质相同的技术。
当一个JSP文件第一次被请求时,JSP文件将会被加载为Servlet并执行这个Servlet,然后被容器缓存,如果JSP文件被修改了,JSP引擎会重新编译这个JSP
JSP引擎对JSP编译时会生成两个文件分别是.java的源文件以及编译后的.class文件,并放到Tomcat的work目录的Catalina对应的虚拟主机目录中的org\apache\jsp目录中。两个文件的名称会使用JSP的名称加”_jsp”表示。如:index_jsp.java、index_jsp.class
JSP标签:
JSP标签分为原始标签和指令标签
原始标签:
<%! %>声明标签:
声明标签用来定义成员变量或者方法,该标签被编译后会出现在对应Servlet类中的class{ }大括号中
例:
我们编写了一段JSP代码
在对应Servlet类中,就会出现我们编译的代码
<% %>脚本标签
脚本标签用于在JSP中编写业务逻辑。标签中的内容会出现在JSP被编译后的Servlet的_jspService方法体中。
<%= %>赋值标签
赋值标签用于在JSP中做内容输出。标签中的内容会出现在_jspService方法的out.print()方法的参数中。注意我们在使用赋值标签时不需要在代码中添加 ”;”。
指令标签:
page标签:
contentType
设置响应类型和编码。
pageEncoding
设置页面的编码。(页面显示)
import
导入所需要的包。
language
当前JSP页面里面可以嵌套的语言。
session
设置JSP页面是否获取session内置对象。
buffer
设置JSP页面的流的缓冲区的大小。
autoFlush
是否自动刷新。
exends
声明当前JSP的页面继承于那个类.必须继承的是httpservlet 及其子类。
isELIgnored
是否忽略el表达式。
errorPage
当前JSP页面出现异常的时候要跳转到的JSP页面。
isErrorPage
当前JSP页面是否是一个错误页面。若值为true,可以使用JSP页面的一个内置对象 exception。
include标签
静态包含,可以将其他页面内容包含进来,一起进行编译运行.生成一个java文件.
<%@include file="被包含JSP的相对路径" %>
taglib标签
导入标签库。
<%@taglib prefix="前缀名" uri="名称空间" %>
JSP内置对象
JSP中一共预先定义了9个这样的对象,分别为:request、response、session、application、out、pagecontext、config、page、exception。
request对象
request 对象是 HttpServletRequest类型的对象。
response对象
response 对象是 HttpServletResponse类型的对象。
session对象
session 对象是HttpSession类型的对象。只有在包含 session=“true” 的页面中才可以被使用。
application对象
application 对象是ServletContext类型的对象。
out 对象
out 对象是JspWriter类型的对象。
config 对象
config 对象是ServletConfig类型的对象。
pageContext 对象
pageContext 对象是PageContext类型的对象。作用是取得任何范围的参数,通过它可以获取 JSP页面的out、request、reponse、session、application 等对象。pageContext对象的创建和初始化都是由容器来完成的,在JSP页面中可以直接使用 pageContext对象。
page 对象
page 对象代表JSP本身。
exception 对象
exception 对象的作用是显示异常信息,只有在包含 isErrorPage="true" 的页面中才可以被使用。
JSP四大作用域对象
作用域:“数据共享的范围”,也就是说数据能够在指定范围内有效。
对象名称 | 作用范围 |
application | 整个应用都有效 |
session | 在当前会话中有效 |
request | 在当前请求中有效 |
page | 在当前页面有效 |
请求转发:
请求转发是有一些类似于Servlet中的重定向响应,但是不同的是重定向响应是两次请求两次响应,而请求转发是一次请求一次响应
请求转发是服务端的一种请求方式,相当于在服务端中直接请求某个资源。
RequestDispatcher dispatcher = request.getRequestDispatcher("/test.jsp");
dispatcher.forward(request,response);
简写方式:
request.getRequestDispatcher("/test.jsp").forword(request,response);
我们可以通过一张图去理解这个请求转发内部是如何转发的:
案例:通过Servlet获取客户端浏览器正在使用的语言
我们可以通过请求头中的"accept-language",获取现在浏览器正在使用的语言
我们将请求转发给一个叫requestForward的jsp文件,后面一定要带forward,把浏览器的请求一起转发了,不然jsp文件怎么知道显示啥呢
然后我们再创建一个requestForward.jsp文件,通过这个文件获取转发过来的请求中的属性,然后输出到页面上
JSTL标签库是什么
JSTL(Java server pages standard tag library,即JSP标准标签库)JSTL标签是基于JSP页面的。这些标签可以插入在JSP代码中,本质上JSTL也是提前定义好的一组标签,这些标签封装了不同的功能,在页面上调用标签时,就等于调用了封装起来的功能。JSTL的目标是使JSP页面的可读性更强、简化JSP页面的设计、实现了代码复用、提高效率。
在JSP2.0版本后开始支持JSTL标签库。在使用JSTL标签库时需要在JSP中添加对应的taglib指令标签。
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
JSTL标签分类
根据JSTL标签所提供的功能,可以将其分为5个类别。
核心标签
最常用、最重要,也是最基本的标签
<%@taglibprefix="c"uri="http://java.sun.com/jsp/jstl/core"%>
格式化标签
JSTL格式化标签用来格式化并输出文本、日期、时间、数字。
<%@taglibprefix="fmt"uri="http://java.sun.com/jsp/jstl/fmt"%>
SQL标签
JSTL SQL标签库提供了与关系型数据库(Oracle,MySQL,SQL Server等等)进行交互的标签。
<%@taglibprefix="sql"uri="http://java.sun.com/jsp/jstl/sql"%>
XML标签
JSTL XML标签库提供了创建和操作XML文档的标签。
<%@taglibprefix="x"uri="http://java.sun.com/jsp/jstl/xml"%>
JSTL函数
JSTL包含一系列标准函数,大部分是通用的字符串处理函数。
<%@taglibprefix="fn"uri="http://java.sun.com/jsp/jstl/functions"%>
EL表达式
JSTL标签本身是无法使用表达式或者对象的,我们需要使用EL表达式帮助JSTL标签使用表达式或者对象
语法结构
${表达式}
${对象.属性名}
EL表达式中的操作符
操作符 | 描述 |
( ) | 优先级 |
+ | 加 |
- | 减或负 |
* | 乘 |
/ 或div | 除 |
% 或 mod | 取模 |
== 或 eq | 测试是否相等 |
!= 或 ne | 测试是否不等 |
< 或 lt | 测试是否小于 |
> 或gt | 测试是否大于 |
<= or le | 测试是否小于等于 |
>= 或 ge | 测试是否大于等于 |
&& 或 and | 测试逻辑与 |
|| 或 or | 测试逻辑或 |
! 或not | 测试取反 |
empty | 测试是否空值 |
EL表达式的隐含对象
隐含对象 | 描述 |
pageScope | page 作用域 |
requestScope | request 作用域 |
sessionScope | session 作用域 |
applicationScope | application 作用域 |
param | Request 对象的参数,字符串 |
paramValues | Request对象的参数,字符串集合 |
header | HTTP 信息头,字符串 |
headerValues | HTTP 信息头,字符串集合 |
initParam | 上下文初始化参数 |
cookie | Cookie值 |
pageContext | 当前页面的pageContext |
使用EL表达式取出作用域中的值
${pageScope.name}
${requestScope.name}
${sessionScope.name}
${applicationScope.name}
获取作用域属性中的数据时,也可以只写属性名,EL表达式会按照pageScope、requestScope、sessionScope、applicationScope的顺序查找该属性的值。
${name}
如何在idea使用JSTL标签库
JSTL标签库的使用步骤
添加jstl.jar
在JSP页面中添加taglib指令标签。
首先在项目结构中导入jstl标签库
然后在artifacts目录下,将jstl目录添加到web-inf目录下的lib目录
添加好后就可以通过taglib使用jstl标签库了
例:
标签的使用:
c标签:
if标签:
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
< c:if >
标签判断表达式的值,如果表达式的值为 true 则执行其主体内容。
标签中的属性test需要给定布尔值或者一个el表达式,el表达式的值是一个布尔值
choose标签:
< c:choose >, < c:when >, < c:otherwise >
< c:choose >标签与Java switch语句的功能一样,用于在众多选项中做出选择。
switch语句中有case,而< c:choose >标签中对应有< c:when >,
switch语句中有default,而< c:choose >标签中有< c:otherwise >。
when标签和otherwise标签后面都自动会有break语句,
< c:when > = case: 值 break;
< c:otherwise > = default: 值 break;
注意:如果有多个when标签为true,那么匹配第一个为true的when标签
test属性:
标签中的属性test需要给定布尔值或者一个返回布尔值的el表达式,
test代表的就是判断
forEach标签:
< c:forEach >
迭代器,用于迭代集合。
属性 | 描述 |
items | 被迭代的集合 |
begin(>=) | 迭代器的起始因子 |
end(<=) | 迭代器的结束因子 |
step | 迭代因子的增长数 |
var | 代表当前迭代元素的变量名称 |
varStatus | 代表循环状态的变量名称 |
varStatus 属性:
current: 当前这次迭代的(集合中的)项
index: 当前这次迭代从 0 开始的迭代索引
count: 当前这次迭代从 1 开始的迭代计数
first: 用来表明当前这轮迭代是否为第一次迭代的标志
last: 用来表明当前这轮迭代是否为最后一次迭代的标志
begin: 属性值
end: 属性值
step: 属性值
例子:
forEach遍历List集合
forEach遍历Map集合
fmt标签
JSTL格式化标签的使用
<%@ taglib prefix="fmt" uri=" Oracle Java Technologies | Oracle" %>
对日期的格式化处理
<fmt:formatDate value="${data}"pattern="yyyy-MM-dd"/>
对数字格的式化处理
<fmt:formatNumber value="${balance}"type="currency"/>
MVC模式:
MVC模式是一种软件的架构模式:Model、View、Controller即模型、视图、控制器。MVC要实现的目标是将软件的用户界面和业务逻辑分离,可提高代码可扩展性、可复用性、可维护性、以及灵活性。
View(视图):用户的操作界面。如:html、jsp。
Model(模型):具体的业务模型与数据模型。如:service、dao、pojo。
Controller(控制):处理从视图层发送的请求,并选取模型层的业务模型完成响应的业务实现,并产生响应。如:Servlet。
MVC模式与应用程序分层的区别
MVC模式是一种软件的架构方式,而应用程序分层这是一种代码的组织方式。MVC模式与应用程序分层的目标都是一致的:为了解耦和、提高代码复用性。