`

JSP有关的面试题

    博客分类:
  • JSP
JSP 
阅读更多

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

JSP共有以下9个内置的对象:

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

response 网页传回用户端的回应

pageContext 网页的属性是在这里管理

session 与请求有关的会话期

application servlet 正在执行的内容

out 用来传送回应的输出

config servlet的构架部件

page JSP网页本身

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

 

request表示HttpServletRequest对象。它包含了有关浏览器请求的信息,并且提供了几个用于获取cookie, header, session数据的有用的方法。

response表示HttpServletResponse对象,并提供了几个用于设置送回浏览器的响应的方法(如cookies,头信息等)。

out对象是javax.jsp.JspWriter的一个实例,并提供了几个方法使你能用于向浏览器回送输出结果。

pageContext表示一个javax.servlet.jsp.PageContext对象。它是用于方便存取各种范围的名字空间、servlet相关的对象的API,并且包装了通用的servlet相关功能的方法。

session表示一个请求的javax.servlet.http.HttpSession对象。Session可以存贮用户的状态信息

applicaton 表示一个javax.servle.ServletContext对象。这有助于查找有关servlet引擎和servlet环境的信息

config表示一个javax.servlet.ServletConfig对象。该对象用于存取servlet实例的初始化参数。

page表示从该页面产生的一个servlet实例。

2、jsp有哪些动作?作用分别是什么?

JSP共有以下6种基本动作

jsp:include:在页面被请求的时候引入一个文件。

jsp:useBean:寻找或者实例化一个JavaBean

jsp:setProperty:设置JavaBean的属性。

jsp:getProperty:输出某个JavaBean的属性。

jsp:forward:把请求转到一个新的页面。

jsp:plugin:根据浏览器类型为Java插件生成OBJECTEMBED标记。

3、JSP的常用指令与标签

Jsp指令:
语法:<%@ 指令名 属性="值"%>.

jsp指令负责告诉jsp引擎如何把页面翻译成servlet.

 

page指令:用于定义jsp页面的各种属性,最好放在jsp页面的起始位置,属性有language,extends,import,session,buffer,autoFlush,isThreadSafe,info,isErrorPage,contentType,pageEncoding,isELIgnored.

 

include指令:在后面与include标签对比讲解.

 

2.
out对象:这个out不是servlet里面的out.是PageContext.getWriter()方法返回的out对象.
实验1:
< %
 out.println("first");
 response.getWriter("second");
%>
结果如下:
second
first
为什么out的后输出?这是因为jsp引擎先把内容放到PageContext.getWriter()方法返回的out对象的缓冲区.写完后再交给servlet的response.getWriter()方法写到servlet引擎提供的缓冲区,缓冲区再把内容写到客户端.

 

实验2:
< %
 ServletOutputStream sos = response.getOutputStream();
 sos.println("hehe");
%>这里加上一个换行

 

运行结果报错了,为什么?上面说过,out最终会调用response.getWriter()方法返回的out对象,我们这个实验首先使用了response.getOutputStream()方法,记住我们写的所有的jsp页面都会翻译成Servlet的,然而在这里的代码中输出换行符时又去调用了response.getWriter()方法,而response的getWriter()和getOutputStream()不能同时在一个方法里面调用,所以报错了.注意:用了ServletOutputStream 就不能再使用out对象了.

 

实验3:
< %
 RequestDispatcher rd = application.getRequestDispatcher("/test.html");
 rd.forward(request,response);
%>在这里回车

 

结果报告有错.为什么?
实际上当调用forward方法时,是去找了一个缺省的servlet,这个缺省的servlet使用的是getOutputStream()方法,而这里的回车使用的是jsp的out对象打印出来的.这个out对象最终要使用的是getWriter(),而上面说过response的getWriter()和getOutputStream()不能同时使用,所以报错了.当然在前面加上回车也是一样的效果.

 

3.
pageContext对象:->request->session->application
pageContext对象代表此jsp页面,它是通过调用JspFactory.getPageContext方法返回的,在自定义标签用的非常多.
可以使用pageContext得到其他8大内置对象.

 

实验4:
这是一个换行
<%
 1.//RequestDispatcher rd = application.getRequestDispatcher("/test.html");
   //rd.forward(request,response);
 2. pageContext.forward("/test.html");
%>
第一种方法会出错,第二种不会,为什么?
第一种出错的原因我们在上面说过,第二种为什么不会出错呢?我们说过,pageContext包装了其他八大隐式对象,所以它的forward方法内部也是调用了request.getRequestDispatcher的forward方法,但是在执行RequestDispatcher的forward方法之前调用了out.clear()方法.这样就不会出错了,去掉前面的换行,在%>后面加一个换行,两种方法都会报错.

 

几个常用的方法:
setAttribute(String name,Object object);
setAttribute(String name,Object object,int scope);scope代表指定的范围(page,request,session,application)
getAttribute(String name);
getAttribute(String name,int scope);
removeAttribute(String name);
findAttribute(String name);此方法依次从page,request,session,appllication这四个范围去找,直到找到为止.如果没找到则返回null.

 

4.
jsp标签:
< %@ include file=""%>:静态包含,a包含b,编译过程中a会受到b的jsp指令的影响,例如,b中有一个isELIgnored指令,会影响b,效率更高,不仅仅是引入输出内容,引入共同的的编译元素,不会检查所含文件的变化,适用于包含静态页面
<jsp:include page=""/>:动态包含,a包含b,a在执行过程中调用b,page的值可以是变量.它总是会检查所含文件中的变化,适合用于包含动态页面,并且可以带参数
<jsp:forward>:此forward调用的pageContext的forward然后return了
<jsp:param>:用于给上面两个标签传参数.

 

以下是jsp2.0里面才可以使用的标签:
< jsp:scriptlet>:相当于<%%>
< jsp:scriptlet>
 int x = 3;
 if(x < 5){
  out.println(x);
 }
< /jsp:scriptlet>
会报错.因为在此使用了"<"这个符号,必须用
<![CDATA[
 代码
]]>

 

<jsp:declartion>
< /jsp:declaration>相当于<%!%>

 

<jsp:exdivssion>
< /jsp:exdivssion>相当于<%=%>

 

<jsp:directive.指令名 属性="值"/>相当于<%@ page 属性="值"%>

 

<%@ page contentType="text/html;charset=gb2312"%>
< %
 out.println("中国"); 
%>

<%
 response.setContentType("text/html;charset=gb2312");
 out.println("中国");
%>
的效果是不一样的.前者打印出了"中国"两字,后者打印出来的是乱码,为什么呢?
前者告诉jsp引擎按照指定的contentType去把jsp的内容翻译成servlet,因为charset指定为了gb2312,所以正常的输出了.
后者为什么是乱码呢?这是因为jsp源文件的中文字符在翻译成Servlet源文件时已经不是其正确的unicode编码了,当服务器把这两个字符按照gb2312输出正文时,出现的就是乱码了.

 

<jsp:setProperty name="date" property="time" param="time"/>

<jsp:setProperty name="date" property="time" value="<%=Integer.parseInt(request.getParameter("time"))%>"/>
意思是一样的.

 

自省机制:<jsp:setProperty name="date" property="*"/>
这种形式用于对javaBean实例对象中的多个属性赋值,它表示将请求消息中的参数逐一与javaBean实例对象中的属性进行比较,如果两个属性同名,则将该参数值赋值给该属性.注意:必须是同名的才赋值.

 

<jsp:useBean id="date" class="java.util.Date" scope="request"/>
这个jsp标签的含义为:
在指定范围(这里是request,如果不写,默认为page)内去找一个名字为date的对象,如果找到了则把它取出来,如果没找到则实例化一个新的类型为java.util.Date的名字为date的对象,并将它保存在request中,

 

<jsp:useBean id="date" class="java.util.Date" scope="request">
......
< /jsp:useBean>
如果上面的语句这样写,其含义则为:
在指定范围(这里是request,如果不写,默认为page)内去找一个名字为date的对象,如果找到了则把它取出来,"......"地方的代码不再执行.如果没找到则实例化一个新的类型为java.util.Date的名字为date的对象,并将它保存在request中,还将执行"......"地方的代码.

 

5.
forward() 与redirect()的区别?
答:前者仅是容器中控制权的转向,在客户端浏览器地址栏中不会显示出转向后的地址;后者则是完全的跳转,浏览器将会得到跳转的地址,并重新发送请求链接。

4、JSP中动态INCLUDE与静态INCLUDE的区别?

动态INCLUDEjsp:include动作实现

<jsp:include page=included.jsp flush=true />它总是会检查所含文件中的变化,适合用于包含动态页面,并且可以带参数静态INCLUDEinclude伪码实现,定不会检查所含文件的变化,适用于包含静态页面 <%@ include file=included.htm %>

5、JSP中两种跳转方式分别是什么?有什么区别?

有两种,分别为:

<jsp:include page=included.jsp flush=true>

<jsp:forward page= nextpage.jsp/>

前者页面不会转向include所指的页面,只是显示该页的结果,主页面还是原来的页面。执行完后还会回来,相当于函数调用。并且可以带参数.后者完全转向新页面,不会再回来。相当于go to 语句。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics