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

  • 相关阅读:
    爬虫实践-微博关键词搜索抓取
    爬虫实践-拉勾网测试经理JD抓取【2018.05.15】
    爬虫实践--租房信息查找
    服务器python发送mail无法发出问题
    我的面试流程梳理
    字典树模板(前缀查找、整串查找)
    搬运工程 启动!
    开始收集模板啦!
    WPS表格中不能输入中文 or其他
    ubunt命令
  • 原文地址:https://www.cnblogs.com/lulu638/p/4256194.html
Copyright © 2011-2022 走看看