一、jsp静态包含和动态包含的区别

  在学习request对象的时候,我们曾经使用过request.getRequestDispatcher(String url).include(request,response)来对页头和页尾面进行包含。inclue指令也是做这样的事情,一起来试验一下吧。

这是页头

   <%@ page contentType="text/html;charset=UTF-8" language="java"   %>

    <html>

        <head>

            <title>页头</title>

        </head>

        <body>

        我是页头

        <br>

        <br>

        <br>

        </body>

    </html>

这是页尾

 <%@ page contentType="text/html;charset=UTF-8" language="java" %>

    <html>

    <head>

        <title>页尾</title>

    </head>

    <body>

    我是页尾

    </body>

    </html>

在index.jsp中把页头和页尾包含进来

  <%@ page contentType="text/html;charset=UTF-8" language="java" %>

    <html>

    <head>

        <title>包含页头和页尾进来</title>

    </head>

    <body>

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

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

    </body>

    </html>

  ● include指令是静态包含。静态包含的意思就是:把文件的代码内容都包含进来,再编译!

  ● include行为是动态包含其实include行为就是封装了request.getRequestDispatcher(String url).include(request,response)。

include行为语法是这个样子的

    <jsp:include page=""/>

  ● jsp行为包含文件就是先编译被包含的页面,再将页面的结果写入到包含的页面中(index.jsp)

  当然了,现在有静态包含和动态包含,使用哪一个更好呢?答案是:动态包含。动态包含可以向被包含的页面传递参数(用处不大),并且是分别处理被包含页面的(将被包含页面编译后得出的结果再写进包含页面)【如果有相同名称的参数,使用静态包含就会报错!】!

总结

  ● <%@include file="xxx.jsp"%>为jsp中的编译指令,其文件的包含是发生在jsp向servlet转换的时期,而<jsp:include page="xxx.jsp">是jsp中的动作指令,其文件的包含是发生在编译时期也就是将java文件编译为class文件的时期

  ● 使用静态包含只会产生一个class文件,而使用动态包含会产生多个class文件

  ● 使用静态包含,包含页面和被包含页面的request对象为同一对象,因为静态包含只是将被包含的页面的内容复制到包含的页面中去;而动态包含包含页面和被包含页面不是同一个页面,被包含的页面的request对象可以取到的参数范围要相对大些,不仅可以取到传递到包含页面的参数,同样也能取得在包含页面向下传递的参数

二、jsp有哪些内置对象?作用分别是什么?

九个内置对象:

  ● pageContext

  ● page

  ● config

  ● request

  ● response

  ● session

  ● application

  ● exception

  ● out

  其中,request、response、session、application、config这五个对象和Servlet的API是一样的。这5个对象我就不解释了。在JSP中,尤其重要的是pageContext对象pageContext是内置对象中最重要的一个对象,它代表着JSP页面编译后的内容(也就是JSP页面的运行环境)

pageContext对象

  既然它代表了JSP页面编译后的内容,理所当然的:它封装了对其他8大内置对象的引用!也就是说,通过pageContext可以获取到其他的8个内置对象

   <%@ page contentType="text/html;charset=UTF-8" language="java" %>

    <html>

    <head>

        <title>获取八大内置对象</title>

    </head>

    <body>

    <%

        System.out.println(pageContext.getSession());

        System.out.println(pageContext.getRequest());

        System.out.println(pageContext.getResponse());

        System.out.println(pageContext.getException());

        System.out.println(pageContext.getPage());

        System.out.println(pageContext.getServletConfig());

        System.out.println(pageContext.getServletContext());

        System.out.println(pageContext.getOut());

    %>

    </body>

</html>

● pageContext作为域对象

  类似于request,session,ServletContext作为域对象而言都有以下三个方法:

    ● setAttribute(String name,Objcet o)

    ● getAttribute(String name)

    ● removeAttribute(String name)

  当然了,pageContext也不例外,pageContext也有这三个方法。pageContext本质上代表的是当前JSP页面编译后的内容,作为域对象而言,它就代表着当前JSP页面(也就是page!也就是说:pageContext域对象只在page范围内有效,超出了page范围就无效了。

  pageContexst还有这么一个方法:findAttribute(String name),该方法会查找各个域的属性,从小到大开始寻找,也就是page—>request->session->application

out对象:

  out对象用于向浏览器输出数据,与之对应的是Servlet的PrintWriter对象。然而这个out对象的类型并不是PrintWriter,是JspWriter。我们可以简单理解为:JspWriter就是带缓存的PrintWrieter。

out对象的原理如下:

  只有向out对象中写入了内容,且满足如下任何一个条件时,out对象才去调用ServletResponse.getWriter方法,并通过该方法返回的PrintWriter对象将out对象的缓冲区中的内容真正写入到Servlet引擎提供的缓冲区中:

  ● 设置page指令的buffer属性关闭了out对象的缓存功能

  ● out对象的缓冲区已满

  ● 整个JSP页面结束

  一般我们在JSP页面输出都是用表达式(<%=%>),所以out对象用得并不是很多!

page对象

  内置对象page是HttpJasPage对象,其实page对象代表的就是当前JSP页面,是当前JSP编译后的Servlet类的对象。也就是说:page对象相当于普通java类的this

exception对象

  内置对象exception是java.lang.Exception类的对象,exception封装了JSP页面抛出的异常信息。exception经常被用来处理错误页面

总结

  1.request 用户端请求,此请求会包含来自GET/POST请求的参数

  2.response 网页传回用户端的回应

  3.pageContext 网页的属性是在这里管理,代表的编译后JSP内容

  4.session 与请求有关的会话期

  5.application servlet 正在执行的内容

  6.out 用来传送回应的输出

  7.config servlet的构架部件

  8.page JSP网页本身

  9.exception 针对错误网页,未捕捉的例外

三、jsp和servlet的区别、共同点、各自应用的范围?

  ● JSP是Servlet技术的扩展,本质上就是Servlet的简易方式。JSP编译后是“类servlet”。

  ● Servlet和JSP最主要的不同点在于:Servlet的应用逻辑是在Java文件中,并且完全从表示层中的HTML里分离开来。而JSP的情况是Java和HTML可以组合成一个扩展名为.jsp的文件。

  ● JSP侧重于视图,Servlet主要用于控制逻辑。

1.属性作用域范围

  ● page【只在一个页面中保存属性,跳转页面无效】

  ● request【只在一次请求中保存属性,服务器跳转有效,浏览器跳转无效】

  ● session【在一个会话范围中保存属性,无论何种跳转均有效,关闭浏览器后无效】

  ● application【在整个服务器中保存,所有用户都可以使用】

2.应用场景:

  ● request:如果客户向服务器发请求,产生的数据,用户看完就没用了,像这样的数据就存在request域,像新闻数据,属于用户看完就没用的

  ● session:如果客户向服务器发请求,产生的数据,用户用完了等一会儿还有用,像这样的数据就存在session域中,像购物数据,用户需要看到自己购物信息,并且等一会儿,还要用这个购物数据结帐

  ● servletContext:如果客户向服务器发请求,产生的数据,用户用完了,还要给其它用户用,像这样的数据就存在servletContext域中,像聊天数据

四、写出5种JSTL常用标签

  <c:if>,<c:item>,<c:foreach>,<c:out>,<c:set>

五、写一个自定义标签要继承什么类

我们可以有两种方式来实现自定义标签:

  ● 传统方式,实现Tag接口(老方法)

  ● 简单方式,继承SimpleTagSupport类

SimpleTagSupport类的执行顺序(原理):

  ①WEB容器调用标签处理器对象的setJspContext方法,将代表JSP页面的pageContext对象传递给标签处理器对象

  ②WEB容器调用标签处理器对象的setParent方法,将父标签处理器对象传递给这个标签处理器对象。【注意,只有在标签存在父标签的情况下,WEB容器才会调用这个方法】

  ③如果调用标签时设置了属性,容器将调用每个属性对应的setter方法把属性值传递给标签处理器对象。如果标签的属性值是EL表达式或脚本表达式,则WEB容器首先计算表达式的值,然后把值传递给标签处理器对象。

  ④如果简单标签有标签体,容器将调用setJspBody方法把代表标签体的JspFragment对象传递进来

  ⑤执行标签时:容器调用标签处理器的doTag()方法,开发人员在方法体内通过操作JspFragment对象,就可以实现是否执行、迭代、修改标签体的目的。

总结

  SimpleTagSupport,一般调用doTag方法或者实现SimpleTag接口。

六、JSP是如何被执行的?执行效率比Servlet低吗?

  ● 当客户端向一个jsp页面发送请求时,Web Container将jsp转化成servlet的源代码(只在第一次请求时),然后编译转化后的servlet并加载到内存中执行,执行的结果response到客户端。

  ● jsp只在第一次执行的时候会转化成servlet,以后每次执行,web容器都是直接执行编译后的servlet,所以jsp和servlet只是在第一次执行的时候不一样,jsp慢一点,以后的执行都是相同的。

七、如何避免jsp页面自动生成session对象?为什么要这么做?

可以使用页面指令显式关掉,代码如下:

<%@ page session="false" %> 

八、jsp的缺点?

  1)不好调试

  2)与其他脚本语言的交互(可读性差)

九、说出Servlet和CGI的区别?

  ● Servlet处于服务器进程中,只会有一个servlet实例,每个请求都会产生一个新的线程,而且servlet实例一般不会销毁

  ● CGI:来一个请求就创建一个进程,用完就销毁,效率低于servlet

十、简述JSP的设计模式。

  在Web开发模式中,有两个主要的开发结构,称为模式一(Mode I)模式二(Mode II)。

  首先我们来理清一些概念:

   DAO(Data Access Object):主要对数据的操作,增加、修改、删除等原子性操作。

  ● Web层:界面+控制器,也就是说JSP【界面】+Servlet【控制器】。

  ● Service业务层:将多个原子性的DAO操作进行组合,组合成一个完整的业务逻辑。

  ● 控制层:主要使用Servlet进行控制。

  ● 数据访问层:使用DAO、Hibernate、JDBC技术实现对数据的增删改查。

  ● JavaBean用于封装数据,处理部分核心逻辑,每一层中都用到。

  模式一指的就是在开发中将显示层、控制层、数据层的操作统一交给JSP或者JavaBean来进行处理。模式一有两种情况:

  ● 完全使用JSP做开发:

    优点:

      开发速度贼快,只要写JSP就行了,JavaBean和Servlet都不用设计!

      小幅度修改代码方便,直接修改JSP页面交给WEB容器就行了,不像Servlet还要编译成.class文件再交给服务器!【当然了,在ide下开发这个也不算是事】

    缺点:

      程序的可读性差、复用性低、代码复杂!什么jsp代码、html代码都往上面写,这肯定很难阅读,很难重用!

  ● 使用JSP+JavaBean做开发:

    优点:

      程序的可读性较高,大部分的代码都写在JavaBean上,不会和HTML代码混合在一起,可读性还行的。

      可重复利用高,核心的代码都由JavaBean开发了,JavaBean的设计就是用来重用、封装,大大减少编写重复代码的工作!

    缺点:

      没有流程控制,程序中的JSP页面都需要检查请求的参数是否正确,异常发生时的处理。显示操作和业务逻辑代码工作会紧密耦合在一起的!日后维护会困难

  Mode II 中所有的开发都是以Servlet为主体展开的,由Servlet接收所有的客户端请求,然后根据请求调用相对应的JavaBean,并所有的显示结果交给JSP完成!,也就是俗称的MVC设计模式!

MVC设计模式:

  ● 显示层(View):主要负责接受Servlet传递的内容,调用JavaBean,将内容显示给用户

  ● 控制层(Controller):主要负责所有用户的请求参数,判断请求参数是否合法,根据请求的类型调用JavaBean,将最终的处理结果交给显示层显示!

  ● 模型层(Mode):模型层包括了业务层,DAO层。

总结

  (1)ModelI,JSP+JavaBean设计模式。

  (2)ModelII,MVC设计模式。

JSP知识点总结的更多相关文章

  1. JSP知识点大纲图

    这是我整理出来的JSP知识点大纲图,具体的内容都可以在我的博文中找到-.

  2. JSP知识点汇总

    有几种方法可以实现服务器内部跳转? 使用request对象提供的方法:request.getRequestDispatcher(String URI).forward(ServletRequest r ...

  3. JSP知识点大致介绍1

    解释:当jsp写好,运行服务器,还没有发出请求(写网址按Enter),Tomcat的work下是没有字节码文件的.当写网址:localhost:8888/xxxx/index.jsp按Enter,运行 ...

  4. JSP知识点

    1.九大内置对象: request HttpServletRequest类的实例 response HttpServletResponse类的实例 out PrintWriter类的实例,用于把结果输 ...

  5. jsp 知识点

    在JSP中很多对象是不需要创建的,如out.session等.它们可以直接使用. <% out.println(session.getId()); %>

  6. jsp 知识点总结

    JSP 入门案例(计算器的实现) 对于jsp 学习的一些总结 1.使用Dreamweaver 搭建网页 计算器 第一个数字 符号 + - * / 第二个数字 <form id="for ...

  7. JSP知识点回顾

  8. Servlet&JSP中的知识点

    先sun提出的是Servlet体系,这个体系使得使用JAVA的程序员也能开发基于B/S架构的WEB应用程序,使用Servlet类将HTTP请求和响应封装在标准JAVA类中来实现各种WEB应用方案.随着 ...

  9. JSP面试题都在这里

    下面是我整理下来的JSP知识点: 图上的知识点都可以在我其他的文章内找到相应内容. JSP常见面试题 jsp静态包含和动态包含的区别 jsp静态包含和动态包含的区别 在讲解request对象的时候,我 ...

随机推荐

  1. S2.1 修复图像小程序(简单版)

    用OpenCV自带的inpaint()演示 CV_EXPORTS_W void inpaint( InputArray src, InputArray inpaintMask, OutputArray ...

  2. Idea下的springboot mysql8.0等报错解决随笔

    cannot load jdbc class path:mysql8.0装载失败,可能原因,驱动名称错误,连接字符串中需要加入时区UTC,否则8.0一定会报错无法连接,关闭SSL 在applicati ...

  3. web基础要点记录

    最近公司项目做完了,不怎么忙,翻看了一些基础的资料,文章.就做了个简单的记录. 1.Chrome 中文界面下默认会将小于 12px 的文本强制按照 12px 显示, 可通过加入 CSS 属性  -we ...

  4. Jenkins pipeline job 根据参数动态获取触发事件的分支

    此文需要有Jenkins pipeline job 的简单使用经验 场景 我们日常的测试函数, 一般是不能仅仅在本地跑的,还需要一个公共的跑测试的环境,作为合并新的PR的依据. 如果用Jenkins ...

  5. 继承ipkPlayer中出现的一些错误汇总

    1.下载完ffmpeg后,我们再在终端执行下面两个命令: cd ios./compile-ffmpeg.sh clean./compile-ffmpeg.sh all 大体流程如下  这里如果出现 x ...

  6. Java 将容器 Map中的内容保存到数组

    import java.util.Map; import java.util.HashMap; import java.util.Map.Entry; public class mapToArr { ...

  7. Base64简单原理

    Base64要求把每三个8bit的字节转换为四个6bit的字节(即3*8 = 4*6 = 24) 1.例如我们有一个中文字符“中国(gb2312)”,转为十进制为:中-->54992,国--&g ...

  8. ubuntu18.04新体验

    虽然ubuntu18.04LST版本早出来了,但自己原来的ubuntu16.04还可以用,就懒得折腾了. 但最近ubuntu崩了,就想尝尝鲜...结果发现还挺好用的,准确地说,ubuntu是越来越好用 ...

  9. 【页面置换算法】LRC算法和FIFS算法

    算法介绍 FIFO:该算法总是淘汰最先进入内存的页面,即选择在内存中驻留时间最久的页面予以淘汰.该算法实现简单,只需把一个进程已调入内存的页面,按先后次序链接成一个队列,并设置一个指针,称为替换指针, ...

  10. cadence焊盘及元件封装制作

    前面学习了元件封装的制作,由于琐碎事情的耽误,加上学习python,没有及时的总结这部分内容,现在做一个补充!