首页 > 代码库 > JSP

JSP

1  什么是JSP

  a) html + java代码 + JSP动态标签

  b) 在静态页面上添加动态信息就可以了,如果是Servlet还需要一行一行的输出。

  c) 通常在前台开发人员给出静态页面后,后台开发人员只需在静AA态页面中添加动态信息即可,而不用再使用Servlet一行一行的去输出了。

2  JSP真身:Servlet

  a) 当客户请求的是JSP页面时,服务器会查看JSP对应的Servlet是否存在,如果存在,那么直接调用Servlet的service()方法来处理请求。如果不存在,那么服务器会先把JSP编译成.java,再把.java编译成.class,然后调用service()方法。当这个JSP页面,第二处理请求时,就直接调用直身的service()方法了。

技术分享

  b)JSP是Servlet,JSP与我们编写的Servlet有什么不同呢?通常我们编写的Servlet就不需要输出HTML代码了,而是转发到JSP页面。

  c)即Servlet不再负责显示页面,而由JSP来完成!而Servlet专注与控制层内容!

3 Java代码块

  a)JSP中的Java代码块就是最常见的动态信息。它分为三种:

    a)<%...%>:代码片段。代码片段会原模原样的出现在真身中,不会有变动。正常的Java代码都可以在代码片段中出现;

    b)<%=…%>:表达式。表达式会在“编译成Servlet”中输出,例如:<%=a%>,对应真身中的out.print(a)。只能出现常量、变量,以及有返回值的方法调用,而且不能出现分别!即在out.println()的合法参数都可以!

      <%=a%>对应out.println(a);

      <%=”a”%>对应out.println(“a”);

      <%=fun()%>对应out.println(fun());

      <%=a;%>对应out.println(a;),所以出错;

      <%=System.out.println(“hello”)%>对应out.println(System.out.println(“hello”)),所以出错。

    c)<%!...%>:声明。声明对应“真身”中的属性和方法!

 

        a)<%!...%>:声明。声明对应“真身”中的属性和方法!

        B)语法:<%! java语句;%>

        C)作用:定义成员属性、方法,静态代码块。

          1>Jsp声明中的java代码被翻译到_jspService方法的外面。

          2>可用于定义JSP页面转换成的Servlet程序的静态代码块、成员变量和方法 。

          3>JSP隐式对象的作用范围仅限于Servlet的_jspService方法,所以在JSP声明中不能使用这些隐式对象。

        d) JSP只有一种注释:<%-- … --%>,注释中的内容会被JSP编译系统忽略!

        e) HTML的注释:<!-- … -->,因为最终向客户端响应的内容还是HTML,所以在HTML注释中的内容还是看不内的。但是可以通过在浏览器中右键à查看源代码,查看<!-- … -->中的内容。

 

    <!-- <%=String.format("%tF %<tT", new Date())%> -->

    <%-- <%=String.format("%tF %<tT",   new Date())%> --%>

 

5、JSP指令

     作用:不是给JSP用的,写在JSP中的。给JSP引擎(服务器)用的。SP中有三大指令:page、include、taglib,最为常用,也最为复杂的就是page指令了。指令在“servlet”中不存在,生成“servlet”时需要使用指令!Tomcat编译系统会根据JSP的指令信息来编译JSP,生成Java文件。在生成的Java文件中,不存在指令信息!

     语法:<%@ 指令名称 属性1="值1" 。。。%>

      举例:<%@ page contentType="text/html;charset=gb2312"%>

    page:

          属性:

            language:指示JSP中使用脚本语言。默认是java,目前只支持java。

            extends:指示JSP生成的那个Servlet的爸爸是谁。不要修改。

            *import:JSP中java脚本用到的类导入。java代码中的import一样的。

                        import="java.io.*,java.util.Date"

            *session:默认值是true。指示是否创建HttpSession对象。

            *buffer:指示JSP中的输出流的缓存大小。默认8Kb。

            *isThreadSafe:指示JSP对应的Servlet是否是线程安全的。false才继承SingleThreadModel接口(过时了)

            *errorPage:当JSP出现异常时,转向的页面

                以下配置是全局错误信息

                 <error-page>

                    <exception-type>java.lang.Exception</exception-type>

                    <location>/error.jsp</location>

                  </error-page>

                  <error-page>

                    <error-code>404</error-code>

                    <location>/404.jsp</location>

                  </error-page>

            *isErrorPage:指示JSP对应的Servlet中是否产生exception内置对象。

            *contentType:作用就是response.setContentType("")

            *pageEncoding:指定JSP引擎读取JSP文件时使用的编码

 

               pageEncoding有双重作用,在实际开发中,指定为UTF-8即可

                        TOmcat会用UTF-8读JSP

                        同时JSP对应的Servlet字符输出流使用UTF-8,还告知了IE用UTF-8进行显示

            *isELIgnored:是否忽略EL表达式。默认是false。

 

    include:

          作用:包含.静态包含,多个文件翻译成一个文件

          动作指令:<jsp:include/>动态包含,文件还是独立的,但是服务器还是合一起输出

           静态包含比动态包含少占资源,能用静态就用静态包含.

                        技术分享

<jsp:include/>:静态包含

    <%@include file="2.jsp%>

<jsp:include/>:动态包含

     <%@include page="2.jsp%></jsp:include>

      <jsp:forward/>:转发

      <jsp:forward page="2.jsp"></jsp:forward>

    taglib:

          作用:引入外部标签

在JSP页面中使用第三方的标签库时,需要使用taglib指令来“导包”。例如:

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

其中prefix表示标签的前缀,这个名称可以随便起。uri是由第三方标签库定义的,所以你需要知道第三方定义的uri。

一、JSP九大隐式对象(记住):在JSP的java脚本或表达式中直接可以使用的对象

    1、原理:就是JSP对应的Servlet的service方法中的局部变量。

            注意,九大隐式对象是对象,不是范围

    2、九大隐式对象

        ----------------------------------

        引用变量名        |      类型

        ----------------------------------

        request             |        HttpServletRequest

        response          |        HttpServletResponse

        session             |        HttpSession   (不一定有 @page session="true")

        application      |        ServletContext

        config               |        ServletConfig

        page                |        this

        exception        |        java.lang.Throwable (不一定有 @page isErrorPage="true")

        ---------------------------------------------

     out              |        javax.servlet.jsp.JspWriter (作用和response.getWriter返回的PrintWriter功能一样)

        pageContext   |        javax.servlet.jsp.PageContext

 案例:

一般不要用自己new一个PrintWriter,然后调用writer()方法写入字符,否则会先刷PrintWriter中的缓存区字符,再关闭jsp的时候,发现jsp中的缓存中有数据,然后再刷jsp的缓存区数据到PrintWriter缓存中数据的后面

 out.write("a");

 response.getWriter().write("b");

会打印ba.

要想打印ab,有以下两个办法

1,刷新,把数据刷出来.

2,把缓存设置为0

exception对象不是所有页面都可以使用的,只能在错误页中可以使用!

二、out和pageContext

    因为字符输出流out和字节输出流InputStream不能同时存在

    所以在jsp中要进行下载,可以把所有不需要的字符都删掉.就不报错了

    要是有输出的字符,虽然仍然会下载成功,但是会报错.

    (记住)Tips:在JSP中尽量只输出字符,且尽量使用out内置对象。

    (灰常重要)javax.servlet.jsp.PageContext

   pageContext功能分为五部分:

    1、它本身(PageContext)是一个域对象,操作自身域对象数据:(PageContext的存活范围是当前页面,最小的范围)

             java.lang.Object getAttribute(java.lang.String name)

             void removeAttribute(java.lang.String name) 

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

    2、获取JSP中其它八个隐式对象

       它本身(PageContext)是一个域对象且能操作其他(ServletRequest HttpSession ServletContext)域对象中的内容

        操作其他三个域:

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

            void removeAttribute(java.lang.String name, int scope) 

            void setAttribute(java.lang.String name, java.lang.Object value, int scope) 
   pageContext.setAttribute( "p" ,  "pp" ); //设置页面域范围属性
   pageContext.setAttribute( "p" ,  "RP" ,pageContext. REQUEST_SCOPE ); //request域范围
   pageContext.setAttribute( "p" ,  "sp" ,pageContext. SESSION_SCOPE ); //session域范围
   pageContext.setAttribute( "p" ,  "cp" ,pageContext. APPLICATION_SCOPE );应用域范围

3、获取JSP中其它八个隐式对象

     java.lang.Exception getException() 

        java.lang.Object getPage() 

        javax.servlet.ServletRequest getRequest() 

        javax.servlet.ServletResponse getResponse() 

        javax.servlet.ServletConfig getServletConfig() 

        javax.servlet.ServletContext getServletContext() 

        javax.servlet.http.HttpSession getSession()

        JspWriter getOut()

4、从四个域作用范围中按pageContext,request,session,application顺序依次查找

 java.lang.Object findAttribute(java.lang.String name)

 Object obj = pageContext.findAttribute( "p" );

 从page request session application范围依次搜索,找到为止。

    5、提供了转发和包含功能的方便的方法

        void forward(java.lang.String relativeUrlPath)

        void include(java.lang.String relativeUrlPath)

 对照JSP真身(servlet)查看内置对象

我们发现,在JSP中的内容会出现在“真身”的_jspService()方法中,而且在_jspService()方法上方还有一些其实代码:

    public void _jspService(HttpServletRequest request,   HttpServletResponse response)

          throws java.io.IOException, ServletException {

 

      PageContext pageContext = null;

      HttpSession session = null;

      ServletContext application = null;

      ServletConfig config = null;

    JspWriter out = null;

      Object page = this;

      JspWriter _jspx_out = null;

      PageContext _jspx_page_context = null;

 

 

      try {

        response.setContentType("text/html;charset=UTF-8");

        pageContext = _jspxFactory.getPageContext(this, request, response,

                               null,   true, 8192, true);

        _jspx_page_context = pageContext;

        application = pageContext.getServletContext();

        config = pageContext.getServletConfig();

        session = pageContext.getSession();

        out = pageContext.getOut();

        _jspx_out = out;

 

    从这里开始,才是JSP页面的内容

     }…

 

JSP中的内容都出现在try块中,而且在try块的正文!上方是对隐藏对象的初始化!!!

上面代码只是给出普通页面的“真身”,而错误页面的“真身”你会看到exception对象的出现。

三、四大域对象(灰常重要)

    1、页面范围域对象pageContext(javax.servlet.jsp.PageContext):

            存放到此处的数据,只能当前页面使用。(使用很少)

    2、请求范围域对象request(javax.servlet.ServletRequest):显示完就没有了

            存放在此处的数据,只有转发才能传递给别人。(很高)

            应用场景:用在一些数据显示给用户后就没有用了。

    3、会话范围域对象session(javax.servlet.http.HttpSession):整个会话

            存放在此处的数据,只要是同一次就能取到。(很高)

            应用场景:一次请求产生了一些数据,当前用户日后可能还要用。典型的就是,登陆信息和购物车。

    4、应用范围域对象application(javax.servlet.ServletContext):整个应用

            存放在此处的数据,只要是同一个应用取到,不管是哪个客户端。(很少)。

            应用场景:存放全局数据。一定要做好同步处理。

四、JavaBean概念

1、什么才是一个JavaBean

        a、必须是public的

        b、必须有默认的构造方法。

        c、字段都是私有的。符合java命名规范。private boolean name;

        d、提供public的getter或setter方法。getName(isName只对boolean字段有效) setName(String name)  属性

        e、一般需要实现java.io.Serializable

2、在企业开发中JavaBean充当什么角色?封装数据

3、JSP中操作JavaBean的动作元素

        <jsp:useBean>:

            作用:按照指定的范围(scope)查找名称为id指定的对象。

                找到就找到了

                没有找到:调用默认构造方法创建对象(class),然后以id的名字放到socpe指定的域范围中

            属性:

                id:名称为id的对象

                class:调用默认方法创建对象(class)

                scope:默认值是page(页面范围)。可选值:page request(请求) session(会话) application(应用)

        <jsp:getProperty>

            作用:获取JavaBean中的属性值

            属性:

                name:那个JavaBean。该标签之前必须使用useBean.

                property:属性名称。切记:它对应的是getter方法,与字段名称无关。

                        name===getName()

            以下表示获取age的值

<jsp:getProperty  property="age"  name="p"/>

        <jsp:setProperty>

            作用:设置JavaBean中的属性值

            属性:

                name:那个JavaBean。该标签之前必须使用useBean.

                property:属性名称。切记:它对应的是setter方法,与字段名称无关。

                        name===setName(String name)

                value:设置的值

         以下表示设置p对象的name,设置的值为name的值

<jsp:setProperty  property="name"  name="p"  param="name"/>

六、JavaWeb开发模型

    模型1:JSP+JavaBean

    模型2:MVC+三层架构

        M:Model   JavaBean

        V:View    JSP

        C:Controller Servlet

技术分享

JSP