Jsp增强

Jsp加强

Jsp的三大指令

include指令

作用: 在当前页面用于包含其他页面
语法: <%@include file="common/header.jsp"%>

注意:
    1)原理是把被包含的页面(header.jsp)的内容翻译到包含页面(index.jsp)中,合并并翻译成一个java源文件,再编译运行!!,这种包含叫静态包含(源码包含)
    2)如果使用静态包含,被包含页面中不需要出现全局的html标签了!!!(如html、head、body)

page指令

    作用: 告诉tomcat服务器如何翻译jsp文件
<%@ page 
            language="java"      --告诉服务器使用什么动态语言来翻译jsp文件

            import="java.util.*" --告诉服务器java文件使用什么包
                                   导入包,多个包之间用逗号分割

            pageEncoding="utf-8" --告诉服务器使用什么编码翻译jsp文件(成java文件)

            contentType="text/html; charset=utf-8" --服务器发送浏览器的数据类型和内容编码 
                注意:在开发工具中,以后只需要设置pageEncoding即可解决中文乱码问题 

            errorPage="error.jsp" --指定当前jsp页面的错误处理页面。 

            isErrorPage="false"   --指定当前页面是否为错误处理页面。false,不是错误处理页面,则不能使用exception内置对象;true,是错误处理页面,可以使用exception内置对象。 

            buffer="8kb"     --jsp页面的缓存区大小 

            session="true"   --是否开启session功能。 false,不能用session内置对象;true,可以使用session内置对象。

            isELIgnored="false"  --是否忽略EL表达式
    %>

Jsp增强
错误处理页面

<%@ page 
    language="java" 
    import="java.util.*" 
    pageEncoding="utf-8"
    isErrorPage="true"
    %>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head> 
    <title>错误处理页面</title>  
  </head>

  <body>
  亲, 系统发生小小的错误,请耐心等待,管理员正在加紧抢修中...
  错误原理:<%=exception.getMessage() %>
  </body>
</html>

配置全局的错误处理页面

 <!-- 全局错误处理页面配置 -->
  <error-page>
    <error-code>500</error-code>
    <location>/common/500.jsp</location>
  </error-page>
  <error-page>
    <error-code>404</error-code>
    <location>/common/404.html</location>
  </error-page>

taglib

在JSTL中使用,导入标签的jar包
    <%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>

Jsp的内置对象

什么是内置对象

    在jsp开发中,会频繁使用到一些对象。例如HttpSession,ServletContext,ServletContext,HttpServletRequet。如果我们每次要使用这些对象都去创建这些对象就显示非常麻烦。所以Sun公司设计Jsp时,在jsp页面加载完毕之后就会自动帮开发者创建好这些对象,而开发者只需要直接使用这些对象调用方法即可!,这些创建好的对象就叫内置对象!!!!

    举例:
        servlet: 
                HttpSession session = request.getSession(true); (需要开发者做)

        jsp:
            tomcat服务器:  HttpSession session = request.getSession(true);(不需要开发者做)
            开发者做的: session.getId();

9大内置对象

内置对象名 类型
request HttpServletRequest
response HttpServletResponse
config ServletConfig
application ServletContext
session HttpSession
exception Throwable
page Object(this)
out JspWriter
pageContext PageContext



Out对象

    out对象类型,JspWriter类,相当于带缓存的PrintWriter

        PrintWriter: 
                write(内容): 直接向浏览器写出内容。

        JspWriter
                writer(内容): 向jsp缓冲区写出内容

    当满足以下条件之一,缓冲区内容写出:
            1)缓冲区满了
            2)刷新缓存区
            3)关闭缓存区
            4)执行完毕jsp页面
<%@ page language="java" import="java.util.*" pageEncoding="utf-8" buffer="1kb"%><%
        for(int i=1;i<=1024;i++){
            out.write("a");
        }
        //查看缓存区大小
        System.out.println("当前缓存区大小:"+out.getBufferSize());
        //查看缓存区剩余大小
        System.out.println("缓存区剩余大小:"+out.getRemaining());
        //刷新缓存
        //out.flush();
        response.getWriter().write("123");
     %>
  </body>
</html>

pageContext对象

    pageContext对象的类型是PageContext,叫jsp的上下文对象

1)可以获取其他八个内置对象

    public class 01_hello_jsp {
            public void _jspService(request,response){
                创建内置对象
                HttpSession session =....;
                ServletConfig config = ....;

                把8个经常使用的内置对象封装到PageContext对象中
                PageContext pageContext  = 封装;
                调用method1方法
                method1(pageContext);
            }

            public void method1(PageContext pageContext){
                希望使用内置对象
                从PageContext对象中获取其他8个内置对象
                JspWriter out =pageContext.getOut();
                HttpServletRequest rquest =     pageContext.getRequest();
                ........
            }
    }

            使用场景: 在自定义标签的时候,PageContext对象频繁使用到!!!

2)本身是一个域对象

            ServletContext context域
            HttpServletRequet  request域
            HttpSession    session域     --Servlet学习的
            PageContext   page域        --jsp学习的


        作用: 保存数据和获取数据,用于共享数据

        #保存数据
            1)默认情况下,保存到page域
                    pageContext.setAttribute("name");
            2)可以向四个域对象保存数据
                    pageContext.setAttribute("name",域范围常量)

        #获取数据
            1)默认情况下,从page域获取
                    pageContext.getAttribute("name")
            2)可以从四个域中获取数据
                    pageContext.getAttribute("name",域范围常量)

                域范围常量:
                    PageContext.PAGE_SCOPE
                    PageContext.REQUEST_SCOPE
                    PageContext..SESSION_SCOPE
                    PageContext.APPLICATION_SCOPE
            3)自动在四个域中搜索数据
                    pageContext.findAttribute("name");
                顺序: page域 -> request域 -> session域- > context域(application域)

Jsp中的四个域对象

        四个域对象:
                pageContext      page域              
                request          request域
                session          session域
                application       context域

        1)域对象作用:
                保存数据  和 获取数据 ,用于数据共享。

        2)域对象方法:
                setAttribute("name",Object) 保存数据
                getAttribute("name")  获取数据
                removeAttribute("name") 清除数据

        3)域对象作用范围:
                page域: 只能在当前jsp页面中使用(当前页面)
                request域: 只能在同一个请求中使用(转发)
                session域: 只能在同一个会话(session对象)中使用(私有的)
                context域: 只能在同一个web应用中使用。(全局的)

Jsp的最佳实践

        Servlet技术: 开发动态资源。是一个java类,最擅长写java代码
        jsp技术: 开发动态资源。通过java代码最擅长输出html代码。


        各取所长:
            在web项目中涉及到逻辑:
                1)接收参数      servlet做
                2)处理业务逻辑,返回结果    servlet做
                3)显示数据到浏览器      jsp做
                4)跳转到其他页面        servlet做


        servlet+jsp模式

          servlet:
                1)接收参数
                2)处理业务逻辑
                3)把结果保存到域对象中
                4)跳转到jsp页面
            Jsp:
                1)从域对象取出数据
                2)把数据显示到浏览器

        servlet的数据    ->   jsp页面
        List<Contact>    使用域对象 共享数据

EL表达式

EL作用

        jsp的核心语法: jsp表达式 <%=%>和 jsp脚本<%  %>。
        以后开发jsp的原则: 尽量在jsp页面中少写甚至不写java代码。

        使用EL表达式替换掉jsp表达式

        EL表达式作用: 向浏览器输出域对象中的变量值或表达式计算的结果!!!

        语法: ${变量或表达式}

EL语法

    1)输出基本数据类型变量
            1.1 从四个域获取
                    ${name}
            1.2 指定域获取
                    ${pageScope.name}
              域范围: pageScope / requestScope / sessionScope / applicationScope
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head> 
    <title>EL语法</title>  
  </head>

  <body>
    <%
     String name = "rose";  
     //放入域中
     //pageContext.setAttribute("name",name);
     pageContext.setAttribute("name",name,PageContext.REQUEST_SCOPE); 
      %>
      <%=name %>
      <br/>
      <%--
      1)从四个域自动搜索
       --%>
      EL表达式: ${name }
      <%--
        ${name } 等价于
            <%=pageContext.findAttribute("name")%>
       --%>
       <%--
        2) 从指定的域中获取数据
        --%>
        EL表达式: ${pageScope.name }
        <%--
            ${pageScope.name } 等价于
             <%= pageContext.getAttribute("name",PageContext.PAGE_SCOPE)%>

         --%>
  </body>
</html>
       2)输出对象的属性值
                Student
       3)输出集合对象
               List  和 Map
<%@ page language="java" import="java.util.*,gz.itcast.b_entity.*" pageEncoding="utf-8"%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head> 
    <title>EL输出不同类型的数据</title>  
  </head>

  <body>
    <%--
        1)EL输出对象的属性    
     --%>
     <%
        //保存数据
        Student student = new Student("eric",20);
        //放入域中
        pageContext.setAttribute("student",student);

        //List
        List<Student>  list = new ArrayList<Student>();
        list.add(new Student("rose",18));
        list.add(new Student("jack",28));
        list.add(new Student("lucy",38));
        //放入域中
        pageContext.setAttribute("list",list);

        //Map
        Map<String,Student> map = new HashMap<String,Student>();
        map.put("100",new Student("mark",20));
        map.put("101",new Student("maxwell",30));
        map.put("102",new Student("narci",40));
        //放入域中
        pageContext.setAttribute("map",map);

      %>

      <%--使用EL获取对象 --%>
      ${student.name} - ${student.age }
      <%--
       ${student.name} 等价于     (点相对于调用getXX()方法)
          <%=((Student)pageContext.findAttribute("student")).getName()%>
       --%>

       <hr/>
       <%--使用EL获取List对象 --%>
       ${list[0].name } - ${list[0].age }<br/>
       ${list[1].name } - ${list[1].age }<br/>
       ${list[2].name } - ${list[2].age }
       <%--
       list[0]等价于       (中括号相对于调用get(参数)方法)
            ((List)pageContext.findAttribute("list")).get(0)
        --%>
        <hr/>
        <%--使用EL获取Map对象 --%>
        ${map['100'].name } -  ${map['100'].age }<br/>
        ${map['101'].name } -  ${map['101'].age }<br/>
        ${map['102'].name } -  ${map['102'].age }<br/>
  </body>
</html>
        4)EL表达式计算
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head> 
    <title>EL表达式计算</title>  
  </head>

  <body>
    <%--
        1)算术表达式
          +  -  *  /
     --%>
         ${10+5 }<br/>
         ${10*5 }
         <hr/>
     <%--
        2)比较运算
        >  <  >=  <=  ==   !=
     --%>
         ${10>5 }<br/>
         ${10<5 }<br/>
         ${10!=10 }
         <hr/>
     <%--
        3)逻辑运算
         &&  ||  !
     --%>
         ${true && false }<br/>
         ${true || false }<br/>
         ${!false }<br/>
         <hr/>
      <%--
        4)判空
        null 或 空字符串:  empty
     --%>
         <%
            //String name = "eric";
            //String name = null;
            String name = "";
            pageContext.setAttribute("name",name);
          %>
          判断null: ${name==null }<br/>
          判断空字符: ${name=="" }<br/>
          判空:  ${name==null || name=="" }
          另一种判空写法: ${empty name }       
  </body>
</html>