zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    173. Binary Search Tree Iterator
    199. Binary Tree Right Side View
    230. Kth Smallest Element in a BST
    236. Lowest Common Ancestor of a Binary Tree
    337. House Robber III
    449. Serialize and Deserialize BST
    508. Most Frequent Subtree Sum
    513. Find Bottom Left Tree Value
    129. Sum Root to Leaf Numbers
    652. Find Duplicate Subtrees
  • 原文地址:https://www.cnblogs.com/lulu638/p/4256194.html
Copyright © 2011-2022 走看看