1、Jsp标签中动态INCLUDE与静态INCLUDE的区别?
答:动态INCLUDE用jsp:include动作实现
我们查看这些jsp->java代码:静态包含包含文件和被包含文件最后形成的是一个java代 文件。而动态包含最终形成的是两个java代码文件!
我们深入研究一下“使用了这两个标签的jsp文件对应的java代码段”: 假设 用b.jsp分别进行一次静态的和动态的包含c.jsp。 发现 对于静态包含(<%@ include file="c.jsp" %>):
对于动态包含(<jsp:include page="included.jsp"/>)的代码片段:
说明静态包含是把c.jsp文件先翻译为java代码,然后把这些java代码加入到 b.jsp翻译后的java代码中,位置不变(在jsp中的位置和翻译为java代码后的位置) 这里需要指出的是c.jsp中不能使用<html>、</html>、<body>、</body>标记,因为这将会影响在原JSP文件中同样的标记,有时会导致错误,如果去掉了这些标记还出错,那么你要检测被包含文件和包含文件中使用的<%%>是否有相同的变量或方法!为什么?我们之前说过这个标签内部的代码都要放到jsp_service方法中,这两个文件如果有相同的变量,在使用静态包含后,就相当于你在这个标签中进行了两次相同变量的声明! 对于动态包含,我们发现它其实它是服务器端跳转! |
2、Jsp标签两种跳转方式分别是什么?有什么区别?
答:有两种,分别为: 后者完全转向新页面,不会再回来。相当于go to 语句。
您可能已注意到 jsp:include 代码示例中的 flush 属性。顾名思义, flush 指示在读入包含内容之前是否清空任何现有的缓冲区。JSP 1.1 中需要 flush 属性“=true”,因此,如果代码中不用它,会得到一个错误。但是,在 JSP 1.2 中, flush 属性缺省为 false。由于清空大多数时候不是一个重要的问题,因此,我的建议是:对于 JSP 1.1,将 flush 设置为 true;而对于 JSP 1.2 及更高版本,将其设置为关闭。 清空现有缓冲区,是清空那里?tomcat目录下的work目录就是所谓的缓冲区!
个人理解,仅存在两种跳转(跳转):“服务器转向”和“客户端转向”。 假设:在视图a进行表单提交,请求url-A,url-A在服务端请求向url-B,….,url-N, 服务器器转向的特点:地址栏不变,请求信息不丢失;而客户端跳转却恰恰相反,它仅仅是向客户端发送一个状态码和地址(这个地址可以携带参数),让客户端那这个地址去重新访问服务器端。 以上述“假设”为基础,说这些url之间的转向是服务器转向,意思是说他们之间的跳转发生在服务器端,它给客户一个错觉让客户感觉到它访问的是url-A,其实不是,它访问的是url-N,但客户不知道!根据上面的“假设”我们并不能判断出视图a到url-N之间他们究竟进行的是什么跳转!这要看这种跳转是由谁引导的,
服务器跳转发生在下列两种情况下: * <jsp:forward page=””/> * request.getRequestDispatcher("url").forward(request, response);
而客户端跳转发生在下列几种情况 * 表单提交 * 超链接 * response.sendRedirect("url?参数");
|
3、JspWriter和PrintWriter
JspWriter是jsp 9大内置对象之一,是javaEE范畴,在servlet中只能通过PageContext内置对象获得,而PageContext只能通过JspFactory获得。而且JspWriter是一个继承自j2se抽象类Writer的抽象类。 PrintWriter属于j2se范畴,继承自j2se抽象类Writer的类,而且PrintWriter不是抽象类。而且在servlet中可以通过response获得。 JspWriter和PrintWriter这两个类的方法在没有牵扯到缓冲的时候方法可以通用。所以我们在servlet类中经常使用PrintWriter类。
|
4、<%%>和<!%%>
<%%>与<!%%>的区别,后者声明全局变量,后者可以声明方法,前者不能声明方法,其他都相同!可以这样说,前者在jsp翻译为servlet后位于一个方法内(_jspService方法),后者将成为servlet类的一个字段或者该类的一个方法!
|
5、异常
异常名字:java.lang.IllegalStateException: getOutputStream() has already been called for this response 在jsp或者在servlet中有时要用到response.getOutputStream(),但是此时会在后台报这个错误java.lang.IllegalStateException: getOutputStream() has already been called for this respons,这问题困扰了我好久都没解决,最近这个项目中我又遇到了,下定决心一定要解决掉,最后终于让我给找到解决的方法了,这个异常时因为response.getOutputStream()跟response.getWriter()相冲突早场的,呵呵!现在记录下,发出来和大家共享下,希望能帮到遇到同样问题的朋友们,解决方法如下: out.clearBuffer(); out = pageContext.pushBody(); 在调用response.getOutputStream()之前加上上面两代码,就ok了! 为什么? JSP的主要功能是描述发送到客户请求的响应输出流中的数据。这个输出流通过out对象显露给JSP开发员。 Out对象是javax.servlet.jsp.JspWriter对象的实例。这个对象可以代表输出流、经过滤的输出流或来自其他JSP页面的嵌套的JspWriter对象。但是输出应该不会被直接发送到输出流,因为在JSP的生命期内可能有多个输出流。 根据页面是否被缓冲,初始的JspWriter对象的初始化有所不同。缺省情况下,每个JSP页面都打开了缓冲,这可以提高性能。缓冲功能很容易关闭,只要使用page指令的buffered='false'属性即可。 缓冲的out对象以块为单位收集和发送数据,这通常会提供最好的总体吞吐量。使用缓冲时,PrintWriter在第一个块被发送时创建,也就是在out第一次调用flush()时。 如果不缓冲输出,将立即创建PrintWriter对象并引用out对象。在此情况下,发送到out对象的数据立即被发送到输出流。创建PrintWriter对象时将使用由服务器决定的缺省设置和头信息。
注意:HTTP头和缓冲 HTTP使用响应头描述服务器以及定义发往客户的数据的某些方面信息。这可能包括页面的MIME内容类型、新的cookie、转发URL或其他HTTP“动作”。 JSP允许开发者在创建OutputStream(即PrintWriter)前改变响应头的内容。一旦建立了OutputStream,头信息就不能改变了,因为它已被发送到客户。 在缓冲的out对象的情况下,直至缓冲区第一次刷新时才建立OutputStream。缓冲区被刷出很大程度上取决于page指令的autoFlush和bufferSize属性。通常,最好在有任何数据被发送到out对象前设置头信息。 对无缓冲的out对象,很难设置页面头。当无缓冲的页面建立时,几乎立即就建立了OutputStream。 在建立OutputStream后发送的头可能会造成大量不正常的结果。一些头被简单地忽略,其他的头可能产生异常,例如IllegalStateException。
JspWriter包含的方法大多数与java.io.PrintWriter类一样。但是JspWriter有另外几个用于处理缓冲的方法。与PrintWriter对象不同,JspWriter抛出IOExceptions。在JSP中,这些异常需要显式捕获和处理。
注意:autoFlush( ) 在JSP中,缺省的缓冲行为是在缓冲区满了时自动刷出缓冲区。但是,有时JSP实际上是直接和另一个应用程序通信。在此情况下,不“何时”的行为可能是在超出缓冲区时抛出异常。 设置page指令的属性autoFlush='false'将造成缓冲区溢出而抛出异常。
|
5、pageEncoding与contentType
pageEncoding的charset是jsp文件本身的编码
contentType的charset是指服务器发送给客户端时的内容编码
JSP要经过两次的“编码”,第一阶段会用pageEncoding,第二阶段会用utf-8至utf-8,第三阶段就是由Tomcat出来的网页, 用的是contentType。
第一阶段是jsp编译成.java,它会根据pageEncoding的设定读取jsp,结果是由指定的编码方案翻译成统一的UTF-8 JAVA源码(即.java),如果pageEncoding设定错了,或没有设定,出来的可能就是中文乱码。
第二阶段是由JAVAC的JAVA源码至java byteCode的编译,不论JSP编写时候用的是什么编码方案,经过这个阶段的结果全部是UTF-8的encoding的java源码。
JAVAC用UTF-8的encoding读取java源码,编译成UTF-8 encoding的二进制码(即.class),这是JVM对常数字串在二进制码(java encoding)内表达的规范。
第三阶段是Tomcat(或其的application container)载入和执行阶段二的来的JAVA二进制码,输出的结果,也就是在客户端见到的,这时隐藏在阶段一和阶段二的参数 contentType就发挥了功效
contentType的设定.
pageEncoding 和contentType的预设都是 ISO8859-1. 而随便设定了其中一个, 另一个就跟着一样了(TOMCAT4.1.27是如此). 但这不是绝对的, 这要看各自JSPC的处理方式. 而pageEncoding不等于contentType, 更有利亚洲区的文字 CJKV系JSP网页的开发和展示, (例pageEncoding=GB2312 不等于 contentType=utf-8)。
jsp文件不像.java,.java 在被编译器读入的时候默认采用的是操作系统所设定的locale所对应的编码,比如中国大陆就是GBK,台湾就是BIG5或者MS950。而一般我们不管 是在记事本还是在ue中写代码,如果没有经过特别转码的话,写出来的都是本地编码格式的内容。所以编译器采用的方法刚好可以让虚拟机得到正确的资料。
但是jsp文件不是这样,它没有这个默认转码过程,但是指定了pageEncoding就可以实现正确转码了。
举个例子:
<%@ page contentType="text/html;charset=utf-8" %>
大都会打印出乱码,因为输入的“你好”是gbk的,但是服务器是否正确抓到“你好”不得而知。
但是如果更改为
<%@ page contentType="text/html;charset=utf-8" pageEncoding="GBK"%>
这样就服务器一定会是正确抓到“你好”了。
相关推荐
4. **表单处理**:用户可能会在常见问题页面上进行搜索或提交反馈,这需要用到`<form>`元素,配合`<input>`、`<select>`、`<textarea>`等元素来收集用户输入。 5. **响应式设计**:为了适应不同设备的屏幕尺寸,...
《金蝶云星空应用常见问题集锦_财务篇.docx》和《金蝶k3cloud总账问题&精选方案.docx》重点关注财务模块,如总账管理、报表生成、税务处理等方面,为财务人员提供了常见问题的解答和最佳实践。 5. **金蝶云会计...
针对这些常见问题,文档《ABAQUS_有限元分析常见问题解答》应该会给出一系列实用的解答和指导,帮助初学者更好地掌握ABAQUS软件的使用,提高有限元分析的准确性和效率。对于希望入门或提高ABAQUS技能的工程师,这份...
这个压缩包包含了一系列关于PB的常见问题、编程技巧、经验分享和函数参考,对于PB开发者来说是一份宝贵的资源集合。 1. **PB常见问题汇编**:这份文档集合了PowerBuilder在开发过程中遇到的各种问题,涵盖了从语法...
K3生产制造常见问题集 2008年上册
以下是对毕业答辩常见问题的详细分析和应对策略: 1. **选题理由**:阐述选择某一课题的原因时,应结合自己的兴趣、专业发展方向以及当前技术领域的热点,解释为何该课题具有研究价值。 2. **研究意义与目的**:...
scrum及常见问题 ,scrum及常见问题处理解决办法等等
"计算机保研面试/考研复试常见问题整理" 本文档总结了计算机保研面试和考研复试中常见的问题,涵盖了软件工程、算法、数据结构、计算复杂度等方面的知识点。下面是对这些问题的详细解释和总结: 一、软件工程和...
java常见问题的pdf版本
python面试常见问题1、“==”与is的区别2、list与tuple的区别3、python中list与dict4、局部变量和全局变量5、迭代器和生成器6、yield7、import过程8、python装饰器9、python特点(封装、继承、多态)10、垃圾回收...
从数据结构,到开发设计模式,再到java基础详细讲述java面试常见问题,让你面试轻松过关,并且懂得面试技巧,增加自身基础知识
电脑常见问题与故障1000例.pdf
文章为大家带来了COB封装技术常见问题解答。
施工组织设计毕业答辩常见问题.pdf
五四评优常见问题解答
日常工作中收集的NC6.3常见问题欢迎小伙伴们一起交流补充。
网络常见问题与故障1000例 PDF电子书
C 语言常见问题集
SWAT软件模型常见问题集锦 SWAT是DRJeff为美国农业部农业服务中心开发的流域尺度模型。形成集空间信息处理、数据库技术、数学计算、可视化表达等功能于一身的大型专业软件。
Java常见问题集锦,让每一个新手可以从java开发中快速找到开发中遇到的问题!