JSP

时间:2014-05-01 11:40:19   收藏:0   阅读:489

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中配置:

mamicode.com,码迷
<!--配置通常错误提示页面-->
<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>
mamicode.com,码迷

               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}

mamicode.com,码迷
<!--获取数据-->
<%@ 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>
mamicode.com,码迷

       2. 执行运算

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

mamicode.com,码迷
<%@ 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>
mamicode.com,码迷

       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.自定义标签

 

四大作用域

JSP,码迷,mamicode.com

评论(0
© 2014 mamicode.com 版权所有 京ICP备13008772号-2  联系我们:gaon5@hotmail.com
迷上了代码!