jsp简介

JSP技术入门和常用指令

1. JSP的由来

在前面的学习过程中,页面相关的内容主要是通过html文件完成,而Servlet技术主要是在获取浏览器(客户端)提交的请求数据,或者是给浏览器客户端响应数据。企业开发中,前端的页面html文件)相关设计和美化工作都是前端工程师(美工负责,后台的Java程序是由Java开发人员完成,前端给出的页面,不能满足后台开发人员的需求,这时就需要后台开发人员在Servlet中使用response获取输出流,拼接前端页面需要的html片段,这样会导致Servlet的Java代码十分的臃肿,而且不利于前端人员维护页面。导致前后人员之间合作出现问题。针对这些问题,sun公司设计出JSP技术来解决。

JSP技术:Java Server Page。它的主要功能可以直接JSP文件中书写html代码但是JSP文件最后会被翻译对应的Java代码。这个翻译工作不需要开发人员做任何的事情,而直接由Java对应的机制完成。这样就可以保证前端工程师可以直接针对JSP文件进行页面设计和修改,后台人员可以在JSP页面中添加对应的业务程序。后台人员不用再在Servlet中通过response输出大量的html片段。

其实不仅仅Java使用jsp技术代替html文件。微软的.net技术推出asp技术代替普通的html文件,php也推出了php技术代替html文件

2. 演示JSP文件

3. JSP的脚本元素

通过演示明白JSP文件本身html文件区别并不大,但是sun公司发明的JSP技术不仅仅是为了代替html文件,在JSP文件中还可以嵌入Java代码的。

如果需要在JSP文件中嵌入Java代码,必须按照特定的规则书写,否则就会出现翻译JSP文件报错。

JSP文件中嵌入Java代码有三种方式:1脚本声明2脚本表达式;3脚本片段

3.1. 脚本声明

脚本声明格式:

<%!  

  书写对应的Java代码

%>

脚本声明的东西: 成员变量, 成员方法, 内部类

3.2. 脚本表达式

脚本表达式格式:

<%=表达式  %>

表达式内容: 常量 变量 结果的输出

注意脚本表达式不能书写java代码的结束标记分号。

3.3. 脚本片段

脚本片段格式:首先说明,这种格式使用的非常少,而且书写的时候,一定留心!!!

<% Java代码 %>

  html代码

<% Java代码%>

只要在片段中的Java代码合并之后,没有语法错误即可。

4. 脚本翻译的体现

如果在项目中有多个JSP页面,只有第一次访问到某个JSP页面的时候,这个JSP页面会被tomcat服务器进行翻译。

JSP页面上书写的不同的JAVA脚本代码,在翻译后的Java源代码中处于不同的位置。

在tomcat的work目录下有所有用到的JSP文件翻译之后对应Java代码。tomcat的安装目录\work\Catalina\localhost\beike\org\apache\jsp

书写demo.jsp,翻译之后对应的demo_jsp.java文件,它被编译之后生成demo_jsp.class文件

提问JSP到的是什么东西?

JSP它翻译之后是一个Servlet程序。JSP的内容格式是html,本质是ServletJsp文件会被编译成java文件,再被编译成class文件

5. JSP中的注释

由于JSP中可以书写html、Java代码,因此在JSP中可以嵌入html注释,还可以嵌入Java注释,还可以书写JSP自己的注释

1html注释:只能修饰html内容。 <!注释内容 -->

2java注释:只能修饰java代码。 //  /* */ /** */

3jsp注释:都可以包括。可以注释掉java的内容,可以注释掉html的内容 <%-- 注释内容--%>

html注释<!--注释 -->

html的注释,不能注释掉java脚本的内容,所以不要用html注释注释java脚本的内容;如果单纯的在注释里写java代码,相当于注释普通内容,当前可以注释掉,所以要将java代码写在java脚本里,这样再用html注释注释Java脚本,就不能其注释的作用了;

java注释Java的注释必须嵌入在上面介绍的三个脚本中,不能jsp其他位置书写,只能注释java代码。

jsp的注释:<%-- 注释--%>(如果区分不开,就使用jsp自己的注释。)

Jsp的注释既可以注释掉html代码,也可以注释掉java代码;

三种注释的存活时间:

 

6. JSP指令

指令:可以理解成命令约束、限制、规范。

JSP中的指令是用来限制约束JSP文件的。JSP中常用的指令有三个:pageincludetaglib

注意: page指令中各种属性都有默认值,一般不需要改动,如果有需要改动使用的我会标注的;

6.1. JSP中的page指令

Page指令限制当前的JSP页面。

page指令限制当前的JSP文件中可以使用的哪些包下的Java类,以及当前JSP页面的编码格式等操作。一般书写JSP文件的第一行

page指令的格式:<%@ page  key=value  key=value  …….%>

例如自动生成

 

在JSP页面上的page指令,也可以把它的属性拆成多个page指令书写,也可以写在一起。

例如:

6.1.1. language属性

language属性:声明当前这个JSP中可以使用编程语言,它默认就是Java

其实sun公司在设计JSP技术的时候,希望其他语言也可以使用JSP技术,但是最后只有Java在使用。

6.1.2. import属性

import属性 声明当前这个页面可以使用的类所在的包。相当于书写Java代码中的导包操作。

默认导入util包下的所有,在JSP页面可以使用集合等工具类。

提示JSP翻译之后,其实对应的就是一个Java类,并且这个类还是HttpServlet子类因此JSP页面上是可以使用Servlet中的相关对象,并且不用导入。

查看翻译的Java源代码可以看到,程序中导入了如下的

注意:在JSP页面上,如果需要导入其他包下的类,书写完类名或接口名之后,在类名或接口名上使用 alt + /  辅助导入对应的包

不要自己手动的书写导入的包,容易出错;

6.1.3. pageEncoding重点contentType属性

pageEncoding属性:设置当前JSP页面保存的时候的编码表。

一般建议这个属性的值设置为UTF-8.

contentType属性它是设置浏览器在解析jsp中的代码时使用的编码表,但是一般不用设置它;

只要在JSP页面上设置了pageEncoding在解析JSP的时候,如果没有设置contentType,浏览器解析的时候会使用pageEncoding的编码表。

但是如果同时设置contentType属性,则起作用的是contentType属性而不是pageEncoding属性,所以一般不建议设置contentType属性

即使设置也建议设置UTF-8

提示:一般在新建一个JSP文件的时候,page指令默认有languageimportpageEncoding属性,并且它们的属性值也不用修改(如果pageEncoding的编码表不是UTF-8需要修改为UTF-8)。

jsp中常用的码表为utf-8gbk,否则容易出现中文乱码问题;

6.1.4. autoFlush属性

autoFlush属性它是指在使用out对象输出的时候,是否自动刷新。默认是true。会自动刷新。一般不用设置,采用默认方式即可

6.1.5. buffer属性

buffer属性当前页面的输出流(out对象)使用的缓冲区大小。默认的8kb。也可以自己修改。一般不用设置,采用默认方式即可

6.1.6. errorPage属性

errorPage属性jsp页面中发生异常或者错误的时候,使用这个属性可以配置当前页面发生异常之后,跳转到其他的页面显示(配置友好页面)。

一般不用,后期会使用其他方式代替。

在jsp页面中配置errorPage属性及值值为出现异常跳转到哪个页面,并且在页面上故意书写发生异常的代码来演示

创建的错误页面error.jsp

6.1.7. isErrorPage属性

isErrorPage属性设置当前的JSP页面是否是可以直接使用exception对象。

默认情况下为false,不可以在此jsp中使用exception内置对象,如果想显示异常信息,则可以设置为true,可以使用exception对象;

如果设置true当前JSP文件翻译后的Java源代码会看到存在exception的引用设置为false则不能看到;

6.1.8. 多学一招

一般开发的时候,会把整个项目中的常见的错误处理配置到当前项目的web.xml文件中。

将此项目设置错误信息配置后,访问本项目时出现404错误时浏览器会自动识别错误状态码并跳转到404.jsp页面,

访问本项目时出现500错误时浏览器会自动识别错误状态码并跳转到500.jsp页面,

好处:如果没有设置友好页面,那么如果访问出现500错误并显示到浏览器页面上,显得网站做的太low了,竟然还会出现500错误;

6.1.9. extends属性

extends属性指定当前这个JSP翻译之后需要继承的父类。

在指定的JSP的父类时,要求这个父类一定是HttpServlet的子类。一般不用设置,采用默认方式即可

6.1.10. isELIgnored属性

isELIgnored="false"  它是说当前的JSP页面中是否可以解析EL表达式。

默认值为false,表示当前JSP页面可以解析出EL表达式中的内容。

如果设置true,在JSP页面中书写EL表达式将不会被解析。直接将EL表达式的内容当做内容显示在页面上。一般不用设置,采用默认方式即可

6.1.11. session属性

session属性:在当前的页面中是否可以直接使用session对象。

默认值为true也就是直接访问当前的JSP页面,如果没有session对象,就会直接创建Session对象,如果有,可以直接使用

但是如果设置为false,访问当前的JSP页面,就不会有任何session的信息。一般不用设置,采用默认方式即可

6.2. JSP中的include指令(理解

JSP中include指令,它主要是用来在当前的页面中引入其他的页面。这种引入方式成为静态引入

在多个页面中,每一个页面的全部内容中有一部分是固定不变的,有一部分是变动的,如果在每个页面中都将不变的代码再写一遍太麻烦了,

而且一旦这些不变的内容需要改动一点点,则需要在每个页面上都修改,太麻烦了,所以我们可以把不变的代码单独抽取出来生成一个页面,

在每个页面中引入这个页面即可,即使修改也只要修改抽取出来的页面即可,这就是页面引入的用处;

例如:一个网页,一般它的logo是一个页面,而版权部分是一个页面,主体部分是另外一个页面

演示:一共创建top.jspbody.jspfooter.jspmain.jsp四个页面,将top.jspbody.jspfooter.jsp三个页面引入到main.jsp页面上;

某个页面上引入其他的jsp页面的时候,要求其他的jsp页面中只写网页的主体内容,而不需要网页的框架

举例:被引入的jsp文件中只写两个部分,一个是默认的声明,另一个则是网页的内容即可,而不要像引入页面写的那么多结构代码,

否则页面的html源代码格式就不正确了,虽然不会影响页面效果,至于格式如何不正确就不截图演示了;

静态导入的特点:所有的jsp文件翻译成java文件时只会生成一个java文件,然后再编译成一个class文件;

将静态导入和后面的动态导入比较区别;

JSPinclude指令,它是将多个JSP文件翻译成一个Java源代码,把JSPinclude指令称为静态包含。

注意使用include引入其他的JSP页面,一定要保证多个JSP页面中嵌入的Java代码中的变量名不能重复。

比如在一个jsp文件中定义了变量x,就不可以在别的jsp文件中定义相同的变量名,因为所有的jsp文件都会被翻译到一个java文件中,

Java中不允许重复定义相同的变量名

6.3. JSP中的taglib指令

重点理解:

在JSP页面上是可以书写Java代码,也可以书写html代码,一般公司中页面是由美工维护,而我们负责后台开发。因此不建议在JSP页面上嵌入过多的Java代码。这时就需要把Java代码从页面中剔除。页面上需要书写的所有标签都封装到对应的单独的Java程序中,然后在页面中使用taglib指令引入。引入的这些Java程序可以通过对应的标签体现。其实这些标签的底层还是Java代码。仅仅只是JSP页面上没有了Java代码而已。

taglib指令:主要是在页面上引入其他已经定义好的标签或者函数(其实就是在引入Java程序或者理解成类)

  在今天的资料里有专门介绍标签库的文档,标签库相当于我们java中的API,可以使用定义好的标签或函数,明天会重点讲解

  例如这里引入一个使用频率非常高的标签作为演示

在taglib指令中的属性:

 uri:是当前标签对应的Java代码封装之后绑定的名称空间(给java代码专门的命名)

 prefix:它是当前在页面上可以使用的标签的前缀。

JSP的代码体现

页面显示的效果:

1. JSP的内置对象(九大内置对象)

1.1. 什么内置对象

内置对象:当前事物(对象)存在(创建)的之后,它的内部就已经拥有其他的对象,而在当前这个事物(对象)中是可以直接使用已经存在的其他对象。

例如创建A类的对象之后,在A类的源代码底层其实已经存在了B类,C类,等其他类的对象,那么在A类中是可以直接使用BC类的对象,而这些BC类对象可以称为A类的的内置对象。

JSP文件被翻译之后对应的就是一个Servlet程序。那么JSP页面上是可以直接使用Servlet中的学习过的相关对象。这些对象在页面上的Java代码中我们是可以直接使用的,而不需要再去手动的创建或者获取这些对象。

JSP的内置对象9个:这9个内置对象,可以在JSP翻译之后的对应的Java源代码的service方法中找到:

翻译之后的service方法中的定义的对象

HttpServletRequest 使用request引用操作   它是请求

HttpServletResponse 使用response引用操作  它是响应

HttpSession 使用session引用操作    session容器对象

ServletContext 使用application引用操作   表示当前项目对象

ServletConfig 使用config引用操作    专门获取当前这个Servlet的配置信息

Object 使用page引用操作 = this  

它表示的是当前那个JSP页面对象(翻译之后就是一个Servlet程序,这个page本身就是一个Servlet,但是由于在翻译之后赋值给了Object 类型,导致不能使用使用Servlet中的功能)。后期把它当作第四个容器(域对象)使用。

PageContext 使用pageContext引用操作  

它表示的是当前jsp页面的上下文。它的主要功能之一就是可以获取到JSP页面上的其他八个内置对象。

Throwable 使用exception引用操作   主要是表示当前JSP页面上的异常信息的

JspWriter 使用out引用操作   它相应于我们在Servlet中使用的response.getWriter

由于Servlet相关的对象HttpServletRequestHttpServletResponseHttpSessionServletContextServletConfig),在学习Servlet时已经讲解过,这里不再重复介绍。用法Servlet中用法相同。

记忆九大内置对象:

四大容器:page request session   application(servletContext )

其他五个:pageContext  response  ServletCofig     exception   out

1.1. page对象

JSP页面中,由于page对象被提升成了Object类型。但是这个page在赋值的时候,赋值为this

而this表示的是当前的jsp页面对象jsp页面翻译之后又是Servlet程序,也就说当前的page本身就是一个Servlet对象,但由于被提升成Object类型,因此Servlet中的所有的方法page都无法使用。如果真的要使用,需要使用向下转型。因此在JSP页面中经常把page当做Servlet中的第4个容器(域对象使用。

如果把page当做容器(域对象使用的时候,这时它中保存的内容只能在这个JSP页面中使用,在其他的地方无法使用

web中的四个域对象(容器对象)范围从小到大顺序:

page  <  request  <  session  <  ServletContext(application)

重点:四大域对象的存活时间,及内部数据的有效时间,使用范围

  page对象在跳转到别的页面时就销毁,所以保存的数据只能在本jsp页面使用,且未跳转到别的页面;

  request对象在一次请求和一次响应结束后就销毁,所以保存的数据只能在本次响应未结束前使用,

             比如请求转发就可以使用,使用范围为当前项目下的所有servlet

  Session对象在一次会话期间都可以使用,也就是未关闭浏览器时,注意不要超过默认的session对象保存时间30分钟,

             范围也是当前项目下的所有servlet,举例如果向session域中存放了数据,没有重启浏览器销毁session对象,

             也没有超过session默认的保存时间,则可以在本此会话中可以获取数据

  application对象在一个项目中都可以使用,关闭服务器时会自动销毁application对象,开启时会自动创建,

     也就说如果往application域中存放数据,只要没有重启服务器,则在项目中的任意文件任意时候都可以取出数据

  

域对象存活时间的解释:

        page最小,本次页面访问结束即销毁

        request其次,本次请求响应结束即销毁

        Session其次,本次会话结束后即销毁

        Application最大,服务器关闭后即销毁

域对象的使用范围的解释:

        Page在本页面内使用;

        Requestsessionapplication都是在本项目内使用,指多个servlet之间,或者servletjsp之间;

  <body>

   <%

     // 需求: page容器中保存值

     // 第一个参数: 指定参数的key

     // 第二个参数: 指定参数的value

     // 第三个参数: 指定参数的 域

     pageContext.setAttribute("name", "张三", PageContext.PAGE_SCOPE);

   %>

   <%-- page容器中取值 --%>

   <%= pageContext.getAttribute("name", PageContext.PAGE_SCOPE)  %>

  </body>

1.1. pageContext对象

pageConext它有四个功能:

1.获取其他8内置对象

2.给四个域对象中设置值;

3.获取四个域对象中的值

4.移除四个域中的值。

相关的方法可以到可以JspContextAPI查询出对应的方法:

1.1.1. 获取其他8内置对象

获取jsp页面中的其他的8个内置对象:下面7可以在PageContext对象中找到

下面方法可以在JspContext对象中找到:

注意事项:在jsp中可以通过pageContext对象获取其余的八大对象,同时也可以直接使用这九大内置对象;

所以通过pageContext对象获取其余的八大对象的方法不常使用,了解即可;

1.1.1. 给四个域对中的设置数据

获取四大域的int scope值的方法:PageContext类的静态成员变量

Int scope = PageContext.PAGE_SCOPE

Int scope = PageContext.REQUEST_SCOPE

Int scope = PageContext.SESSION_SCOPE

Int scope = PageContext.APPLICATION_SCOPE

向域中存放数据的方法:

setAttribute(String name,Object value):没有设置scope值,默认向page域中存放数据

setAttribute(String name,Object value,int scope): 设置scope值,向指定域中存放数据

setAttribute方法中的三个参数解释:

   第一个参数:是需要给某个域中保存的数据对应的key

   第二个参数:是需要给某个域中保存的数据,也就是key对应的value

   第三个参数:是需要将数据具体保存到哪个域中,可以通过PageContext中的静态成员变量获取到

例如

其中setAttribute( Striing name , Object value ) 默认将数据保存在page域中。

如果需要设置在requestsessionapplication域中,需要使用第二个setAttribute方法完成当然设置在page域中也可以使用此方法; 

注意:

1.pageContextPageContext类的对象引用,所以首字母小写,而PageContext.PAGE_SCOPE是指PageContext类,所以首字母大写;

2.操作域中的数据有两种方式:一是直接通过四大域对象操作,二是通过pageContext对象操作;

 

1.1.1. 四个中获取数据

从域中取出数据的方法:

getAttribute( String name):它默认是从page域中找key对应的value如果没有返回null

getAttribute( String name , int scope):它是从指定的域中key对应的value。第一个参数是key值,第二个参数的域scope

getAttributeNamesInScope (int scope):它指定的域中获取所有的key值。

getAttributesScope(String name):获取key所在域int

findAttribute( String name ):它是从page、requestsessionapplication四个域中依次找指定key对应的value,如果有任何一个域找到不会再继续找。如果四个域中都没有返回null。

1.1.1. 从四个域中删除数据

从域中删除数据的方法:

removeAttribute( String name):从任意域删除指定name的数据如果多个中都有此name,将会这几个域中的数据部删除。

removeAttribute( String name , int scope ):从指定的域中删除指定name的数据

<body>

  <!-- // 需求1: 通过pagecontext对象 4大域对象保存数据 -->

<%

  // 第一个参数: 属性的key

  // 第二个参数: 属性的value

  // 第三个参数: 属性的域

  pageContext.setAttribute("address", "上海1"); //两个参数,默认向page域中放

  pageContext.setAttribute("address", "上海2", PageContext.REQUEST_SCOPE);

  pageContext.setAttribute("address", "上海3", PageContext.SESSION_SCOPE);

  pageContext.setAttribute("address", "上海4", PageContext.APPLICATION_SCOPE);

 %>

 <!-- // 需求3: 通过pageContext对象 删除指定域对象的数据 和 删除不指定域对象的数据(比较) -->

 <%

    pageContext.removeAttribute("address", PageContext.PAGE_SCOPE);

    pageContext.removeAttribute("address", PageContext.REQUEST_SCOPE);

    pageContext.removeAttribute("address", PageContext.SESSION_SCOPE);

    pageContext.removeAttribute("address", PageContext.APPLICATION_SCOPE);

    /*

      // 删除所有域中指定的属性

      pageContext.removeAttribute("address");

    */

  %>

  <!-- // 需求2: 通过pagecontext对象 从指定域对象获取数据 -->

  <%=pageContext.getAttribute("address") %>

  <%=pageContext.getAttribute("address", PageContext.REQUEST_SCOPE) %>

  <%=pageContext.getAttribute("address", PageContext.SESSION_SCOPE) %>

  <%=pageContext.getAttribute("address", PageContext.APPLICATION_SCOPE) %>

  <hr/>

  <!-- // 需求4: 通过pagecontext对象 从域对象获取数据的简化方式 -->

  <%=pageContext.findAttribute("address") %>

 </body>

1.1. out对象

out它主要是用来把数据输出到页面。

<%

  out.println("out 输出1");

  response.getWriter().println("response 输出1");

  out.println("out 输出2");

%>

页面的显示结果:

上面显示结果分析:

建议:在JSP页面上如果需要输出文本数据,全部使用out对象输出。千万不要response对象与out对象同时使用;

1.1. exception对象

jsp页面上要能够使用exception内置对象,在jsppage指令中,必须书写isErrorPage=true,否则在页面上是无法使用exception内置对象。

谨记:不要把异常带到JSP页面。一般异常需要在后台的Java代码处理完成,如果真的有异常,就使用友好页面处理。

1.2. 脚下留心

说明JSP九大内置对象分别是什么?

page request session application

response config

pageContext exception out

记住使用pageContext对象 如何操作四个域中的数据。

2. JSP中的标签

2.1. JSP标签作用

虽然sun公司在设计JSP技术的时候,允许在JSP页面中嵌入java代码,但是这样会导致htmljsjava等代码严重的耦合在同一个文件中,导致后期维护十分的麻烦。于是sun公司将可以在jsp页面上书写的java提前已经封装到对应的标签中,然后让开发jsp页面上通过使用标签的方式来使用相应java代码。其实这些标签的用途并不大,后期如果真的需要功能强大的java代码,需要开发人员自己手动封装标签的。这里阶段介绍下JSP已经内置好的几个标签。

jsp:useBean:创建对象

jsp:setProperty:设置属性的值,相当于类中的setXxx方法

jsp:getProperty:获取属性的值,相当于类中的setXxx方法

它们三个合起来可以操作一个Java对象,并且可以给这个对象的属性设置值或者取出某个对象的属性值。

jsp:forward:请求转发到别的页面

// 需求1: 通过标签创建user对象, user对象保存request对象中

// 需求2: 通过标签给user对象的name属性设置为 张三,  passwrode属性值 设置为 123;

// 需求3: 通过标签取出user对象的name属性值 和age属性值

User类:

public class User {

  private String username ;

  private String password;

  public String getUsername() {

    return username;

  }

  public void setUsername(String username) {

    this.username = username;

  }

  public String getPassword() {

    return password;

  }

  public void setPassword(String password) {

    this.password = password;

  }

  public String getAddress(){

    return "";

  }

}

Jsp页面:

 <body>

    <!-- 需求1:通过标签创建user对象,将user对象保存到request域中

        相当于java中的  User user = new User();

        注意:jsp的 创建对象的标签依赖于项目中有该对象的类

     -->

    <!-- id属性为对象名,可以任意起名,class属性为对象所在类的位置,scope属性为将对象存放的域  -->

    <jsp:useBean id="user" class="cn.itcast.javabean.User" scope="request"></jsp:useBean>

   <!-- 需求2: 通过标签给user对象的name属性设置为张三, passwrode属性值设置为 123;

   相当于java中的 user.setUsername("张三")

   注意:jsp的 设置对象属性值的标签依赖于该对象的类中有对应的setXxx方法

  -->

  <!-- 注意:property对应的是类中的setXxx或者getXxx方法,而不是成员变量,

      即使只有setXxx或者getXxx方法,没有对应的成员变量,property属性也会生效

  -->

   <!-- name属性为对象名,要与上面的对象名一致,property属性为setXxx方法中Xxx的值,

       注意除了首字母大小写外必须一致,value属性为设置的属性值

   -->

  <jsp:setProperty name="user" property="username" value="张三"/>

  <jsp:setProperty name="user" property="password" value="123"/>

  <!-- 需求3: 通过标签 取出user对象的username属性值 和password属性值

      相当于java中的user.getUsername()

      注意:jsp的 获取对象属性值的标签依赖于该对象的类中有对应的getXxx方法,

  -->

  <jsp:getProperty name="user" property="username"/>

  <jsp:getProperty name="user" property="password"/>

  <jsp:getProperty name="user" property="address"/>

  </body>

注意:

1.jsp标签中3个操作对象的功能分别依赖于对象所在类,以及setXxxgetXxx方法的存在;

2.JspgetProperty 标签的结果会显示在浏览器上,别的则不会显示;

1.1. include标签(动态包含)

书写格式:

原理:

面试题:静态包含和动态包含区别

1.书写格式

静态包含是JSP中的include指令,书写格式自然与动态包含不同

动态包含是JSP中的include标签,书写格式自然与静态包含不同

静态格式:

 动态格式:

1.合并原理

静态包含是将多个jsp文件翻译合并在同一个java文件中,然后在生成一个class文件,最后在浏览器上生成一个页面;

动态包含是将多个JSP文件翻译成多个java文件然后在生成多个对应的class文件,最后在浏览器上合并生成一个页面;

2.声明变量

这个不算是一个单独的区别,只是一个补充点,由于合并远离不同,静态包含的多个jsp页面中不可以重复声明同一变量名,

因为在生成一个java文件时会报错,但动态包含由于没有生成同一个java文件中,所以可以重复声明同一变量名;

1.1. forword标签

// 需求4:通过标签请求转发到别的页面

<!-- 需求4:请求转发的jsp标签 -->

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

它主要是代替我们在Servlet中学习的request的请求转发的。

原文地址:https://www.cnblogs.com/dongfangshenhua/p/6725912.html