JavaWeb阶段 - JSP学习总结

概述

  • JSP全称Java Server Pages,是一种动态网页开发技术,使用JSP标签在HTML网页中插入Java代码,简化Server编写
  • 只对网页中需动态产生的内容采用Java代码编写,静态内容则采用HTML网页方式编写
  • Servlet的缺陷(JSP出现的原因):写静态页面必须部署后才能看到效果,很难控制页面的外观
  • JSP以静态代码为主,Java代码为辅,Servlet反之
  • JSP从本质上来说内核还是Servlet,但与Servlet不是替代关系而是一种互补的关系
  • JSP适合于写显示层的动态页面(与HTML书写位置相同),而Servlet则适合写控制层的业务控制(页面转发,与java书写位置相同)
  • JSP的执行效率低于Servlet

运行原理

  • WEB容器接受到以.jsp为扩展名的URL访问请求时,将请求交给JSP引擎去处理,JSP引擎将它翻译成Servlet源程序,再编译成class类文件,之后由WEB容器装载执行
  • JSP规范没要求脚本代码必须采用Java语言,但JSP页面最终会转换为Java Servlet程序
  • eclipse中修改jsp模板编码:window → Preferences → Web → JSP Files → Encoding → 修改编码 → Apply and Close

生命周期

  • 1.访问jsp页面时,web容器查找是否有相关对象
  • 2.无则将.jsp翻译为.java文件,再编译为.class文件
  • 3.创建构造器,实例化对象
  • 4.执行_jspInit()方法,将对象放入WEB容器中
  • 5.执行_jspService()方法,处理业务逻辑,把信息响应回客户端(不调用doGet/doPost方法)
  • 6.若第一次访问有相关对象,则直接执行第5步
  • 7.长时间未调用,WEB容器会调用_jspDestroy()方法对jsp进行回收

注释

  • java格式注释
    • 编译器会忽略掉此类注释中的内容(客户端的源码看不见)
    • <%-- JSP注释,可多行 --%>
    • <%// java单行注释 %>
    • <%/* java 多行注释 */%>
    • <%/** java 文档注释 */%>
  • html格式注释
    • 编译器会执行注释中的代码(客户端的源码看得见)
    • <!-- html格式注释 -->
    • 缺点:页面注释信息太多的时候会增大服务器的负荷,注释信息需在网络上传输从而降低效率且不安全

指令元素(JSP标签)

  • 以<%@ 开始, 以%> 结束,用来设置整个JSP页面相关的属性(以键值对的形式存在,并用逗号隔开),如网页的编码方式和脚本语言
  • 指令元素主要有三种:page,include,taglib
page指令
  • <%@ page … %> 定义网页依赖属性,比如脚本语言、error页面、缓存需求等等
    • 在一个jsp文件中,至少有一个page指令元素,放在页面的最上面. 描述jsp页面的服务器端属性设置
  • 常用属性
    • language=“java” //表示脚本中使用的编程语言
    • contentType=“text/html; charset=UTF-8” //设置了内容的类型和静态页面的编码
    • pageEncoding=“UTF-8” //页面本身的编码格式
    • buffer=“8kb” //页面的缓存默认是8kb
    • session=“true” //相当于request.getSession(true)
    • errorPage=“路径” //表示当前jsp发生服务器端错误的时进入此路径(路径里要有isErrorPage="true"属性)
    • import //导入其他的包和类
      • <%@page import=“java.util.Date”%> //具体的包和类
      • <%@page import=“java.sql.*”%> //包下的所有类
      • <%@page import=“java.util., java.io., java.net.*”%> //连写,逗号分隔
    • session //指示当前的jsp是否参与会话(默认为true参与会话)
      • <%@page session=“false”%> //与session不可会话
Include指令
  • <%@ include … %> 包含其他文件
    • 把目标页面的内容放到当前页面,产生页面叠加以后的输出效果
  • 常用属性
    • file=“路径” //导入目标页面路径
Taglib指令
  • <%@ taglib … %> 引入标签库的定义
  • 常用属性
    • uri=“uri” //确定标签库的位置
    • prefix=“c” //指定标签库的前缀

基础语法

  • JSP的声明
    • <%! 代码 %>
    • 位于jsp转换为.java文件的service方法的外部,类的里面
    • 定义在产生的类文件中的类的属性和方法,也可声明内部类
    • 最先加载,可写于任何位置,无顺序
  • JSP代码段
    • <% 代码 %>
    • 位于jsp转换为.java文件的Service方法中
    • 书写Java语句、局部变量、输出或流程控制语句
    • 具有上下顺序
  • JSP表达式
    • <%= 代码 %>
    • 位于jsp转换为.java文件的Service方法中代码片断
    • 书写Java语言规范的表达式
    • 执行的顺序为从左到右,不能使用分号
    • 计算表达式的值,将值转换成String,用out.println发送标签,把数据输出至页面的当前位置

动作元素

  • 动作元素在请求处理阶段起作用,为请求处理阶段提供信息,遵循XML元素的语法,利用JSP动作可以动态地插入文件、重用JavaBean组件、把用户重定向到另外的页面、为Java插件生成HTML代码
  • Include动作
    • 形式:<jsp:include page=“url”> </jsp:include>
    • 等价于Servlet中通过RequestDispatcher.include()
    • 用来包含静态和动态的文件,该动作把指定文件插入正在生成的页面
    • 与include指令不同的是,include指令是在JSP文件被转换成Servlet的时候引入文件,而Include动作是在页面被请求的时候
    • 传参:<jsp:param name=“name” value=“value”/>
    • 属性
      • page:包含在页面中的相对URL地址
      • flush:布尔属性,定义在包含资源前是否刷新缓存区
  • forward动作
    • 形式:<jsp:forward page=“url”> </jsp:forward>
    • 等价于Servlet中通过RequestDispatcher.forward()
    • 该动作把请求转到另外的页面
    • 传参:<jsp:param name=“name” value=“value”/> //写在forward动作中
  • useBean动作
    • 形式:<jsp:useBean id=“name” class=“完整包名”/>
    • 用来装载一个将在JSP页面中使用的JavaBean(Java组件)
  • setProperty动作
    • 形式:<jsp:setProperty name=“BeanIdName” property=“Bean属性名”/>
    • 设置已经实例化的Bean对象的属性,与useBean连用
  • getProperty动作
    • 形式:<jsp:getProperty name=“BeanIdName” property=“Bean属性名”/>
    • 获得已经实例化的Bean对象的属性,转换成字符串,与useBean连用

内置对象

  • 也称隐式对象,是JSP容器为每个页面提供的Java对象,可以直接使用
对象描述
page当前类的当前对象等同于编译后的Servlet,类似于Java类中的this关键字
pageContextPageContext类的实例,提供对JSP页面所有对象以及命名空间的访问
requestHttpServletRequest类的实例,Http请求对象
responseHttpServletResponse类的实例,Http响应对象
sessionHttpSession类的实例,会话对象
applicationServletContext类的实例,定义全局属性,应用上下文
configServletConfig类的实例,用于访问Servlet或者JSP引擎的初始化参数,需要在web.xml中,针对jsp进行配置
outJspWriter类的实例,用于输出,往浏览器写内容
exceptionException类的对象,包装了从先前页面中抛出的异常信息
  • 范围对象
    • pageContext对象:主要用于存取属性,是page的上下文
      • Object getAttribute(String name, int scope) //获取name属性
      • Enumeration getAttributeNamesInScope(int scope) //获取所有属性范围为scope的属性名称
      • void removeAttribute(String name, int scope) //移除属性名称为name的属性对象
      • void setAttribute(String name, Object value, int scope) //设置属性名称为name的属性对象
      • Exception getException() //获取目前网页的异常,不过此网页要为error page
      • JspWriter getOut() //获取目前网页的输出流
      • Object getPage() //获取目前网页的Servlet
      • ServletRequest getRequest() //获取目前网页的请求
      • ServletResponse getResponse() //获取目前网页的响应
      • ServletConfig getServletConfig() //获取目前此网页的ServletConfig
      • ServletContext getServletContext() //获取目前此网页的执行环境(context)
      • HttpSession getSession() //获取和目前网页有联系的会话(session)
    • request对象:获取请求的来源、标头、cookies和请求相关的参数值等等
      • void setAttribute(String name, Object value) //设定name属性的值为value
      • Enumeration getAttributeNamesInScope(int scope) //获取所有scope范围的属性
      • Object getAttribute(String name) //获取name属性的值
      • void removeAttribute(String name) //移除name属性的值
      • String getParameter(String name) //获取name的参数值
      • Enumeration getParameterNames() //获取所有的参数名称
      • String[] getParameterValues(String name) //获取所有name的参数值
      • Map getParameterMap() //获取一个要求参数的Map
      • String getHeader(String name) //获取name的标头
      • Enumeration getHeaderNames() //获取所有的标头名称
      • Enumeration getHeaders(String name) //获取所有name的标头
      • int getIntHeader(String name) //获取整数类型name的标头
      • long getDateHeader(String name) //获取日期类型name的标头
      • Cookie[] getCookies() //获取与请求有关的cookies
      • String getContextPath() //获取Context路径
      • String getMethod() //获取HTTP的方法
      • String getProtocol() //获取使用的协议
      • String getQueryString() //获取请求的参数字符串
      • String getRequestedSessionId() //获取用户端的Session ID
      • String getRequestURI() //获取请求的URL,但是不包括请求的参数字符串
      • String getRemoteAddr() //获取用户的IP 地址
      • String getRemoteHost() //获取用户的主机名称
      • int getRemotePort() //获取用户的主机端口
      • String getRemoteUser() //获取用户的名称
      • void getCharacterEncoding(String encoding) //设定编码格式,用来解决窗体传递中文的问题
    • session对象:表示目前个别用户的会话
      • void setAttribute(String name, Object value) //设定指定名字的属性的值
      • Object getAttribute(String name) //获取指定名字的属性的值
      • void removeAttribute(String name) //删除指定名字的session属性
      • void invalidate() //取消session对象,并将对象存放的内容完全抛弃
      • String getId() //获取session的ID
      • long getMaxInactiveInterval() //获取最大session不活动的时间,若超过这时间,session将会失效
      • void setMaxInactiveInterval(int interval) //设定最大session不活动的时间,若超过这时间,session将会失效
      • long getCreationTime() //获取session产生的时间,单位是毫秒
      • long getLastAccessedTime() //获取用户最后通过这个session送出请求的时间
      • boolean isNew() //判断session是否为"新"的会话
    • application对象:存取ServletContext中的信息
      • int getMajorVersion() //获取Container主要的Servlet API版本
      • int getMinorVersion() //获取Container次要的Servlet API版本
      • String getServerInfo() //获取Container的名称和版本
      • String getMimeType(String file) //获取指定文件的MIME类型
      • ServletContext getContext(String uripath) //获取指定Local URL的Application context
      • String getRealPath(String path) //获取本地端path的绝对路径
      • void log(String message) //将信息写入log文件中
      • void log(String message, Throwable throwable) //将stack trace所产生的异常信息写入log文件中
  • 其他对象
    • response对象:将处理数据后的结果传回到客户端
      • 设定表头的方法
      • void addCookie(Cookie cookie) //新增cookie
      • void addDateHeader(String name, long date) //新增long类型的值到name标头
      • void addHeader(String name, String value) //新增String类型的值到name标头
      • void addIntHeader(String name, int value) //新增int类型的值到name标头
      • void setDateHeader(String name, long date) //指定long类型的值到name标头
      • void setHeader(String name, String value) //指定String类型的值到name标头
      • void setIntHeader(String name, int value) //指定int类型的值到name标头
      • 设定响应状态码的方法
      • void sendError(int sc) //传送状态码
      • void sendError(int sc, String msg) //传送状态码和错误信息
      • void setStatus(int sc) //设定状态码
      • String encodeRedirectURL(String url) //对使用sendRedirect()方法的URL予以编码
    • out对象:以字符流的形式输出数据
      • void clear() //清除输出缓冲区的内容
      • void clearBuffer() //清除输出缓冲区的内容
      • void close() //关闭输出流,清除所有的内容
      • int getBufferSize() //获取目前缓冲区的大小(KB)
      • int getRemaining() //获取目前使用后还剩下的缓冲区大小(KB)
      • boolean isAutoFlush() //获取true表示缓冲区满时会自动清除;false表示不会自动清除并且产生异常处理
    • exception对象
      • getMessage() //获取异常信息
      • getLocalizedMessage() //获取本地化后的信息
      • printStackTrace(new java.io.PrintWriter(out)) //打印日志
    • config对象
      • String getInitParameter(name) //获取名称为name的初始参数的值
      • Enumeration getInitParameterNames() //获取所有初始参数的名称集合
      • ServletContext getServletContext() //获取ServletContext对象
      • Sring getServletName() //获取编译后的Servlet名称

表达式语言(EL)

jsp默认就支持EL表达式,使得访问存储在JavaBean中的数据变得非常简单,为网页美工而设,使jsp趋向于html,EL不能进行逻辑处理,可以代替<%= 表达式%>代码部分

  • 语法
    • ${表达式} //表达式可为数字,字符串,布尔值,null
    • 用单引号或双引号定界
  • 运算符
    • 算术运算符:+, -,*,/(或 div),%(或 mod)
    • 关系运算符:==(或 eq),!=(或 ne),<(或 lt),>(或 gt),<=(或 le),>=(或 ge)
    • 逻辑运算符:&&(或 and),||(或 or),!(或 not)
    • 验证运算符:empty //${empty name}
  • 变量和JavaBean属性数据输出
    • 在范围对象中查找相应属性,而非直接在页面中查找实例或局部变量
    • 表达式语言查找变量的顺序是:pageContext→request→session→application //从小到大查找所有范围都未找到时,赋值null
  • 存取器
    • []:输出对象属性值,输出数组或集合中对应索引值
    • .:输出对象属性值
  • 隐含对象
EL隐藏对象JSP隐藏对象
pageScope/pageContextpageContext
requestScoperequest
sessionScopesession
applicationScopeappication
paramrequest.getParameter()
paramValuesrequest.getParameterValues()
headerrequest.getHeader()按照key-value的形式取出String类型值
headerValuesrequest.getHeader()按照key-value的形式取出String类型的集合
cookierequest.getCookies()
initParam上下文初始化参数

标准标签库(JSTL)

JSTL是一个JSP标签集合,减少java代码,简化页面编写,封装了JSP应用的通用核心功能

  • 步骤
    • 复制jstl的jar包(jstl.jar,standard.jar)到/WEB-INF/lib
    • 在使用jstl功能的jsp页面中增加指令
      • <%@taglib prefix=“c” uri=“http://java.sun.com/jsp/jstl/core”%> //核心标签库
      • <%@taglib prefix=“x” uri=“http://java.sun.com/jsp/jstl/xml”>
      • <%@taglib prefix=“fmt” uri=“http://java.sun.com/jsp/jstl/fmt”>
      • <%@taglib prefix=“sql” uri=“http://java.sun.com/jsp/jstl/sql”>
      • <%@taglib prefix=“fn” uri=“http://java.sun.com/jsp/jstl/functions”>
      • prefix表前缀(可改),uri 指向标签库的入口
  • 核心标签
    • <c:out/> //在JSP中显示数据
      • value=“要输出的内容”
      • default=“输出的默认值”
      • escapeXml=“false” //是否忽略XML特殊字符
    • <c:set/> //设置变量值和对象属性
      • value //要存储的值
      • target //要修改的属性所属的对象
      • property //要修改的属性
      • var //存储信息的变量
      • scope //var属性的作用域
    • <c:remove/> //移除一个变量
      • var //要移除的变量名称
      • scope //变量所属的作用域
    • <c:catch></c:catch> //处理产生错误的异常状况,并且将错误信息储存起来
      • var //用来储存错误信息的变量
    • <c:if></c:if> //判断表达式的值
      • var //用于存储条件结果的变量
      • test //条件
      • scope //var属性的作用域
    • <c:choose></c:choose> //相当于switch,<c:when></c:when> //相当于case,<c:otherwise></c:otherwise> //相当于default
      • test //条件
    • <c:forEach></c:forEach> //相当于for循环
      • var //代表当前条目的变量名称
      • begin //开始的元素
      • end //最后一个元素
      • step //迭代的步长
      • items //要被循环的信息
    • <c:forTokens></c:forTokens> //与c:forEach相似
      • delims //分隔符,其他属性与上相同
    • <c:import/> //jsp:include功能相同
      • url //需要检索和引入的页面的URL
      • charEncoding //所引入的数据的字符编码集
    • <c:url></c:url> //将URL格式化为一个字符串,然后存储在一个变量中
      • value //基础URL
      • context //本地网络应用程序的名称
      • var //代表URL的变量名
      • scope //var属性的作用域
    • <c:param> //指定c:url参数
      • name //URL中要设置的参数的名称
      • value //参数的值
    • <c:redirect> //重定向至一个新的URL
      • url //目标URL
      • context //紧接着一个本地网络应用程序的名称

版权声明:本文为weixin_45453240原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。