整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:

Jsp相关技术常见面试题

Jsp相关技术常见面试题

部分包括: JSP, EL, JSTL, My Tag, I18N, FileUpDown

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

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

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

response: 网页传回用户端的回应

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

session: 与请求有关的会话期

application: 与当前应用对应的ServletContext对象, 应用中只有一个

out: 用来传送回应的输出 {}<%=%>

config: 与jsp配置对象的对象, 一般无用

page: jsp对应的Servlet对象

exception: 针对错误网页,未捕捉的异常对象

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

答:JSP共有以下6种基本动作

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

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

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

jsp:setProperty:设置JavaBean的属性。

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

jsp:plugin:根据浏览器类型为Java插件生成OBJECT或EMBED标记

3. JSP的常用指令

答:主要有下面3种指令

  1. page指令: 指定页面的的一些属性, 常用属性:

contentType=”text/html; charset=utf-8″ //向浏览器端输出数据的编码

pageEncoding=”utf-8″ //jsp文件被编译成java文件时所用的编码

session=”true” //是否自动创建session

  1. include指令: 包含别一个jsp页面
  2. taglib指令: 引入一个标签库

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

答:

  1. 动态包含: 用<jsp:include>, 包含的动作是在jsp对应的Serlet处理请求时去执行的,每次请求都会执行.
  2. 静态包含: 用include指令, 包含的动作是在jsp被编译成java文件时执行的, 只有第一次请求时执行.

5. JSP和Servlet有哪些相同点和不同点,他们之间的联系是什么?

答:

JSP的优点是擅长于网页制作,生成动态页面比较直观,缺点是不容易跟踪与排错。

Servlet是纯Java语言,擅长于处理流程和业务逻辑,缺点是生成动态网页不直观。

6. EL的功能, 为什么要用EL?

EL的功能包括:

  1. 从四个域对象中取出属性数据显示
  2. 取出请求参数数据显示

为什么要用EL?

在页面中用jsp脚本和jsp表达式来获取数据显示比较麻烦

  1. 需要条件判断
  2. 可能需要强转

7. JSTL的功能, 为什么要用JSTL?

JSTL的功能

JSTL全名为JavaServer Pages Standard Tag Library, 主要用于基本输入输出、流程控制、循环、XML文件剖析、数据库查询及国际化和文字格式标准化的应用等

为什么要用JSTL?

在jsp页面做条件判断或循环操作并输出时, 比较费力

8. 为什么要用自定义标签?, MyTag如何实现?

为什么要用?

  1. 不想在Jsp中编写java代码
  2. JSTL标签库不能满足实际项目的需求

自定义标签定义和使用的流程

1.编写标签处理器类(SimpleTagSupport的实现类)

    • 重写doTag()

2.编写标签库文件(WEB-INF/xxx.tld)

    • 整个文件的定义: <short-name> <uri>
    • 标签的定义: <tag>

3.在jsp页面使用标签:

    • 导入标签库(xxx.tld/)
    • 使用标签

SP指令是指:用于设置JSP页面相关属性的一个语法命令,例如:设置页面编码字符集、导入其他包等等。JSP中提供了三个指令,分别是:page指令、include指令、taglib指令。其中page指令用于设置JSP页面属性,include指令用于引入其他的JSP文件,taglib指令用于引入标签库。这一小节内容介绍page指令的使用。

1.1、基础语法

JSP中page指令的语法规则如下所示:

<%@ page 属性名称="属性值" %>

注意:一个page指令中,可以有多个【属性名称=属性值】,也可以多次使用page指令

1.2、指令属性

page指令中,提供了很多个属性,常见的属性有这几个:contentType、pageEncoding、errorPage、isErrorPage、import、language、session、isELIgnored,下面我们就介绍每一个属性的作用。

这一小节介绍errorPage、isErrorPage、session、isELIgnored四个属性的作用。

(1)session

session属性作用:设置当前JSP页面中是否可以使用session对象,取值:true、false。默认是true,设置成false,那么当前JSP页面里面就不能使用session对象。

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

<html>
<head>
    <title>JSP指令之Page</title>
</head>
<body>
    <h3>JSP指令之Page</h3>
    <%
        // 使用session对象
        Object username=session.getAttribute("username");
        System.out.println(username);
    %>
</body>
</html>

如果设置session="fasle",那么在JSP页面中使用session,编译会报错,如下所示:

这是因为,当我们设置session="false"的时候,JSP编译之后,对应的java源代码中,都不会定义session变量,来看下session设置成true和false两种情况下,对应的源代码如下图所示:

(2)isELIgnored

isELIgnored属性作用:这个属性的作用是设置当前JSP页面是否忽略EL表达式,取值:true、false,默认值是true。

  1. false表示当前页面不忽略EL表达式,那么也就是说,当前JSP页面支持EL表达式;
  2. 设置成true之后,那么当前JSP页面中如果使用了EL表达式的内容,此时会被当作普通字符输出。
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ page isELIgnored="true" %>

<html>
<head>
    <title>JSP指令之Page</title>
</head>
<body>
    <h3>JSP指令之Page</h3>
    使用EL表达式获取参数: ${"输出EL表达式内容"}
</body>
</html>

运行结果如下所示:

当我们设置成isELIgnored="false"的时候,再次访问jsp页面,此时结果如下所示:

(3)isErrorPage

isErrorPage属性作用:指定当前JSP页面是否作为错误处理界面,取值:true、false,默认值是false。设置成true之后,那么当其他的JSP页面发生报错的时候,通过errorPage属性,就会转发到这个错误页面。

注意:isErrorPage属性一般是和errorPage属性结合使用的

(4)errorPage

errorPage属性作用:指定当前JSP页面的错误页面地址,一般是和isErrorPage属性结合使用。errorPage设置的相对路径,源代码上就是转发到对应的错误页面。

  • 首先创建一个error.jsp页面。
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%-- 指定当前页面是错误页面 --%>
<%@ page isErrorPage="true" %>
<html>
<head>
    <title>JSP错误显示页面</title>
</head>
<body>
  <h3>
    Sorry,你访问的页面报错啦!!!
  </h3>
</body>
</html>
  • 接着再创建一个page.jsp页面。
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%-- 指定错误页面的路径地址 --%>
<%@ page errorPage="error.jsp" %>
<html>
<head>
    <title>errorPage属性</title>
</head>
<body>
    <%-- 模拟报错 --%>
    <%
        int i=10 / 0;
    %>
</body>
</html>

启动Tomcat容器,浏览器访问http://localhost:8080/servlet/page.jsp,结果如下所示:

查看page.jsp编译之后对应的源代码,可以看到有一个handlePageException()方法,这个方法就是处理JSP页面异常的。

点进去查看源代码,如下所示:

private void doHandlePageException(Throwable t) throws IOException, ServletException {
    if (this.errorPageURL !=null && !this.errorPageURL.equals("")) {
        this.request.setAttribute("javax.servlet.jsp.jspException", t);
        this.request.setAttribute("javax.servlet.error.status_code", 500);
        this.request.setAttribute("javax.servlet.error.request_uri", ((HttpServletRequest)this.request).getRequestURI());
        this.request.setAttribute("javax.servlet.error.servlet_name", this.config.getServletName());

        try {
            this.forward(this.errorPageURL);
        } catch (IllegalStateException var3) {
            this.include(this.errorPageURL);
        }

        Object newException=this.request.getAttribute("javax.servlet.error.exception");
        if (newException !=null && newException==t) {
            this.request.removeAttribute("javax.servlet.error.exception");
        }

        this.request.removeAttribute("javax.servlet.error.status_code");
        this.request.removeAttribute("javax.servlet.error.request_uri");
        this.request.removeAttribute("javax.servlet.error.servlet_name");
        this.request.removeAttribute("javax.servlet.jsp.jspException");
    } else if (t instanceof IOException) {
        throw (IOException)t;
    } else if (t instanceof ServletException) {
        throw (ServletException)t;
    } else if (t instanceof RuntimeException) {
        throw (RuntimeException)t;
    } else {
        Throwable rootCause=null;
        if (t instanceof JspException || t instanceof ELException || t instanceof javax.servlet.jsp.el.ELException) {
            rootCause=t.getCause();
        }

        if (rootCause !=null) {
            throw new ServletException(t.getClass().getName() + ": " + t.getMessage(), rootCause);
        } else {
            throw new ServletException(t);
        }
    }
}

从上面源代码就可以看到,有一个this.forward()方法,这个方法就是转发的作用。到此,page指令的常用属性都介绍完啦。

今天就到这里,未完待续~~

sp中四种传递参数的方法,我觉得总结一下,挺好的,以备后用!

1、form表单

2、request.setAttribute();和request.getAttribute();

3、超链接:<a herf="index.jsp"?a=a&b=b&c=c>name</a>

1、form表单

form.jsp:

<%@page contentType="text/html; charset=GB2312"%> 
<html> 
 <head> 
 <title> 
 form.jsp file 
 </title> 
 </head> 
 
 <body style="background-color:lightblue"> 
 
 <h2 style="font-family:arial;color:red;font-size:25px;text-align:center">登录页面</h2> 
 
 <form action="result.jsp" method="get" align="center"> 
 姓名:<input type="text" name="name" size="20" value="" maxlength="20"><br/> 
 
 密码:<input type="password" name="password" size="20" value="" maxlength="20"><br/> 
 
 <!--在爱好前空一个空格,是为了排版好看些--> 
 
 爱好:<input type="checkbox" name="hobby" value="唱歌">唱歌 
 <input type="checkbox" name="hobby" value="足球">足球 
 <input type="checkbox" name="hobby" value="篮球">篮球<br/><br/> 
 
 <input type="submit" name="submit" value="登录"> 
 <input type="reset" name="reset" value="重置"><br/> 
 </form> 
 
 </body> 
</html>

result.jsp:

 1 <%@page language="java" import="java.util.*" pageEncoding="GB2312"%> 
 2 <html> 
 3 <head> 
 4 <title> 
 5 result.jsp file 
 6 </title> 
 7 </head> 
 8 
 9 <body bgcolor="ffffff"> 
10 <% 
11 request.setCharacterEncoding("GB2312"); 
12 
13 String name=request.getParameter("name"); 
14 name=new String(name.getBytes("iso-8859-1"),"GB2312"); 
15 
16 String pwd=request.getParameter("password"); 
17 String[] hobby=request.getParameterValues("hobby");//注意这里的函数是getParameterValues()接受一个数组的数据 
18 
19 %> 
20 
21 <% 
22 if(!name.equals("") && !pwd.equals("")) 
23 { 
24 %> 
25 
26 您好!登录成功!<br/> 
27 姓名:<%=name%><br/> 
28 密码:<%=pwd%><br/> 
29 爱好:<% 
30 for(String ho: hobby) 
31 { 
32 ho=new String(ho.getBytes("iso-8859-1"),"GB2312"); 
33 out.print(ho+" "); 
34 } 
35 %> 
36 <% 
37 } 
38 else 
39 { 
40 %> 
41 请输入姓名或密码! 
42 <% 
43 } 
44 %> 
45 </body> 
46 </html>

注意:form表单的提交方式为get,在参数传递时会遇到中文乱码的问题,一个简单的解决方法是,将接受到的字符串先转换成一个byte数组,再用String构造一个新的编码格式的String,如:

1 String name=request.getParameter("name"); 
2 name=new String(name.getBytes("iso-8859-1"),"GB2312"); 

如果form表单的提交方式为post,解决乱码问题的简单办法是,使用 request.setCharacterEncoding("GB2312");设置request的编码方式。

为什么会出现中文乱码问题呢?因为Tomcat服务器默认的系统编码方式为iso- 8859-1,你传递参数给服务器时,使用的是默认的iso-8859-1的编码方式,但是服务器向你返回信息时,是按page指令中设置的编码方式, 如:<%@page language="java" import="java.util.*" pageEncoding="GB2312"%>,这样就混合了两种编码方式,所以会出现乱码,所以解决之道就是统一传递和接收的编码方式。

2、request.setAttribute()和request.getAttribute()

set.jsp:

<%@page contentType="text/html; charset=GB2312"%> 
<html> 
 <head> 
 <title> 
 set.jsp file 
 </title> 
 </head> 
 
 <body style="background-color:lightblue"> 
 <% 
 request.setAttribute("name","心雨"); 
 %> 
 <jsp:forward page="get.jsp"/> 
 </body> 
</html>

get.jsp:

<%@page contentType="text/html; charset=GB2312"%> 
<html> 
 <head> 
 <title> 
 get.jsp file 
 </title> 
 </head> 
 
 <body style="background-color:lightblue"> 
 <% 
 out.println("传递过来的参数是:"+request.getAttribute("name")); 
 %> 
 </body> 
</html> 

request.setAttribute()和request.getAttribute()是配合<jsp:forward>或是include指令来实现的。

3、超链接:<a herf="index.jsp?a=a&b=b&c=c">name</a>

href.jsp:

<%@page contentType="text/html; charset=GB2312"%> 
<html> 
 <head> 
 <title> 
 href.jsp file 
 </title> 
 </head> 
 
 <body style="background-color:lightblue"> 
 <a href="getHerf.jsp?name=心雨&password=123">传递参数</a> 
 </body> 
</html> 

getHref.jsp:

<%@page contentType="text/html; charset=GB2312"%> 
<html> 
 <head> 
 <title> 
 getHref.jsp file 
 </title> 
 </head> 
 
 <body style="background-color:lightblue"> 
 <% 
 String name=request.getParameter("name"); 
 name=new String(name.getBytes("iso-8859-1"),"gb2312"); 
 
 out.print("name:"+name); 
 %> 
 <br/> 
 <% 
 out.print("password:"+request.getParameter("password")); 
 %> 
 </body> 
</html> 

这种传递参数的方法和form表单的get方式类似,是通过地址栏传递的参数,其乱码解决方法也和form 的get方式一样。

4、<jsp:param>

param.jsp:

<%@page contentType="text/html; charset=GB2312"%> 
<html> 
 <head> 
 <title> 
 param.jsp file 
 </title> 
 </head> 
 
 <body style="background-color:lightblue"> 
 
 <%request.setCharacterEncoding("GB2312");%> 
 
 <jsp:forward page="getParam.jsp"> 
 <jsp:param name="name" value="心雨"/> 
 <jsp:param name="password" value="123"/> 
 </jsp:forward> 
 
 </body> 
</html>

getParam.jsp:

<%@page contentType="text/html; charset=GB2312"%> 
<html> 
 <head> 
 <title> 
 getParam.jsp file 
 </title> 
 </head> 
 
 <body style="background-color:lightblue"> 
 <% 
 String name=request.getParameter("name"); 
 out.print("name:"+name); 
 %> 
 <br/> 
 <% 
 out.print("password:"+request.getParameter("password")); 
 %> 
 </body> 
</html> 

这里发现了一个奇怪的问题,还是在中文乱码的问题上,在form表单的例子中,如果传递方式为post,则只需要在接收参数的页面设置request的编 码方式就可以了,即request.setCharacterEncoding("GB2312");,注意是在接收参数的页面,如果将该句放到form 表单里,那么不起作用,仍然是乱码。而在本例中,为了使传递的参数不出现乱码,却是将 request.setCharacterEncoding("GB2312");放在发送参数的页面中,才会正常显示中文,放在接收参数的页面中,不起 作用。也许这就是<jsp:param>和form表单传递参数不同的地方。为什么会有这个不同呢?可能是因为form表单中的参数是由客户 端传送到服务端上的,需要经过一个request的打包过程,但是<jsp:param>传递的参数本身就是在服务器端的,不需要经历由客户 端到服务端这么一个过程,但是服务器里的参数传递是这么回事呢?这个问题,我不知道了!真是知识是一个扩大的圆圈,你知道的越多,那么不知道的就越多!努 力吧!