JSP 中动态 include 与静态 include 的区别?
动态 include 用jsp:include.../动作指令实现,适合用于包含动态页面,并且可以带参数。动态 include 不会导入被 include 页面的编译指令,仅仅将被导入页面的 body 内容插入本页面。
静态 include 用<%@ include file=included.htm %>编译指令实现。
静态导入和动态导入有如下三点区别:
-
静态导入是将被导入页面的代码完全融入,两个页面融合成一个整体 Servlet;而动态导入则在 Servlet 中使用 include 方法来引入被导入页面的内容。
-
静态导入时被导入页面的编译指令会起作用;而动态导入时被导入页面的编译指令则失去作用, 只是插入被导入页面的 body 内容。
-
动态包含还可以增加额外的参数。
JSP 有哪些动作指令?
JSP 动作指令主要有如下 7 个:
jsp:forward:执行页面转向,将请求的处理转发到下一个页面。
jsp:param:用于传递参数,必须与其他支持参数的标签一起使用。
jsp:include:用于动态包含一个 JSP 页面。
jsp:plugin:用于下载 JavaBean 或 Applet 到客户端执行。
jsp:useBean:创建一个 JavaBean 的实例。
jsp:setProperty:设置 JavaBean 实例的属性值。
jsp:getProperty:输出 JavaBean 实例的属性值。
JSP 有哪些内置对象?作用分别是什么?
JSP 共有以下 9 个内置的对象: 9 个内置对象依次如下。
-
application:javax.servlet.ServletContext 的实例,该实例代表 JSP 所属的 Web 应用本身,可用于 JSP 页面,或者在 Servlet 之间交换信息。常用的方法有 getAttribute(String attName)、setAttribute(String attName , String attValue)和 getInitParameter(String paramName)等。
-
config:javax.servlet.ServletConfig 的实例,该实例代表该 JSP 的配置信息。常用的方法有 getInitParameter(String paramName)和 getInitParameternames()等方法。事实上,JSP 页面通常无须配置, 也就不存在配置信息。因此,该对象更多地在 Servlet 中有效。
-
exception:java.lang.Throwable 的实例,该实例代表其他页面中的异常和错误。只有当页面是错误 处理页面,即编译指令page的isErrorPage属性为true时,该对象才可以使用。常用的方法有getMessage() 和 printStackTrace()等。
-
out:javax.servlet.jsp.JspWriter 的实例,该实例代表 JSP 页面的输出流,用于输出内容,形成 HTML 页面。
-
page:代表该页面本身,通常没有太大用处。也就是 Servlet 中的 this,其类型就是生成的 Servlet 类,能用 page 的地方就可用 this。
-
pageContext:javax.servlet.jsp.PageContext 的实例,该对象代表该 JSP 页面上下文,使用该对象可以 访问页面中的共享数据。常用的方法有 getServletContext()和 getServletConfig()等。
-
request:javax.servlet.http.HttpServletRequest 的实例,该对象封装了一次请求,客户端的请求参数都 被封装在该对象里。这是一个常用的对象,获取客户端请求参数必须使用该对象。常用的方法有 getParameter(String paramName) 、 getParameterValues(String paramName) 、 setAttribute(String attrName,Object attrValue)、getAttribute(String attrName)和 setCharacterEncoding(String env)等。
-
response:javax.servlet.http.HttpServletResponse 的实例,代表服务器对客户端的响应。通常很少使 用该对象直接响应,而是使用 out 对象,除非需要生成非字符响应。而 response 对象常用于重定向, 常用的方法有 getOutputStream()、sendRedirect(java.lang.String location)等。
-
session:javax.servlet.http.HttpSession 的实例,该对象代表一次会话。当客户端浏览器与站点建立连 接时,会话开始;当客户端关闭浏览器时,会话结束。常用的方法有:getAttribute(String attrName)、 setAttribute(String attrName, Object attrValue)等。
JSP 和 Servlet 有哪些相同点和不同点?
JSP 的本质就是 Servlet,JSP 经过 Web 服务器编译之后就变成了 Servlet,因此它们的生命周期、运行机制完全是相同的。
Servlet 和 JSP 主要的不同点在于表现形式:Servlet 是一个继承 HttpServlet 的 Java 类,而 JSP 则是 在 HTML 页面中嵌入 JSP 脚本,嵌入之后组合成一个扩展名为.jsp 的页面文件。
在实际项目开发当中,JSP 侧重于视图,Servlet 主要用于控制逻辑。
request.getParameter()和 request.getAttribute()的区别?
getParameter()用于获取请求参数,request.getAttribute()用于获取请求的属性。具体来说,他们存在如 下区别。
-
getParameter()获取的类型是 String;getAttribute()获取的类型是 Object
-
getPrameter()获取的是 POST/GET 请求的参数值;而 getAttribute()获取的是 request 范围的属性—— 也就是 request.setAttribute()设置的属性。而 request 并没有类似的 request.setParamter 方法。
-
setAttribute()是让 Web 服务器把这个对象放在该页面所对应的一块内存中,当页面 forward 到另一 个页面时(只要还是同一个请求),另一个页面可通过 getAttribute()获取 setAttribute 方法存入的属性。
JSTL 是什么?优点有哪些?
JSTL(JSP Standard Tag Library,JSP 标准标签库)是 Java 官方提供的开放源代码的标签库,主要由四个标准的标签库(core、format、xml、sql)组成。优点有:
-
可以简化 Java Web 的开发,JSTL 已经提供平时开发所需的各种通用标签,因此开发者基本不需要 编写自定义标签。
-
通过 JSTL 可以避免在 JSP 页面中使用 Java 脚本来进行控制,在实际企业开发中,通常都会禁止在 JSP 页面上输出 Java 脚本。
如何避免 JSP 页面自动生成 session 对象?为什么要这么做?
在默认情况下,当浏览器对 JSP 页面发出请求时,如果 session 还没有建立,那么 Web 服务器就会自动为该请求创建一个 session 对象,但是 session 是比较消耗资源的,如果没有必要保持和使用 session, 就不应该创建 session,例如一些只是做产品展示、公司简介网页,就没必要使用 session 来保存信息。 可以在 JSP 中使用 page 指令设置来避免 JSP 页面为每个请求都自动创建 session。实例代码如下: <%@page session="false"%>
如何防止表单重复提交?
使用 session 跟踪可实现:
-
在显示表单页面(比如 regist.jsp)时生成一个随机值,将其保存到 session 中,同时将其保存为表单中的隐藏域的值。
-
在处理表单求时,获取 session 中的值和隐藏域的值,比较两者是否相同,如果相同说明不是重复提交,请求通过同时删除 session 中保存的值;如果不相同则是重复提交,不能通过。
session 和 application 的区别?
session 代表一次用户会话,application 则代表 Web 应用本身。具体来说,它们存在如下区别:
-
两者的作用范围不同:
session 是用户会话级别的,application 是 web 应用级别的。因此 application 是一个全局作用域。session 则对应于一个用户的单次会话,单个用户在同一次会话内访问多个页面共享同一个 session。而整个 Web 应用的所有用户、所有会话都共享同一个 application,只要 Web 应用没有重启,application 内的数据一直有效。
-
生命周期不同。
session:用户首次访问网站时创建,用户注销、离开网站或者关闭浏览器消亡。
application:启动 web 服务器创建,关闭 web 服务器销毁。
说说自动登录功能的实现机制。
自动登录是通过 Cookie 来实现的。
-
当用户的第一次登录时,程序需要将登录状态存入 Session 之外,还将登录信息存入 Cookie,Cookie 保存在用户的电脑上。
-
当用户再次访问站点时,直接读取用户电脑上的 Cookie 信息,如果 Cookie 已有登录信息,则将 Cookie 中的登录信息写入 Session,这就实现了自动登录。
EL 表达式的功能?为什么要用 EL 表达式?
EL 的全称是 Expression Language(表达式语言),它主要功能包括:
-
从四个域对象中读取数据数据并显示。
-
读取请求参数数据并显示。
-
读取 Cookie 并显示
-
支持丰富的运算符
EL 是 JSP 2.0 引入的功能,通过 EL 可以方便地访问、显示数据。传统的 JSP 脚本、JSP 表达式用于 显示数据则比较麻烦,它们往往存在如下缺点:
- 需要在 JSP 页面中嵌入 JSP 脚本
- 往往需要判断
- 有时候还需要进行类型转换
cookie 和 session 的作用、区别、应用范围?
-
cookie 数据保存在客户的电脑上,session 数据保存在服务端。
-
-
session 会在一定时间内保持在服务器上,但是会占用内存资源,当访问的用户过多,会加重服务器 的负载,考虑到减轻服务器的压力,可以将不重要的数据放在 cookie 中持久的保存。
-
单个 cookie 保存的数据不能超过 4k,很多浏览器都限制站点多保存 20 个 cookie。