JSP动态页面技术
一、动态页面和静态页面的区别
1、静态页面
静态页面,即静态网页,是实际存在的,无需经过服务器的编译,直接加载到客户浏览器上显示出来。静态页面需要占一定的服务器空间,且不能自主管理发布更新的页面,如果想更新网页内容,要通过FTP软件把文件DOWN下来用网页制作软件修改(通过fso等技术例外)。常见的静态页面举例:.html扩展名的、.htm扩展名的。
2、动态页面
动态页面是一种网络常用页面, 相关技术有asp,jsp,php,cgi等。
3、二者区别
- 静态网页和动态网页都是网页。
- 静态网页不需要后台程序干预处理,直接由服务器返回。实现为静态网页后,一般不需要维护,因为数据不需要更新。
- 动态网页一般需要由程序来处理(ASP、JSP、PHP、Python、Ruby 等),并由数据库提供数据支撑。
- 不要以 URL 的形式来判断一个网页是静态的还是动态的,而应该看页面的属性(产品经理最好具备一些调试技巧和经验)。【有些网页是.html结尾的,但是是动态页面,术语叫做:伪静态化页面】
- 动态网页更灵活。
二、JSP动态页面简介
JSP全名为Java Server Pages,中文名叫Java服务器页面,是一种动态网页开发技术,其根本是一个简化的Servlet设计,它是在传统的网页HTML文件(.htm,.html)中插入Java程序段和JSP标记,从而形成JSP文件,后缀名为(*.jsp)。
三、JSP页面环境搭建
1、Java环境
详见:Java基础一
2、Tomcat环境
详见:Java WEB 十五
四、JSP的常用知识点
1、JSP 生命周期
JSP生命周期就是从创建到销毁的整个过程,类似于servlet生命周期,区别在于JSP生命周期还包括将JSP文件编译成servlet。
以下是JSP生命周期中所走过的几个阶段:
- 编译阶段:
servlet容器编译servlet源文件,生成servlet类 - 初始化阶段:
加载与JSP对应的servlet类,创建其实例,并调用它的初始化方法 - 执行阶段:
调用与JSP对应的servlet实例的服务方法 - 销毁阶段:
调用与JSP对应的servlet实例的销毁方法,然后销毁servlet实例
2、JSP语法和指令
Ⅰ、JSP语法
<% 代码片段 %>
Ⅱ、JSP指令
<%@ directive attribute="value" %>
分别有三种指令标签:
指令 | 描述 |
---|---|
<%@ page … %> | 定义页面的依赖属性,比如脚本语言、error页面、缓存需求等等 |
<%@ include … %> | 包含其他文件 |
<%@ taglib … %> | 引入标签库的定义,可以是自定义标签 |
3、JSP客户端请求与服务器的响应
Ⅰ、JSP客户端请求【HttpServletRequest类】
request对象是javax.servlet.http.HttpServletRequest类的实例。每当客户端请求一个页面时,JSP引擎就会产生一个新的对象来代表这个请求。
request对象提供了一系列方法来获取HTTP信息头,包括表单数据,cookies,HTTP方法等等。
接下来将会介绍一些在JSP编程中常用的获取HTTP信息头的方法。详细内容请见下表:
方法 | 描述 |
---|---|
Cookie[] getCookies() | 返回客户端所有的Cookie的数组 |
Enumeration getAttributeNames() | 返回request对象的所有属性名称的集合 |
Enumeration getHeaderNames() | 返回所有HTTP头的名称集合 |
Enumeration getParameterNames() | 返回请求中所有参数的集合 |
HttpSession getSession() | 返回request对应的session对象,如果没有,则创建一个 |
HttpSession getSession(boolean create) | 返回request对应的session对象,如果没有并且参数create为true,则返回一个新的session对象 |
Locale getLocale() | 返回当前页的Locale对象,可以在response中设置 |
Object getAttribute(String name) | 返回名称为name的属性值,如果不存在则返回null。 |
ServletInputStream getInputStream() | 返回请求的输入流 |
String getAuthType() | 返回认证方案的名称,用来保护servlet,比如 “BASIC” 或者 “SSL” 或 null 如果 JSP没设置保护措施 |
String getCharacterEncoding() | 返回request的字符编码集名称 |
String getContentType() | 返回request主体的MIME类型,若未知则返回null |
String getContextPath() | 返回request URI中指明的上下文路径 |
String getHeader(String name) | 返回name指定的信息头 |
String getMethod() | 返回此request中的HTTP方法,比如 GET,,POST,或PUT |
String getParameter(String name) | 返回此request中name指定的参数,若不存在则返回null |
String getPathInfo() | 返回任何额外的与此request URL相关的路径 |
String getProtocol() | 返回此request所使用的协议名和版本 |
String getQueryString() | 返回此 request URL包含的查询字符串 |
String getRemoteAddr() | 返回客户端的IP地址 |
String getRemoteHost() | 返回客户端的完整名称 |
String getRemoteUser() | 返回客户端通过登录认证的用户,若用户未认证则返回null |
String getRequestURI() | 返回request的URI |
String getRequestedSessionId() | 返回request指定的session ID |
String getServletPath() | 返回所请求的servlet路径 |
String[] getParameterValues(String name) | 返回指定名称的参数的所有值,若不存在则返回null |
boolean isSecure() | 返回request是否使用了加密通道,比如HTTPS |
int getContentLength() | 返回request主体所包含的字节数,若未知的返回-1 |
int getIntHeader(String name) | 返回指定名称的request信息头的值 |
int getServerPort() | 返回服务器端口号 |
Ⅱ、JSP服务器的响应【HttpServletResponse类】
response 对象是 javax.servlet.http.HttpServletResponse 类的一个实例。就像服务器会创建request对象一样,它也会创建一个客户端响应。
response对象定义了处理创建HTTP信息头的接口。通过使用这个对象,开发者们可以添加新的cookie或时间戳,还有HTTP状态码等等。
下表列出了用来设置HTTP响应头的方法,这些方法由HttpServletResponse 类提供:
方法 | 描述 |
---|---|
String encodeRedirectURL(String url) | 对sendRedirect()方法使用的URL进行编码 |
String encodeURL(String url) | 将URL编码,回传包含Session ID的URL |
boolean containsHeader(String name) | 返回指定的响应头是否存在 |
boolean isCommitted() | 返回响应是否已经提交到客户端 |
void addCookie(Cookie cookie) | 添加指定的cookie至响应中 |
void addDateHeader(String name, long date) | 添加指定名称的响应头和日期值 |
void addHeader(String name, String value) | 添加指定名称的响应头和值 |
void addIntHeader(String name, int value) | 添加指定名称的响应头和int值 |
void flushBuffer() | 将任何缓存中的内容写入客户端 |
void reset() | 清除任何缓存中的任何数据,包括状态码和各种响应头 |
void resetBuffer() | 清除基本的缓存数据,不包括响应头和状态码 |
void sendError(int sc) | 使用指定的状态码向客户端发送一个出错响应,然后清除缓存 |
void sendError(int sc, String msg) | 使用指定的状态码和消息向客户端发送一个出错响应 |
void sendRedirect(String location) | 使用指定的URL向客户端发送一个临时的间接响应 |
void setBufferSize(int size) | 设置响应体的缓存区大小 |
void setCharacterEncoding(String charset) | 指定响应的编码集(MIME字符集),例如UTF-8 |
void setContentLength(int len) | 指定HTTP servlets中响应的内容的长度,此方法用来设置 HTTP Content-Length 信息头 |
void setContentType(String type) | 设置响应的内容的类型,如果响应还未被提交的话 |
void setDateHeader(String name, long date) | 使用指定名称和日期设置响应头的名称和日期 |
void setHeader(String name, String value) | 使用指定名称和值设置响应头的名称和内容 |
void setIntHeader(String name, int value) | 指定 int 类型的值到 name 标头 |
void setLocale(Locale loc) | 设置响应的语言环境,如果响应尚未被提交的话 |
void setStatus(int sc) | 设置响应的状态码 |
4、JSP HTTP 状态码
Ⅰ、状态码
状态码 | 消息 | 描述 |
---|---|---|
100 | Continue | 只有一部分请求被服务器接收,但只要没被服务器拒绝,客户端就会延续这个请求 |
101 | Switching Protocols | 服务器交换机协议 |
200 | OK | 请求被确认 |
201 | Created | 请求时完整的,新的资源被创建 |
202 | Accepted | 请求被接受,但未处理完 |
203 | Non-authoritative Information | |
204 | No Content | |
205 | Reset Content | |
206 | Partial Content | |
300 | Multiple Choices | 一个超链接表,用户可以选择一个超链接并访问,最大支持5个超链接 |
301 | Moved Permanently | 被请求的页面已经移动到了新的URL下 |
302 | Found | 被请求的页面暂时性地移动到了新的URL下 |
303 | See Other | 被请求的页面可以在一个不同的URL下找到 |
304 | Not Modified | |
305 | Use Proxy | |
306 | Unused | 已经不再使用此状态码,但状态码被保留 |
307 | Temporary Redirect | 被请求的页面暂时性地移动到了新的URL下 |
400 | Bad Request | 服务器无法识别请求 |
401 | Unauthorized | 被请求的页面需要用户名和密码 |
402 | Payment Required | 目前还不能使用此状态码 |
403 Forbidden | 禁止访问所请求的页面 | |
404 | Not Found | 服务器无法找到所请求的页面 |
405 | Method Not Allowed | 请求中所指定的方法不被允许 |
406 | Not Acceptable | 服务器只能创建一个客户端无法接受的响应 |
407 | Proxy Authentication Required | 在请求被服务前必须认证一个代理服务器 |
408 | Request Timeout | 请求时间超过了服务器所能等待的时间,连接被断开 |
409 | Conflict | 请求有矛盾的地方 |
410 | Gone | 被请求的页面不再可用 |
411 | Length Required | "Content-Length"没有被定义,服务器拒绝接受请求 |
412 | Precondition Failed | 请求的前提条件被服务器评估为false |
413 | Request Entity Too Large | 因为请求的实体太大,服务器拒绝接受请求 |
414 | Request-url Too Long | 服务器拒绝接受请求,因为URL太长。多出现在把"POST"请求转换为"GET"请求时所附带的大量查询信息 |
415 | Unsupported Media Type | 服务器拒绝接受请求,因为媒体类型不被支持 |
417 | Expectation Failed | |
500 | Internal Server Error | 请求不完整,服务器遇见了出乎意料的状况 |
501 | Not Implemented | 请求不完整,服务器不提供所需要的功能 |
502 | Bad Gateway | 请求不完整,服务器从上游服务器接受了一个无效的响应 |
503 | Service Unavailable | 请求不完整,服务器暂时重启或关闭 |
504 | Gateway Timeout | 网关超时 |
505 | HTTP Version Not Supported | 服务器不支持所指定的HTTP版本 |
Ⅱ、设置HTTP状态码的方法
下表列出了HttpServletResponse 类中用来设置状态码的方法:
方法 | 描述 |
---|---|
public void setStatus ( int statusCode ) | 此方法可以设置任意的状态码。如果您的响应包含一个特殊的状态码和一个文档,请确保在用PrintWriter返回任何内容前调用setStatus方法 |
public void sendRedirect(String url) | 此方法产生302响应,同时产生一个 Location 头告诉URL 一个新的文档 |
public void sendError(int code, String message) | 此方法将一个状态码(通常为 404)和一个短消息,自动插入HTML文档中并发回给客户端 |
5、JSP Cookie和Session
Ⅰ、JSP Cookie
Cookie 是存储在客户机的文本文件,它们保存了大量轨迹信息。在 Servlet 技术基础上,JSP 显然能够提供对 HTTP cookie 的支持。
有三种方法来维持客户端与服务器的会话:
- Cookies
- 隐藏表单域
- 重写URL
通常有三个步骤来识别返回信息:
- 服务器脚本发送一系列 cookie 至浏览器。比如名字,年龄,ID 号码等等。
- 浏览器在本地机中存储这些信息,以备不时之需。
- 当下一次浏览器发送任何请求至服务器时,它会同时将这些 cookie 信息发送给服务器,然后服务器使用这些信息来识别用户或者干些其它事情。
下表列出了 Cookie 对象中常用的方法:
方法 | 描述 |
---|---|
public void setDomain(String pattern) | 设置 cookie 的域名 |
public String getDomain() | 获取 cookie 的域名 |
public void setMaxAge(int expiry) | 设置 cookie 有效期,以秒为单位,默认有效期为当前session的存活时间 |
public int getMaxAge() | 获取 cookie 有效期,以秒为单位,默认为-1 ,表明cookie会活到浏览器关闭为止 |
public String getName() | 返回 cookie 的名称,名称创建后将不能被修改 |
public void setValue(String newValue) | 设置 cookie 的值 |
public String getValue() | 获取cookie的值 |
public void setPath(String uri) | 设置 cookie 的路径,默认为当前页面目录下的所有 URL,还有此目录下的所有子目录 |
public String getPath() | 获取 cookie 的路径 |
public void setSecure(boolean flag) | 指明 cookie 是否要加密传输 |
public void setComment(String purpose) | 设置注释描述 cookie 的目的。当浏览器将 cookie 展现给用户时,注释将会变得非常有用 |
public String getComment() | 返回描述 cookie 目的的注释,若没有则返回 null |
Ⅱ、JSP Session
HTTP是无状态协议,这意味着每次客户端检索网页时,都要单独打开一个服务器连接,因此服务器不会记录下先前客户端请求的任何信息。
JSP利用servlet提供的HttpSession接口来识别一个用户,存储这个用户的所有访问信息。
默认情况下,JSP允许会话跟踪,一个新的HttpSession对象将会自动地为新的客户端实例化。禁止会话跟踪需要显式地关掉它,通过将page指令中session属性值设为false来实现,就像下面这样:
<%@ page session="false" %>
JSP引擎将隐含的session对象暴露给开发者。由于提供了session对象,开发者就可以方便地存储或检索数据。
下表列出了session对象的一些重要方法:
方法 | 描述 |
---|---|
public Object getAttribute(String name) | 返回session对象中与指定名称绑定的对象,如果不存在则返回null |
public Enumeration getAttributeNames() | 返回session对象中所有的对象名称 |
public long getCreationTime() | 返回session对象被创建的时间, 以毫秒为单位,从1970年1月1号凌晨开始算起 |
public String getId() | 返回session对象的ID |
public long getLastAccessedTime() | 返回客户端最后访问的时间,以毫秒为单位,从1970年1月1号凌晨开始算起 |
public int getMaxInactiveInterval() | 返回最大时间间隔,以秒为单位,servlet 容器将会在这段时间内保持会话打开 |
public void invalidate() | 将session无效化,解绑任何与该session绑定的对象 |
public boolean isNew() | 返回是否为一个新的客户端,或者客户端是否拒绝加入session |
public void removeAttribute(String name) | 移除session中指定名称的对象 |
public void setAttribute(String name, Object value) | 使用指定的名称和值来产生一个对象并绑定到session中 |
public void setMaxInactiveInterval(int interval) | 用来指定时间,以秒为单位,servlet容器将会在这段时间内保持会话有效 |
6、JSP JSTL常用标签库
JSP标准标签库(JSTL)是一个JSP标签集合,它封装了JSP应用的通用核心功能。
JSTL支持通用的、结构化的任务,比如迭代,条件判断,XML文档操作,国际化标签,SQL标签。 除了这些,它还提供了一个框架来使用集成JSTL的自定义标签。
根据JSTL标签所提供的功能,可以将其分为5个类别。
- 核心标签
- 格式化标签
- SQL 标签
- XML 标签
- JSTL 函数
Ⅰ、核心标签
核心标签是最常用的 JSTL标签。引用核心标签库的语法如下:
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
标签 | 描述 |
---|---|
<c:out> | 用于在JSP中显示数据,就像<%= … > |
<c:set> | 用于保存数据 |
<c:remove> | 用于删除数据 |
<c:catch> | 用来处理产生错误的异常状况,并且将错误信息储存起来 |
<c:if> | 与我们在一般程序中用的if一样 |
<c:choose> | 本身只当做<c:when>和<c:otherwise>的父标签 |
<c:when> | <c:choose>的子标签,用来判断条件是否成立 |
<c:otherwise> | <c:choose>的子标签,接在<c:when>标签后,当<c:when>标签判断为false时被执行 |
<c:import> | 检索一个绝对或相对 URL,然后将其内容暴露给页面 |
<c:forEach> | 基础迭代标签,接受多种集合类型 |
<c:forTokens> | 根据指定的分隔符来分隔内容并迭代输出 |
<c:param> | 用来给包含或重定向的页面传递参数 |
<c:redirect> | 重定向至一个新的URL. |
<c:url> | 使用可选的查询参数来创造一个URL |
Ⅱ、格式化标签
JSTL格式化标签用来格式化并输出文本、日期、时间、数字。引用格式化标签库的语法如下:
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
标签 | 描述 |
---|---|
fmt:formatNumber | 使用指定的格式或精度格式化数字 |
fmt:parseNumber | 解析一个代表着数字,货币或百分比的字符串 |
fmt:formatDate | 使用指定的风格或模式格式化日期和时间 |
fmt:parseDate | 解析一个代表着日期或时间的字符串 |
fmt:bundle | 绑定资源 |
fmt:setLocale | 指定地区 |
fmt:setBundle | 绑定资源 |
fmt:timeZone | 指定时区 |
fmt:setTimeZone | 指定时区 |
fmt:message | 显示资源配置文件信息 |
fmt:requestEncoding | 设置request的字符编码 |
Ⅲ、SQL 标签
JSTL SQL标签库提供了与关系型数据库(Oracle,MySQL,SQL Server等等)进行交互的标签。引用SQL标签库的语法如下:
<%@ taglib prefix="sql" uri="http://java.sun.com/jsp/jstl/sql" %>
标签 | 描述 |
---|---|
sql:setDataSource | 指定数据源 |
sql:query | 运行SQL查询语句 |
sql:update | 运行SQL更新语句 |
sql:param | 将SQL语句中的参数设为指定值 |
sql:dateParam | 将SQL语句中的日期参数设为指定的java.util.Date 对象值 |
sql:transaction | 在共享数据库连接中提供嵌套的数据库行为元素,将所有语句以一个事务的形式来运行 |
Ⅳ、XML 标签
JSTL XML标签库提供了创建和操作XML文档的标签。引用XML标签库的语法如下:
<%@ taglib prefix="x" uri="http://java.sun.com/jsp/jstl/xml" %>
标签 | 描述 |
---|---|
<x:out> | 与<%= … >,类似,不过只用于XPath表达式 |
<x:parse> | 解析 XML 数据 |
<x:set> | 设置XPath表达式 |
<x:if> | 判断XPath表达式,若为真,则执行本体中的内容,否则跳过本体 |
<x:forEach> | 迭代XML文档中的节点 |
<x:choose> | <x:when>和<x:otherwise>的父标签 |
<x:when> | <x:choose>的子标签,用来进行条件判断 |
<x:otherwise> | <x:choose>的子标签,当<x:when>判断为false时被执行 |
<x:transform> | 将XSL转换应用在XML文档中 |
<x:param> | 与<x:transform>共同使用,用于设置XSL样式表 |
Ⅴ、JSTL 函数
JSTL包含一系列标准函数,大部分是通用的字符串处理函数。引用JSTL函数库的语法如下:
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
函数 | 描述 |
---|---|
fn:contains() | 测试输入的字符串是否包含指定的子串 |
fn:containsIgnoreCase() | 测试输入的字符串是否包含指定的子串,大小写不敏感 |
fn:endsWith() | 测试输入的字符串是否以指定的后缀结尾 |
fn:escapeXml() | 跳过可以作为XML标记的字符 |
fn:indexOf() | 返回指定字符串在输入字符串中出现的位置 |
fn:join() | 将数组中的元素合成一个字符串然后输出 |
fn:length() | 返回字符串长度 |
fn:replace() | 将输入字符串中指定的位置替换为指定的字符串然后返回 |
fn:split() | 将字符串用指定的分隔符分隔然后组成一个子字符串数组并返回 |
fn:startsWith() | 测试输入字符串是否以指定的前缀开始 |
fn:substring() | 返回字符串的子集 |
fn:substringAfter() | 返回字符串在指定子串之后的子集 |
fn:substringBefore() | 返回字符串在指定子串之前的子集 |
fn:toLowerCase() | 将字符串中的字符转为小写 |
fn:toUpperCase() | 将字符串中的字符转为大写 |
fn:trim() | 移除首尾的空白符 |
总结:
今天写的这篇博客是关于JSP动态页面的,JSP也是Java后端当中与后台交互的一种方式!虽然说现在已经有一些项目是采用前后端分离了,但是大部分项目还是使用的JSP页面或者是后面学习的混合模板开发。因此,最好两者都去学习一下!前后端分离前端使用的是vue框架,有兴趣的小伙伴可以看看vue的相关知识点,去给自己充充电。
JSP在SSM框架当中用的很广泛!大部分项目中都能看到JSP的身影,可想而知它将贯穿第二阶段和第三阶段的学习!可能有小伙伴不知道什么是SSM框架,它是一个框架的简称,后续会讲到,还有另一个SSH框架已经不是很常用了,大部分都是SSM框架为主体,这个框架是必须掌握的!等有时间再去看看SSH框架。
明天就毕业了,回学校领取毕业证书了,接下来就去找工作,开始长达两年的工作!也不知道等我入职以后是否还有时间每天写博客,到时候再看吧!如果写不了了我会提前写一篇博客专门说一下,如果能写那我还是会每天持续更新一篇博客!
今天的博客先更新到这里咯!有什么不对的地方或者有什么建议!欢迎小伙伴们在评论区留言哦!
如果本篇博客对大家有帮助,希望大家能够点赞、关注!在此先谢过各位小伙伴了!
最后,愿我们都能在各行各业中能够取得不同的成就,不负亲人、朋友、老师、长辈和国家的期望!能够用自身的所学知识为国家贡献出自己的一份力量!一起加油!
2021年6月28日夜