JSP总结

1、JSP由来?JSP和Servlet技术区别关系?

Servlet技术在生成动态网页时,需要通过response的输出流,通过print语句生成HTML源代码

Servlet生成HTML源代码,编程非常复杂,不利于美工页面人员维护 ,也不能使用Dreamweaver所见即所得开发工具进行调试

sun公司为了简化动态网页生成,推出JSP技术 ,可以说JSP技术就是Servlet技术,功能完全相同

2、JSP运行原理

JSP在执行时,会被服务器翻译为Servlet 编译执行, JSP以Servlet方式运行的 ------ JSP就是Servlet

* JSP 支持HTML语法,通过<% %> 嵌入java程序代码,Servlet 本身是一个java程序,不支持HTML

* JSP在运行时 翻译Servlet程序 保存tomcat/work 目录

3、JSP脚本元素

<%! %> JSP声明 <%= %> JSP脚本表达式 <% %> 脚本代码

<%! %> 生成内容 翻译Servlet程序成员变量、成员方法、内部类

<%= %> 翻译为 out.print ,在service方法内部,用于生成HTML页面源代码

<% %> 嵌入任何java程序代码,运行多个脚本块共同组合为一个java程序

一、 JSP注释

    支持三种注释 : JSP注释 <%-- --%> Java注释(文档注释 /** */ 多行注释 /* */ 单行注释 //) HTML注释 <!-- -->

   JSP注释 在JSP翻译为Servlet代码后消失 ,只存在于JSP源代码中

   Java注释 在Servlet程序执行后消失,不会被显示客户端HTML源代码中

   HTML注释 会在客户端HTML 源代码中保留 (在浏览器客户端执行 )

   * HTML注释 所以不能阻止 JSP代码和 Java代码的执行

二、JSP指令元素

   语法 <%@ 指令名称 属性名=值 属性名=值 属性名=值 ... %>

   1、page指令

   完成整个页面配置

   <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>

   还可以分开写多个指令

   <%@ page language="java" %>

   <%@ page contentType="text/html; charset=UTF-8" %>

   ... 

   * 只有import属性可以出现多次,其它属性一般只出现一次

   1) language 值必须是java ,可以不写默认也是 java

   2) extends 指定JSP翻译后Servlet继承哪个类,tomcat中默认继承 extends org.apache.jasper.runtime.HttpJspBase,一般不做修改,如果非要改,必须继承HttpServlet

   3) session 指定JSP翻译后Servlet是否可以直接使用内置对象session,默认true 可以直接使用

   * 如果session = true 翻译后生成以下两句代码

HttpSession session = null; 

session = pageContext.getSession();

   4) import 指定JSP翻译Servlet后 导入包

   * 如果使用 当前包和java.lang包 之外的类,必须通过import 导包

   import javax.servlet.*;

   import javax.servlet.http.*;

   import javax.servlet.jsp.*;

   * javax.servlet包 、javax.servlet.http包、javax.servlet.jsp包当中类,在JSP中使用时 不需要导包

   5) buffer和autoFlush 设置jsp中内置对象 out 的缓冲区大小 和是否自动输出

   *  pageContext = _jspxFactory.getPageContext(this, request, response, null, false, 8192, true);

   该方法最后两个参数,8192就是默认buffer大小,true代表 autoFlush 自动输出

   <%@ page buffer="16kb" autoFlush="false" %> 生成代码如下:

pageContext = _jspxFactory.getPageContext(this, request, response,null, false, 16384, false);

   6) errorPage和isErrorPage 设置 JSP发生错误后跳转页面,设置错误的处理页面(错误友好页面 )

   * 单个页面的友好页面设置,每个jsp都需要配置,十分麻烦

   * 通用错误页面配置 web.xml

<error-page>

    <error-code>500</error-code>

    <location>/500.jsp</location>

</error-page>

   * 错误处理页面中,通过设置isErrorPage=true 使用JSP内置对象 exception 获得异常信息

Throwable exception = org.apache.jasper.runtime.JspRuntimeLibrary.getThrowable(request);

    if (exception != null) {

      response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);

    }

   * IE浏览器无法显示错误友好页面解决:工具--internet选项 -- 高级 -- 将显示友好HTTP错误信息前面钩去掉

    7) contentType和pageEncoding : pageEncoding JSP和Servlet源文件编码,contentType设置Http响应内容编码

   8) isELIgnored 设置是否解析EL表达式,如果设置false 会对EL进行解析,如果设置true,不会对EL进行解析

   * 常用:import isErrorPage (配置错误页面 通用错误页面) contentType

   2、include指令 (进行页面布局)

   <%@ include file="filename"%>

   1) 包含内容注意: 被包含页面不需要 完整html结构 <html> <body> , 只需要编写HTML代码片段就可以了

   2) include指令包含原理 (静态包含原理)

   * file属性不能使用变量,不能携带参数  

   3、taglib指令

   用来引入标签定义文件

   <%@ taglib uri="" prefix="" >

   uri : 标签文件名称空间

   prefix : 前缀

 

=================================================================================================================================

三、JSP的内置对象

   什么叫内置对象:JSP翻译为Servlet后,在代码中已经存在对象,JSP页面可以直接使用这些对象

   service方法参数内: request、response

   方法内部定义6个

       PageContext pageContext = null;

       HttpSession session = null;

       ServletContext application = null;

       ServletConfig config = null;

       JspWriter out = null;

       Object page = this;

   如果jsp设置 isErrorPage=true

 Throwable exception = org.apache.jasper.runtime.JspRuntimeLibrary.getThrowable(request);

    if (exception != null) {

      response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);

    }

   request HttpServletRequest

   response HttpServletResponse

   session HttpSesssion

   application ServletContext

   config ServletConfig

   exception Throwable

   page       this (HttpServlet) ---- 就是Servlet,类型定义Object,不建议使用

   pageContext   PageContext

   out    JspWriter     

   Servlet三种数据范围 : request、session、ServletContext

   JSP存在四种数据范围 : page request session application

   * application 就是 ServletContext

   * page代表当前页面,保存数据到当前页面数据范围, 该数据只能在当前页面使用

 

   pageContext代表当前页面上下文

   1、常用操作一 :向 JSP 四个范围 存取数据

   setAttribute(String name, Object value, int scope)

   getAttribute(String name, int scope)

   * setAttribute(String name, Object value)  没有指定scope,默认将数据保存到page范围

   提供了 非常重要方法 findAttribute(String name)  : 按照 page - request - session - application 搜索 指定属性,找到了返回,如果都没有返回 null

 

   2、常用操作二:获取其它八个隐含对象

   意义:编写框架,获得pageContext一个对象,可以获得JSP 九个内置对象

    out对象, 可以用来向浏览器输出数据 (生成HTML源代码中)

JspWriter out = null;

   pageContext = _jspxFactory.getPageContext(this, request, response, null, true, 8192, true); // 最后两个参数与out缓冲区相关 

   out = pageContext.getOut(); 


==================================================================================================================================

四、JSP动作标签  (JSP Action )

   什么是标签: <XXX> </XXX> , 标签的背后是一段java代码的执行,编写了一个标签,相当于调用一段java代码 (标签用来简化 JSP中java代码的)

   请写出6个JSP动作标签 ?

   1、和JavaBean操作相关标签

   <jsp:useBean>

   <jsp:setProperty>

   <jsp:getProperty>  

   2、和jsp页面跳转相关

   <jsp:include> 

   <jsp:forward>

   <jsp:param>

   jsp:include标签效果 和 <%@include %>指令 相同

   语法 : <jsp:include page="url" />

   jsp:include 动态包含,包含目标jsp执行结果

   @include 静态包含,包含目标jsp翻译Servlet源代码

 

   jsp:forward 标签取到 JSP中转发的代码

   <jsp:forward page="/jsp/12.jsp"></jsp:forward> 等价于

   request.getRequestDispatcher("/jsp/12.jsp").forward(request,response);

   * <jsp:forward>之后的代码不执行

   * 传递参数通过request.setAttribute传递

 

===================================================================================================================================

EL 表达式语言

   EL :获取数据、执行运算、操作web中隐含对象、调用java函数

   JavaEE1.4(Servlet2.4/JSP 2.0)

   JavaEE5.0(Servlet2.5/JSP 2.1)

   JavaEE6.0(Servlet3.0/JSP 2.2) 

   EL从JavaEE1.4开始 被纳入官方规范, JavaEE1.4之前,web页面默认不支持 EL ------ 使用EL 必须通过isELIgnored=false 

 

   web工程中如何识别 web工程javaee版本  ---- web.xml  一        下代码表示Servlet2.5 , JavaEE5.0

<web-app version="2.5" 

    xmlns="http://java.sun.com/xml/ns/javaee" 

    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 

    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 

    http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> 

   下代码表示Servlet2.3 ,JavaEE1.3

<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd"> 

一、EL获取数据

   获得JSP四个范围的数据

<%

    pageContext.setAttribute("pageinfo","my page");

    request.setAttribute("requestinfo","my request");

    session.setAttribute("sessioninfo","my session");

    application.setAttribute("applicationinfo","my application");

%>

${pageScope.pageinfo }

${requestScope.requestinfo }

${sessionScope.sessioninfo }

${applicationScope.applicationinfo }

   ** 如果直接写 ${pageinfo} 自动从四个范围查找

    EL获得复杂对象,读取当中数据 ,复杂对象:数组、List集合、Map集合、Java对象

   如果数组 : ${pageScope.arr[0]} 取出数组下标为0 元素(第一个元素)

   如果List : ${pageScope.list[0]} 获得list集合对象 调用 get(0) 取出第一个元素

   如果map : ${pageScope.map.bbb} 相当于 map.get("bbb");

   如果java对象 : ${pageScope.person.name} 相当于 person.getName(); 调用 getName方法

 

   和[] 取值区别: 所有可以用.的地方都可以用[] 取代,如果属性名字是特殊字符(数字、含有.的名称 ),必须使用[]   

 

二 EL执行运算 (算术运行、比较运算、逻辑运算)

   算术运算: + = * / %

   比较运算: > < >= <= == !=

   逻辑运算:&& || !

 

   >          gt      greater than

   <          lt       less than

   >=       ge     greater eaquals

   <=       le      less equals

   ==      eq      equals

   !=       ne      not equals

   &&    and

   ||         or

   !          not

   * EL执行运算时,首先将内容转换为数字,再运算

   * ${a + 10} 如果 a不存在,运算的结果是 10

   * 运算必须写在一个 {}中, 典型错误 ${ ${a} + ${b} }

 

   empty运算符,判断对象是否不存在,集合是否为空

   二元表达式 : ${(empty username)? "用户名不存在":username }

 

三、EL常用web对象使用

 11 内置对象:

   pageContext 

   获得四个数据范围的数据

   pageScope

   requestScope

   sessionScope

   applicationScope              ( ${pageScope.name } ====== pageContext.getAttribute("name"))

=====================================================

   问题:getParameter 和 getAttribute 区别 ?

   getParameter 获得 HTTP中请求参数的值 : form表单提交:  get参数 url?name=zhangsan  post参数位于HTTP请求体 name=zhangsan  、超链接 : <a href="url?id=1" > 

   getAttribute 获得服务器端各种数据范围的值 request.getAttribute 获得request数据范围的值  (值在服务器端通过 request.setAttribute 保存的)

   getParameter 获得客户端提交的数据,getAttribute 服务器内部传递的数据

=====================================================

    param 、paramValues 用户获得请求参数的值

         ${param.name} ==== request.getParameter("name");

         ${paramValues.name} ===== request.getParameterValues("name");  

    header、headerValues 获得请求头信息的数据

         ${header["user-agent"]} ========== request.getHeader("user-agent");

         ${headerValues["user-agent"]} ============= request.getHeaders("user-agent");

    cookie 用来在开发中快速获得cookie的值  ------- 是一个Map<String,Cookie>

        ${cookie.name.value} 获得指定名称的cookie的value值

    initParam 用来快速读取ServletContext的全局初始化参数

         ${initParam.name } ===================== getServletContext().getInitParameter("name");                (<context-param> 配置全局参数)

 

    最常使用:cookie   ----------- ${cookie.name.value } 这里name是cookie的name值

                        pageContext ------------- ${pageContext.request.contextPath } ==== pageContext.getRequest().getContextPath() 返回 /day8

<!-- 编写一个链接 -->

<a href="/day8/el/1.jsp" >link</a>

<!-- 使用EL 获得工程名 -->

<a href="${pageContext.request.contextPath }/el/1.jsp" >link</a>
<!-- 快速获取IP -->
ip : ${pageContext.request.remoteAddr } 

 

四 使用EL表达式 ,执行Java方法

    * 将java方法进行配置,成为EL函数,才能调用

    编写自定义EL函数

        1、编写静态java方法

        2、在tld文件中描述java方法  (tld文件放到WEB-INF下)

                新建tld时 shortname 访问函数前缀 URI 名称空间

                将新建tld taglib 头进行修改

<taglib version="2.0" xmlns="http://java.sun.com/xml/ns/j2ee"

 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd">

                **** 参考tomcat/webapps/examples/WEB-INF/jsp2 有一个文件

<function>

    <!-- 自定义EL函数名称 -->

    <name>urlencode</name>

    <!-- EL函数对应java类完整类名 -->

    <function-class>cn.itcast.utils.URLOperation</function-class>

    <!-- static静态方法签名 -->

    <function-signature>java.lang.String urlencode(java.lang.String)</function-signature>

 </function>

        3、在jsp中引用tld文件,调用EL函数

 <!-- 通过taglib 引用 tld文件 -->
 <%@taglib uri="http://www.itcast.cn/myel" prefix="myel" %>

                调用 自定义 urlencode 格式 : ${prefix:方法名(参数)}

        在sun提供JSTL标签库中自带了一套EL函数库 (十六个和字符串操作相关函数)

        1、在web工程中导入jstl jar包

                将 jstl.jar 和 standard.jar 复制 WEB-INF/lib 下  

        2、在JSP中引用 EL函数库标签描述文件 (tld文件)

 <!-- 引用EL 官方tld 文件 -->
<%@taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>

 

============================================================================================================================

 

JSTL标签库 + EL 学习目的, 规范JSP的编写,在JSP内部 不写 <%%> Java代码

JSTL标签库: JSP标准标签库

* JSTL1.0  出现 JavaEE1.3 年代 ,EL是从JavaEE1.4才被纳入官方规范 ----- 默认 JSTL1.0标签不支持 EL表达式

 JSTL1.1存在两个jar包 jstl.jar(存放接口) standard.jar(存放实现类)

 首先将下载jar包 复制 工程/WEB-INF/lib下

 JSTL core标签库快速应用

        1、导入jar

        2、在jsp引用tld 描述文件  使用taglib指令

        在standard.jar/META-INF/ 很多 tld文件 ,每个tld文件应该是一组标签库

        <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> uri相当于当前标签名称空间,prefix 标签使用前缀

        在引用uri时候特别注意

                <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> ---- JSTL1.1

                <%@ taglib uri="http://java.sun.com/jstl/core" prefix="c" %> --- JSTL1.0 不支持EL

                <%@ taglib uri="http://java.sun.com/jstl/core_rt" prefix="c" %> --- JSTL1.0 支持EL

 

        JSTL 由 core fmt sql xml 和 EL函数库五部分组成

        * 因为数据库操作和 XML操作已经都用Servlet来实现了,不用JSP,所以不会使用 sql和xml 标签库

        * 使用JSP主要用来进行页面显示 只学习 core 和 fmt

 

        JSTL core标签库中 12个标签

                1、c:out 输出内容到浏览器端

                2、c:set 设置值到四种数据范围,设置四个范围中java对象的一个属性值

                3、c:remove 用来删除四个数据范围的数据

                4、c:catch 捕获程序异常

                5、c:if 取代页面中if条件语句,记住没有c:else

<c:if test="${m>5}" > </c:if>

<c:if test="${m<=5}"> <c:if>

                6、c:choose c:when c:otherwise 一起使用 ,取代if elseif else 结构 、switch-case 结构7、

                7、c:forEach 取代页面中for循环

                8、c:forTokens 切割字符串

                9、c:import 效果和include类似

                10、c:url 完成URL重写 (禁用cookie的session追踪 ) ---- 结合c:param完成 中文URL编码

                11、c:redirect 完成请求重定向

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值