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,本质是Servlet;Jsp文件会被编译成java文件,再被编译成class文件
5. JSP中的注释
由于JSP中可以书写html、Java代码,因此在JSP中可以嵌入html注释,还可以嵌入Java注释,还可以书写JSP自己的注释
1、html注释:只能修饰html内容。 <!—注释内容 -->
2、java注释:只能修饰java代码。 // /* */ /** */
3、jsp注释:都可以包括。既可以注释掉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中常用的指令有三个:page、include、taglib。
注意: 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指令默认有language、import、pageEncoding属性,并且它们的属性值也不用修改(如果pageEncoding的编码表不是UTF-8需要修改为UTF-8)。
在jsp中常用的码表为utf-8和gbk,否则容易出现中文乱码问题;
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.jsp,body.jsp,footer.jsp和main.jsp四个页面,将top.jsp,body.jsp,footer.jsp三个页面引入到main.jsp页面上;
在某个页面上引入其他的jsp页面的时候,要求其他的jsp页面中只写网页的主体内容,而不需要网页的框架;
举例:被引入的jsp文件中只写两个部分,一个是默认的声明,另一个则是网页的内容即可,而不要像引入页面写的那么多结构代码,
否则页面的html源代码格式就不正确了,虽然不会影响页面效果,至于格式如何不正确就不截图演示了;
静态导入的特点:所有的jsp文件翻译成java文件时只会生成一个java文件,然后再编译成一个class文件;
将静态导入和后面的动态导入比较区别;
JSP中的include指令,它是将多个JSP文件翻译成一个Java源代码,把JSP的include指令称为静态包含。
注意:使用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类中是可以直接使用B、C类的对象,而这些B、C类对象可以称为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相关的对象(HttpServletRequest、HttpServletResponse、HttpSession、ServletContext、ServletConfig),在学习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在本页面内使用;
Request,session和application都是在本项目内使用,指多个servlet之间,或者servlet与jsp之间;
<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.移除四个域中的值。
相关的方法可以到可以从JspContext的API中查询出对应的方法:
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域中。
如果需要设置在request、session、application域中,需要使用第二个setAttribute方法完成,当然设置在page域中也可以使用此方法;
注意:
1.pageContext是PageContext类的对象引用,所以首字母小写,而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、request、session、application四个域中依次找指定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内置对象,在jsp的page指令中,必须书写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代码,但是这样会导致html、js、java等代码严重的耦合在同一个文件中,导致后期维护十分的麻烦。于是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个操作对象的功能分别依赖于对象所在类,以及setXxx、getXxx方法的存在;
2.Jsp:getProperty 标签的结果会显示在浏览器上,别的则不会显示;
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的请求转发的。