JavaWeb开发——JSP技术
Posted PerseverenceDB
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JavaWeb开发——JSP技术相关的知识,希望对你有一定的参考价值。
第四章:JSP技术
目录
- 一、JSP简介
- 二、JSP运行原理
- 三、JSP标签的使用
- 四、JSP的内置对象
- 五、请求转发
- 六、JSP中的四大作用域对象
- 七、JSTL标签库
- 八、EL表达式
- 九、JSTL标签库与EL表达式的使用
- 十、JSTL格式化标签的使用
- 十一、MVC模式
一、JSP简介
JSP介绍
JSP(全称Java Server Pages)Java服务端页面技术,是JavaEE平台下的技术规范。它允许使用特定的标签在html网页中插入Java代码,实现动态页面处理,所以JSP就是HTML与Java代码的复合体。JSP技术可以快速的实现一个页面的开发,相比在Servlet中实现页面开发将变得更加容易。
常见的视图层技术
HTML、JSP、Thymeleaf等。
前后端分离开发方式
在前后端分离的项目中真正可以做到“术业有专攻”(开发人员分离) 。前后端分离开发方式中前端页面由专业团队完成页面的开发,并通过请求调用后端的api接口进行数据交互。在开发前端页面的团队中更多关注的技术如:html、CSS、jQuery、Vue、Nodejs等前端技术。前端追求的是:页面表现,速度流畅,兼容性,用户体验等等。而后端团队则更多的是业务的具体实现。在后端开发的团队中更多关注的技术如:设计模式、分布式架构、微服务架构、数据库的操作、Java的性能优化以及数据库优化等技术。前后端分离已成为互联网项目开发的业界标准使用方式,特别是为大型分布式架构、弹性计算架构、微服务架构、多端化服务(多种客户端,例如:浏览器,车载终端,安卓,ios等等)打下坚实的基础。
二、JSP运行原理
JSP技术特点
JSP和Servlet是本质相同的技术。当一个JSP文件第一次被请求时,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与Servlet区别
JSP以源文件形式部署到容器中。而Servlet需要编译成class文件后部署到容器中。
JSP部署到web项目的根目录下或根目录下的其他子目录和静态同资源位于相同位置。而Servlet需要部署到WEB-INF/classes目录中。
JSP中的HTML代码会被JSP引擎放入到Servlet的out.write()方法中。而在Servlet中我们需要自己通过对字符流输出流的操作生成响应的页面。
JSP更擅长表现于页面显示,Servlet更擅长于逻辑控制。
三、JSP标签的使用
JSP的三种原始标签
JSP的原始标签在JSP的任何版本中都可以使用。
声明标签 <%! %>
声明标签用于在JSP中定义成员变量与方法的定义。标签中的内容会出现在JSP被编译后的Servlet的class的中。
代码示例:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>$Title$</title>
</head>
<body>
Welcome JSP!
<%!
int a = 10;
int add(int a,int b)
return a+b;
%> //声明标签
<%
int c = 20;
%>
<%=a %>
<%=c %>
</body>
</html>
脚本标签 <% %>
脚本标签用于在JSP中编写业务逻辑。标签中的内容会出现在JSP被编译后的Servlet的_jspService方法体中。
赋值标签 <%= %>
赋值标签用于在JSP中做内容输出。标签中的内容会出现在_jspService方法的out.print()方法的参数中。
注意:在使用赋值标签时不需要在代码中添加 ”;”。
JSP原始标签的使用
制作一个简单随机判断
需求:以20%概率显示“去撸猫”,以80%概率显示“继续快乐学习”,同时显示对应随机数。
<%@ page import="java.util.Random" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<%
int flag = new Random().nextInt(100)+1;
if(flag <= 20)
%>
去撸猫 <%= flag%>
<%else%>
继续快乐学习 <%= flag%>
<%%>
</body>
</html>
JSP的指令标签
JSP指令标签的作用是声明JSP页面的一些属性和动作。
格式:<%@指令名称 属性=“值” 属性=“值1,值2…”%>
JSP指令标签分类
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” 的页面中才可以被使用。
五、请求转发
什么是请求转发
请求转发是服务端的一种请求方式,相当于在服务端中直接请求某个资源。
示例:
RequestDispatcher dispatcher = request.getRequestDispatcher(“/test.jsp”);
dispatcher.forward(request,response);
简写方式:
request.getRequestDispatcher(“/test.jsp”).forword(request,response);
请求转发与重定向的区别
<请求转发对于客户端浏览器而言是在一次请求与响应中完成,而重定向是在两次请求两次响应中完成。
<请求转发并不会改变客户端浏览器的地址栏中的内容。而重定向会改变客户端浏览器地址栏中的内容。
<请求转发可以使用request对象传递数据,而重定向不能使用request对象传递数据。
<如果是处理的DML操作,建议使用重定向方式为客户端浏览器产生响应,可以解决表单重复提交现象。
请求转发案例
需求:在Servlet中获取客户端浏览器所支持的语言,并通过JSP页面将客户端浏览器所支持的语言响应给客户端浏览器。
//Servlet代码
package com.packagename.servlet;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
* 在Servlet中获取客户端浏览器所支持的语言,
* 并通过JSP页面将客户端浏览器所支持的语言响应给客户端浏览器。
*/
@WebServlet("/url")
public class LanguageServlet extends HttpServlet
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException
this.doPost(req, resp);
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException
//获取请求头中所支持的语言
String header = req.getHeader("Accept-Language");
//将数据存放到Request对象中
req.setAttribute("header",header);
//使用请求转发跳转到JSP
req.getRequestDispatcher("jspname.jsp").forward(req,resp);
//JSP代码
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<%
String header = (String)request.getAttribute("header");
%>
<font color="blue"><%= header%> </font>
</body>
</html>
六、JSP中的四大作用域对象
作用域:“数据共享的范围”,也就是说数据能够在多大的范围内有效。
对象名称 | 作用范围 |
---|---|
application | 整个应用都有效 |
session | 在当前会话中有效 |
request | 在当前请求中有效 |
page | 在当前页面有效 |
七、JSTL标签库
什么是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个类别。
核心标签
最常用、最重要,也是最基本的标签
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
格式化标签
JSTL格式化标签用来格式化并输出文本、日期、时间、数字。
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
SQL标签
JSTL SQL标签库提供了与关系型数据库(Oracle,mysql,SQL Server等等)进行交互的标签。
<%@ taglib prefix="sql" uri="http://java.sun.com/jsp/jstl/sql" %>
XML标签
JSTL XML标签库提供了创建和操作XML文档的标签。
<%@ taglib prefix="x" uri="http://java.sun.com/jsp/jstl/xml" %>
JSTL函数
JSTL包含一系列标准函数,大部分是通用的字符串处理函数。
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
八、EL表达式
什么是EL表达式
EL(Expression Language)是一种表达式语言。是为了使JSP写起来更加简单,减少java代码,可以使得获取存储在Java对象中的数据变得非常简单。在JSP2.0版本后开始支持EL表达式。
语法结构
$表达式
$对象.属性名
EL表达式中的操作符
操作符 | 描述 |
---|---|
( ) | 优先级 |
+ | 加 |
- | 减 |
* | 乘 |
/或div | 除 |
%或mod | 取模 |
== 或 eq | 测试是否相等 |
!= 或 ne | 测试是否不等 |
< 或 lt | 测试是否小于 |
> 或gt | 测试是否大于 |
<= or le | 测试是否小于等于 |
>= 或 ge | 测试是否大于等于 |
&& 或 and | 测试逻辑与 |
! 或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
九、JSTL标签库与EL表达式的使用
JSTL标签库的使用步骤
1.添加jstl.jar
2.在JSP页面中添加taglib指令标签。
JSTL核心标签的使用
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
< c:if >
标签判断表达式的值,如果表达式的值为 true 则执行其主体内容。
示例:<c:if test="$1==1"> Hello JSTL! </c:if>
< c:choose >, < c:when >, < c:otherwise >
< c:choose >标签与Java switch语句的功能一样,用于在众多选项中做出选择。
switch语句中有case,而< c:choose >标签中对应有< c:when >,switch语句中有default,而< c:choose >标签中有< c:otherwise >。
示例:
<c:choose>
<c:when test="$2==1">
Hello When 1!
</c:when>
<c:when test="$2==1">
Hello When 2!
</c:when>
<c:otherwise>
Hello Otherwise!
</c:otherwise>
</c:choose>
< c:forEach >
迭代器,用于迭代集合。
属性 | 描述 |
---|---|
items | 被迭代的集合 |
begin | 迭代器的起始因子 |
end | 迭代器的结束因子 |
step | 迭代因子的增长数 |
var | 代表当前迭代元素的变量名称 |
varStatus | 代表循环状态的变量名称 |
varStatus 属性
current: 当前这次迭代的(集合中的)项
index: 当前这次迭代从 0 开始的迭代索引
count: 当前这次迭代从 1 开始的迭代计数
first: 用来表明当前这轮迭代是否为第一次迭代的标志
last: 用来表明当前这轮迭代是否为最后一次迭代的标志
begin: 属性值
end: 属性值
step: 属性值
示例:
<c:forEach begin="0" end="9" step="2" varStatus="suibian">
ForEach.....$suibian.count,$suibian.first,$suibian.last,$suibian.index<br/>
</c:forEach>
效果图:
案例:使用ForEach迭代List
需求:
创建Users对象,含有userid,username属性。
创建一个Servlet,在Servlet中创建多个Users对象并放到List集合中,在showUsers.jsp的页面中显示所有的Users对象的信息。
1.Users类
package com.package.pojo;
public class Users
private Integer userid;
private String username;
public Users(Integer userid, String username)
this.userid = userid;
this.username = username;
public Users()
public Integer getUserid()
return userid;
public void setUserid(Integer userid)
this.userid = userid;
public String getUsername()
return username;
public void setUsername(String username)
this.username = username;
2.Servlet
package com.package.servlet;
import com.package.pojo.Users;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
@WebServlet("/url")
public class FindUsersServlet extends HttpServlet
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException
this.doPost(req, resp);
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException
//创建测试数据
Users users1 = new Users(1,"海绵宝宝");
Users users2 = new Users(2,"派大星");
//实例化List
List<Users> list = new ArrayList<>();
list.add(users1);
list.add(users2);
//将List添加到request对象中
req.setAttribute("list",list);
//通过请求转发方式跳转
req.getRequestDispatcher("jname.jsp").forward(req,resp);
3.jsp
<%@ 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>
<table border="1" align="center">
<tr>
<th>用户ID</th>
<th>用户姓名</th>
</tr>
<c:forEach items="$list" var="Lname">
<tr>
<td>$Lname.userid</td>
<td>$Lname.username</td>
</tr>
</c:forEach>
</table>
</body>
</html>
效果图:
使用ForEach迭代Map
需求:
创建Users对象,含有userid,username属性。
创建一个Servlet,在Servlet中创建多个Users对象并放到Map集合中,在showUsers2.jsp的页面中显示所有的Users对象的信息。
1.Users类
package com.package.pojo;
public class Users
private Integer userid;
private String username;
public Users(Integer userid, String username)
this.userid = userid;
this.username = username;
public Users()
public Integer getUserid()
return userid;
public void setUserid(Integer userid)
this.userid = userid;
public String getUsername()
return username;
public void setUsername(String username)
this.username = username;
2.Servlet
package com.itbaizhan.servlet;
import com.itbaizhan.pojo.Users;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.javaweb核心之页面技术
2 页面技术
2.1 JSP基础
2.1.1 JSP简介
JSP全称是Java Server Page,它和Servlet一样,也是sun公司推出的一套开发动态web资源的技术,称为JSP/Servlet规范。JSP的本质其实就是一个Servlet。
2.1.2 JSP和HTML以及Servlet的适用场景
类别
适用场景
HTML
只能开发静态资源,不能包含java代码,无法添加动态数据。
Servlet
写java代码,可以输出页面内容,但是很不方便,开发效率极低。
JSP
它包括了HTML的展示技术,同时具备Servlet输出动态资源的能力。但是不适合作为控制器来用。
2.1.3 JSP简单入门
创建JavaWeb工程
在index.jsp中填写内容
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>JSP的入门</title>
</head>
<body>
这是第一个JSP页面
</body>
</html>
部署项目
沿用会话管理工程的部署方式即可。
2.1.4 JSP说明
写在之前: 明确JSP就是一个Servlet。是一个特殊的Servlet。
JSP的原理:
客户端提交请求
——Tomcat服务器解析请求地址
——找到JSP页面
——Tomcat将JSP页面翻译成Servlet的java文件
——将翻译好的.java文件编译成.class文件
——返回到客户浏览器上。
1)执行过程分析图
2)JSP的.java文件内容分析
当我们打开index.jsp翻译的java文件看到的就是public final class index_jsp extends org.apache.jasper.runtime.HttpJspBase
类的声明,然后我们在Tomcat的源码中找到类的声明,如下图:
在这里插入图片描述
同时,我们在index_jsp.java文件中找到了输出页面的代码,并且在浏览器端查看源文件,看到的内容是一样的。这也就是说明,我们的浏览器上的内容,在通过jsp展示时,本质都是用out.write()输出出来的。
讲到这里,我们应该清楚的认识到,JSP它是一个特殊的Servlet,主要是用于展示动态数据。它展示的方式是用流把数据输出出来,而我们在使用JSP时,涉及HTML的部分,都与HTML的用法一致,这部分称为jsp中的模板元素,在开发过程中,先写好这些模板元素,因为它们决定了页面的外观。
2.2 JSP应用
2.2.1 JSP语法
1)Java代码块
在jsp中,可以使用java脚本代码。形式为:<font color=red><b><% 此处写java代码 %></b></font>
但是,在实际开发中,极少使用此种形式编写java代码。同时需要注意的是:
<%
在里面写java程序脚本需要注意:这里面的内容由tomcat负责翻译,翻译之后是service方法的成员变量
%>
示例:
<!--Java代码块-->
<% out.println("这是Java代码块");%>
<hr/>
2)JSP表达式
在jsp中,可以使用特定表达式语法,形式为:<font color=red><b><%=表达式%></b></font>
jsp在翻译完后是out.print(表达式内容);
所以:<%out.print("当前时间);%>和<%="当前时间"%>是一样的。
在实际开发中,这种表达式语法用的也很少使用。
示例:
<!--JSP表达式-->
<%="这是JSP表达式"%><br/>
就相当于<br/>
<%out.println("这是没有JSP表达式输出的");%>
3)JSP声明
在JSP中也可以声明一些变量,方法,静态方法,形式为:<font color=red><b><%! 声明的内容 %></b></font>
使用JSP声明需要注意:
<%!
需要注意的是: 写在里面的内容将会被tomcat翻译成全局的属性或者类方法。
%>
示例:
<!--JSP声明-->
<%! String str = "声明语法格式";%>
<%=str%>
4)JSP注释
在使用JSP时,它有自己的注释,形式为:<font color=red><b><%--注释--%></b></font>
需要注意的是:
在Jsp中可以使用html的注释,但是只能注释html元素,不能注释java程序片段和表达式。同时,被html注释部分会参与翻译,并且会在浏览器上显示
jsp的注释不仅可以注释java程序片段,也可以注释html元素,并且被jsp注释的部分不会参与翻译成.java文件,也不会在浏览器上显示。
示例:
<%--JSP注释--%>
<!--HTML注释-->
5)语法的示例
JSP语法完整示例代码
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>JSP语法</title>
</head>
<body>
<!--Java代码块-->
<% out.println("这是Java代码块");%>
<hr/>
<!--JSP表达式-->
<%="这是JSP表达式"%><br/>
就相当于<br/>
<%out.println("这是没有JSP表达式输出的");%>
<hr/>
<!--JSP声明-->
<%! String str = "声明语法格式";%>
<%=str%>
<hr/>
<%--JSP注释--%>
<!--HTML注释-->
</body>
</html>
2.2.2 JSP指令
1)page指令
**language:**告知引擎,脚本使用的是java,默认是java,支持java。不写也行。
extends:告知引擎,JSP对应的Servlet的父类是哪个,不需要写,也不需要改。
import:告知引擎,导入哪些包(类)。
注意:引擎会自动导入:java.lang.*,javax.servlet.*,javax.servlet.http.*,javax.servlet.jsp.*
导入的形式:
<%@page import=”java.util.Date,java.util.UUID”%>或者:
<%@page import=”java.util.Date”%>
<%@page import=”java.util.UUID”%> 用Eclipse:Alt+/ 自动导入
session:告知引擎是否产生HttpSession对象,即是否在代码中调用request.getSession()。默认是true。
buffer:JspWriter用于输出JSP内容到页面上。告知引擎,设定他的缓存大小。默认8kb。
errorPage:告知引擎,当前页面出现异常后,应该转发到哪个页面上(路径写法:/代表当前应用)
小贴士:当在errorpage上使用了isErrorPage=true之后,ie8有时候不能正常显示
配置全局错误页面:web.xml
<error-page>
<exception-type>java.lang.Exception</exception-type>
<location>/error.jsp</location>
</error-page>
<error-page>
<error-code>404</error-code>
<location>/404.html</location>
</error-page>
当使用了全局错误页面,就无须再写errorPage来实现转到错误页面,而是由服务器负责跳转到错误页面。
isErrorPage:告知引擎,是否抓住异常。如果该属性为true,页面中就可以使用exception对象,打印异常的详细信息。默认值是false。
contentType:告知引擎,响应正文的MIME类型。contentType="text/html;charset=UTF-8"
相当于response.setContentType("text/html;charset=UTF-8");
pageEncoding:告知引擎,翻译jsp时(从磁盘上读取jsp文件)所用的码表。pageEncoding="UTF-8"相当于告知引擎用UTF-8读取JSP
isELIgnored*:告知引擎,是否忽略EL表达式,默认值是false,不忽略。
2)include指令
语法格式:<%@include file="" %>该指令是包含外部页面。
属性:file,以/开头,就代表当前应用。
使用示例
静态包含的特点
3)taglib指令
语法格式:<%taglib uri="" prefix=""%>
作用:该指令用于引入外部标签库。html标签和jsp标签不用引入。
属性:
uri:外部标签的URI地址。
prefix:使用标签时的前缀。
2.2.3 JSP细节
1)九大隐式对象
什么是隐式对象呢?它指的是在jsp中,可以不声明就直接使用的对象。它只存在于jsp中,因为java类中的变量必须要先声明再使用。其实jsp中的隐式对象也并非是未声明,只是它是在翻译成.java文件时声明的。所以我们在jsp中可以直接使用。
隐式对象名称
类型
备注
request
javax.servlet.http.HttpServletRequest
response
javax.servlet.http.HttpServletResponse
session
javax.servlet.http.HttpSession
Page指令可以控制开关
application
javax.servlet.ServletContext
page
Java.lang.Object
当前jsp对应的servlet引用实例
config
javax.servlet.ServletConfig
exception
java.lang.Throwable
page指令有开关
out
javax.servlet.jsp.JspWriter
字符输出流,相当于printwriter
pageContext
javax.servlet.jsp.PageContext
很重要
2)PageContext对象
简介
它是JSP独有的对象,Servlet中没有这个对象。本身也是一个域(作用范围)对象,但是它可以操作其他3个域对象中的属性。而且还可以获取其他8个隐式对象。
生命周期
它是一个局部变量,所以它的生命周期随着JSP的创建而诞生,随着JSP的结束而消失。每个JSP页面都有一个独立的PageContext。
常用方法
在上图中,同学们发现没有页面域操作的方法,其实是定义在了PageContext的父类JspContext中,如下图所示:
3)四大域对象
域对象名称
范围
级别
备注
PageContext
页面范围
最小,只能在当前页面用
因范围太小,开发中用的很少
ServletRequest
请求范围
一次请求或当期请求转发用
当请求转发之后,再次转发时请求域丢失
HttpSession
会话范围
多次请求数据共享时使用
多次请求共享数据,但不同的客户端不能共享
ServletContext
应用范围
最大,整个应用都可以使用
尽量少用,如果对数据有修改需要做同步处理
2.2.4 JSP最佳实战-MVC模型
**Servlet:**擅长处理业务逻辑,不擅长输出显示界面。在web开发中多用于控制程序逻辑(流程)。所以我们称之为:控制器。
**JSP:**擅长显示界面,不擅长处理程序逻辑。在web开发中多用于展示动态界面。所以我们称之为:视图。
M:model ,通常用于封装数据,封装的是数据模型。
V:view ,通常用于展示数据。动态展示用jsp页面,静态数据展示用html。
C:controller ,通常用于处理请求和响应。一般指的是Servlet。
以上是关于JavaWeb开发——JSP技术的主要内容,如果未能解决你的问题,请参考以下文章