zoukankan      html  css  js  c++  java
  • JSP

    1. JSP概论

    JSP(JavaServer Pages)是SUN公司提供的动态web资源开发技术,Servlet也是动态web资源开发技术,Servlet是java程序,适合用来处理业务逻辑,但是在java中输出HTML页面是一个非常繁琐的问题,且不利于查看。

    为了解决这一问题,所以开发了JSP 它改变了Servlet在java代码中嵌入HTML的过程,变成了在HTML中嵌入java代码,非常适合用在组织html页面进行输出。

    2. JSP原理:

    JSP在第一次被访问时,由服务器的内部的JSP引擎翻译为一个Servlet存放在(tomcat)work目录中,对JSP的访问最终是由Servlet执行并输出结果。

    对于JSP的HTML内容是以out.write()输出。

    JSP中的java代码,复制并翻译到Servlet中执行。

    注意:在翻译的Servlet中预定义了9大对象。在JSP中可以直接使用,这9大对象被称为JSP的9大隐式对象。

    3. JSP语法

    1.JSP模板元素

                直接书写在JSP中的html内容,最终会在翻译成Servlet的过程中,以out.wirte()输出。

    2.JSP脚本表达式

                <%java表达式%>在翻译过来的Servlet中,计算出表达式的值,并out.print()输出到浏览器。

    3.JSP脚本片断

                <%若干java语句%>在翻译过来的Servlet中,原样复制到对应的位置执行。

                     注意:

                              一个JSP中可以有多个脚本片断,多个片断之间可以相互引用。

                              一个JSP中的脚本片断可以是不完整的,但多个片断组合在一起必须是完整的。

    4.JSP声明

                <%!若干java语句%>在翻译过来的Servlet中,会放置在和service方法同级的位置,并成为类的成员。

    5.JSP注释

                <%--注释的内容--%>在被JSP注释的内容,在翻译成Servlet的过程中会被丢弃不会被翻译。

                //java注释 java注释在翻译成Servlet的过程中会被认为成java代码复制粘贴到相应位置,但在java文件编译成.class文件时,注释被丢弃。

                <!--html注释-->html注释,在翻译过来的Servlet的过程中会当作为模板元素,直接out.write()输出到浏览器中,浏览器能解析html注释,最终予显示。

                    注意:在JSP中,html注释为java语句,可能会影响运行结果。

    6.JSP指令

             <%@ 指令名  属性 = '值' %>指挥解析引擎如何处理JSP页面中的其它内容,不产生输出。可以写在任意位置,通常推荐写在JSP页面的最开始位置。

             1.page

                    language='java' 设置JSP当前使用的语言,只有一个值:java ,所以可以不写忽略。

                    extends='' 设置翻译过来的Servlet继承谁,通常不需要进行设置,默认继承的类就可以。

                    import='' 导入开发包,可以import多个开发包,多个开发包之间用,分割。

                    session='true|false' 设置翻译过来的Servlet是否自动生成session,如果当前JSP页面用不到session可设置为false,防止造成空间浪费。

                    errorpage='' 设置错误提示页面。当JSP抛出异常时,转发到错误提示页面,做出提示。

                          配置通用错误提示页面,在web.xml中配置:

    <!--配置通常错误提示页面-->
    <error-page>
        <error-code>500</error-code>
        <location>/error/500.jsp</locaton>
    </error-page>
    <error-page>
        <exception-type>java.lang.Throwable</exception-type>
        <location>/error/500.jsp</location>
    </error-page>

                   isErrorPage='' 默认为false。在错误提示页面中设置为true,则翻译过来的Servlet中会多了一个Exception对象,这个对象就代表当前页面抛出的异常。

                   content-type 设置response.setContentType()的值,通知服务器发送的编码和浏览器解打开的编码。

                   pageEncoding 设置JSP引擎以指定的编码读取JSP页面,从而翻译成Servlet,这个指定的设置编码要与JSP保存时的编码一致,否则会有乱码。pageEncoding会自动设置content-type。

             2.include

                   <%@include file=''%>    实现页面包含

                               静态包含:利用JSP指令包含,这种包含叫静态包含。这种包含是源文件内级别包装好,生成一个Servlet。

                               动态包含:除了JSP指令包含,其它方式叫动态包含。在访问时,每个Servlet分别产生输出,最终将输出的结果合并,是输出流级别的合并。

                             注意:从效率上考虑,静态包含效率较高。

             3.taglib

                <%@ taglib uri="" prefix=""%>用来引入标签库。
                             uri指定被引入.tld文件的名称空间
                             prefix 对该名称空间的一个缩写

     

    4. JSP九大隐式对象

    在翻译引擎翻译JSP的过程中,自动在翻译成Servlet时预定义了九个变量,这九个变量可以不需要在JSP中定义直接使用,被称为JSP的九大隐式对象。

    page

    config

    appcation

    request

    response

    session

    out

    exception

    pagecontext

    5. pageContext

    代表整个JSP页面。

    1. 作为入口对象获取其它八大隐式对象

            getException方法返回exception隐式对象。

            getPage方法返回page隐式对象。

            getRequest方法返回request隐式对象。

            getResponse方法返回response隐式对象。

            getServletConfig方法返回config隐式对象。

            getServletContext方法返回appcation隐式对象。

            getSession方法返回session隐式对象。

            getOut方法返回out隐式对象。

    2. 作为域对象,同时也可以作为入口对象,操作四大域属性。

            作用范围:整个JSP页面。

            生命周期:随着JSP页面被访问开始而创建,随着访问结束而销毁。

            作用:在JSP页面范围内共享数据。

           

           public void setAttribute(java.lang.String name, java.lang.Object value,int scope)

           pageContext的setAttribute方法可以将参数或者java对象绑定到appcation对象、session对象、request对象、page对象,以下为scope取值范围:

               PageContext.APPLICATION_SCOPE    4  应用程序共享范围
                     PageContext.SESSION_SCOPE            3  会话共享范围 
                     PageContext.REQUEST_SCOPE            2  请求共享范围
                     PageContext.PAGE_SCOPE                  1  页面共享范围

    当scope参数的值为pageContext.SESSION_SCOPE时,调用PageContext对象的setAttribute()方法和调用session对象的putValue()方法是等效的,都是将某个参数或者Java对象和当前的session绑定起来。如果scope参数的值为如果scope参数的值为pageContext.APPLICATION_SCOPE,那么调用PageContext对象的setAttribute()方法和调用application对象的setAttribute()方法是等效的。


                 public java.lang.Object getAttribute(java.lang.String name,int scope)

           pageContext对象的方法getAttribute可以直接获取四大域互相绑定的参数或者java的对象的值。
                 public void removeAttribute(java.lang.String name,int scope)

           解除四大域绑定关系。
                
                 findAttribute(String name) 按照由小到大在四大作用域中搜寻指定名称的属性,如果找到则返回值,没找到返回null。

           

    3.方便的实现请求转发和请求包含

          request.getRequestDispatcher("").forward(request,response);

    等价于:pageContext.forward("...");

          request.getRequestDispathcer("").include(requset,response);

    等价于:pageContext.include("...");

    6.杂项

    1.映射JSP

    <servlet>

         <servlet-name>5JSP</servlet-name>

         <servlet-file>/5.jsp</servlet-file>

    </servlet>

    <servlet-mapping>

         <servlet-name>5JSP<servlet-name>

         <url-parrten>/xxx/5.jsp</url-parrten>

    </servlet-mapping>

    7.JSP标签

    在html中嵌入大量java代码同样页面很难看,不易于维护。为了解决这问题,SUN开发了标签技术,开发标签去替代JSP页面中的源代码。

    1.JSP标签

          <jsp:include>标签:实现页面包含。

          <jsp:foward>标签:实现页面转发。

          <jsp:param>标签:配合包含和转发时添加请求参数。

    2.EL标签

           一种表达式,可以在JSP中使用,实现如下四个功能 ${...}。

           1. 获取数据

                   获取常量:字符串,数字,布尔常量。

                   获取变量:在四大作用域中搜寻指定名称变量,如果没有找到则什么也不输出。

                         注意:

                                  el获取的变量必须在域中才可以获取。

                                  []与.的区别: 使用[]的地方都可以换成. 但是[]中有特殊字符时除外。

                                  el表达式只能获取值,不能设置值,也不能遍历数据。

                                  如果需要在JSP中写web应用名称,不要写死,也不要写java代码

                                  ${pageContext.request.contextPath}

    <!--获取数据-->
    <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
    <%@page import="com.itcast.domain.Person"%>
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
    <html>
      <head>
      </head>
      <body>
          <h1>EL获JavaBean的属性</h1>
          <%
              Person p = new Person();
              p.setName("金毛狮王");
              p.setAge(200);
              pageContext.setAttribute("p",p);
           %>
          ${p.name }
          ${p.name }
          ${p.age }
          <a href="${pageContext.request.contextPath }/index.jsp">xx</a>
          
          <h1>EL获Map中的数据</h1>
          <%
              Map map = new HashMap();
              map.put("name","张无忌");
              map.put("age",19);
              map.put("wugong","乾坤大挪移");
              map.put("wugong.2","九阳神功");
              pageContext.setAttribute("wugong","age");
              pageContext.setAttribute("map",map);
           %>
           ${map["wugong"] }
          xxx ${map[wugong] }xxx
           ${map["wugong.2"] }
          <h1>EL获集合中的数据</h1>
          <%
              List list = new ArrayList();
              list.add("张翠山");
              list.add("殷素素");
              list.add("无忌孩儿");
              list.add("赵敏");
              request.setAttribute("list",list);
           %>
           ${list[3] }
      
          <h1>EL获取数组中的数据</h1>
          <%
              String [] addrs = {"武昌","汉口","汉阳"};
              pageContext.setAttribute("ads",addrs);
           %>
           ${ads[1] }
          <h1>EL获取变量</h1>
          <%
              request.setAttribute("name","zhang");
           %>
          ${name }
          <h1>EL支持的常量:字符串  数字  布尔</h1>
          ${"abc" }
          ${123.234}
          ${false }
      </body>
    </html>

           2. 执行运算

               在el表达式中如果遇到非数字运算,会试图自动转换成数字,如果转换失败则报错。

    <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
    <html>
      <head>
      </head>
      <body>
      <h1>三元运算符</h1><hr>
      ${3>2 ? "yes":"no" }
      <h1>empty运算符</h1><hr>
      <%
          List list = new ArrayList();
          list.add("aaa");
          pageContext.setAttribute("list",list);
          
          String str = "sdf";
          pageContext.setAttribute("str",str);
          
       %>
      ${empty  list}
      ${empty str }
      <h1>el支持逻辑运算符</h1><hr>
          && and
          || or
          ! not
           ${!(3>2 && 3<1)}
      <h1>el支持比较运算</h1><hr>
          >   gt
          >=  ge
          <   lt
          <=  le
          ==  eq
          !=  ne
          ${3>2 }${5<3 }${3 ne 2 } ${3 eq 2 }
      <h1>el支持算数运算</h1><hr>
        ${3+2 }
        ${3*2 }
        ${3+"5"}
      </body>
    </html>

           3. 获取常用开发对象

                  el内置了11个对象,可以不存入域中就直接使用。

                  pageContext : 可以作为入口通过el获取八大隐式对象。

                

                  pageScope

                  requestScope

                  sessionScope

                  appcationScope

                  四大域中所有域属性组成的Map.

                    注意:这是Map,而不是四大作用域对象本身。

                  param            Map<String,String>

                  paramValues  Map<String,String[]>

                  代表当前请求中,所有请求参数组成的Map。

                  header           Map<String,String>

                  headerValues Map<String,String[]>

                  代表请求头组成的Map。

                  cookie           Map<String,Cookie>

                  cookie信息组成的Map

                  initParam      Map<String,String>

                  web初始化信息组成的Map

           4. 调用java方法,限于调静态的共有方法

                <1>写一个类包含要被调用的静态共有方法
                       <2>写一个tld描述文件,描述一下要被调用的方法 -- tld文件必须放置在WEB-INF目录下非classes和lib目录中
                       <3>再在jsp页面中使用taglib指令引入tld描述文件,从而在jsp页面中调用函数

    3.JSTL标签库

                  <c:out>标签:用于输出一段文本内容到pageContext对象当前保存的out对象中。

                  <c:set>标签:把某个对象存在指定域的范围内。或者设置web域中的java.util.Map类型的属性对象或javaBean类型的属性对象的属性。

                  <c:remove>标签:用于删除web域中的属性。

                  <c:catch>标签:用于捕获嵌套在标签体中的内容抛出的异常,其语法格式如下:

                                                      <c:catch [var="varName"]>nested actions</c:catch>

                  <c:if test=''>标签:可以构造“if-then”简单的判断表达式。

                 <c:choose>标签:用于指定多个条件选择的组合边界,它必须与<c:when>和<c:otherwise>标签一起使用。

                 使用<c:choose>,<c:when>和<c:otherwise>三个标签,可以构造类似 “if-else if-else” 的复杂条件判断结构。
                       <c:forEach>标签:用于对一个集合对象中的元素进行循环迭代操作,或者按指定的次数重复迭代执行标签体中的内容。 
                       <c:forTokens>标签:用来浏览一字符串中所有的成员,其成员是由定义符号所分隔的
                       <c:param>标签:在JSP页面进行URL的相关操作时,经常要在URL地址后面附加一些参数。

                 <c:param>标签可以嵌套在<c:import>、<c:url>或<c:redirect>标签内,为这些标签所使用的URL地址附加参数。
                       <c:import> 标签:实现include操作
                       <c:url>标签:用于在JSP页面中构造一个URL地址,其主要目的是实现URL重。

                                 URL重写就是将会话标识号以参数形式附加在URL地址后面 
                      <c:redirect>标签用于实现请求重定向

    4.自定义标签

     

    四大作用域

  • 相关阅读:
    ADO之connection
    函数及自定义函数
    母版页
    XHTML5 与 HTML 4.01的差异
    三层架构的使用
    ExecuteNonQuery&& ExecuteQuery 区别
    常用数据结构的时间复杂度
    图像处理(卷积)作者太棒了
    C#中标准Dispose模式的实现
    计算机网络知识点
  • 原文地址:https://www.cnblogs.com/zhanfuxing/p/3701693.html
Copyright © 2011-2022 走看看