Java WEB 十六

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 状态码

Ⅰ、状态码
状态码消息描述
100Continue只有一部分请求被服务器接收,但只要没被服务器拒绝,客户端就会延续这个请求
101Switching Protocols服务器交换机协议
200OK请求被确认
201Created请求时完整的,新的资源被创建
202Accepted请求被接受,但未处理完
203Non-authoritative Information
204No Content
205Reset Content
206Partial Content
300Multiple Choices一个超链接表,用户可以选择一个超链接并访问,最大支持5个超链接
301Moved Permanently被请求的页面已经移动到了新的URL下
302Found被请求的页面暂时性地移动到了新的URL下
303See Other被请求的页面可以在一个不同的URL下找到
304Not Modified
305Use Proxy
306Unused已经不再使用此状态码,但状态码被保留
307Temporary Redirect被请求的页面暂时性地移动到了新的URL下
400Bad Request服务器无法识别请求
401Unauthorized被请求的页面需要用户名和密码
402Payment Required目前还不能使用此状态码
403 Forbidden禁止访问所请求的页面
404Not Found服务器无法找到所请求的页面
405Method Not Allowed请求中所指定的方法不被允许
406Not Acceptable服务器只能创建一个客户端无法接受的响应
407Proxy Authentication Required在请求被服务前必须认证一个代理服务器
408Request Timeout请求时间超过了服务器所能等待的时间,连接被断开
409Conflict请求有矛盾的地方
410Gone被请求的页面不再可用
411Length Required"Content-Length"没有被定义,服务器拒绝接受请求
412Precondition Failed请求的前提条件被服务器评估为false
413Request Entity Too Large因为请求的实体太大,服务器拒绝接受请求
414Request-url Too Long服务器拒绝接受请求,因为URL太长。多出现在把"POST"请求转换为"GET"请求时所附带的大量查询信息
415Unsupported Media Type服务器拒绝接受请求,因为媒体类型不被支持
417Expectation Failed
500Internal Server Error请求不完整,服务器遇见了出乎意料的状况
501Not Implemented请求不完整,服务器不提供所需要的功能
502Bad Gateway请求不完整,服务器从上游服务器接受了一个无效的响应
503Service Unavailable请求不完整,服务器暂时重启或关闭
504Gateway Timeout网关超时
505HTTP 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日夜

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值