JSP相关的一些问题与分析

     JSP作为JavaEE最流行的表现层技术,并非不可替代,实际上随着JavaEE技术的发展,又出现了FreeMaker、Velocity等表现层技术,虽然这些技术可以取代JSP作为表现层的角色,但是JSP作为最早的JavaEE规范之一,JSP依然广泛用于各种Java应用之中。

    JSP全名为Java Server Pages,中文名叫java服务器页面,其根本是一个简化的Servlet设计,它是由Sun Microsystems公司倡导、许多公司参与一起建立的一种动态网页技术标准。JSP技术有点类似ASP技术,它是在传统的网页HTML(标准通用标记语言的子集)文件(*.htm,*.html)中插入Java程序段(Scriptlet)JSP标记(tag),从而形成JSP文件,后缀名为(*.jsp)。 用JSP开发的Web应用是跨平台的,既能在Linux下运行,也能在其他操作系统上运行。

    它实现了Html语法中的java扩张(以 <%, %>形式)。JSPServlet一样,是在服务器端执行的。通常返回给客户端的就是一个HTML文本,因此客户端只要有浏览器就能浏览。

JSP技术使用Java编程语言编写类XMLtagsscriptlets,来封装产生动态网页的处理逻辑。网页还能通过tagsscriptlets访问存在于服务端的资源的应用逻辑。JSP将网页逻辑与网页设计的显示分离,支持可重用的基于组件的设计,使基于Web的应用程序的开发变得迅速和容易。 JSP(JavaServer Pages)是一种动态页面技术,它的主要目的是将表示逻辑从Servlet中分离出来。

     Java ServletJSP的技术基础,而且大型的Web应用程序的开发需要Java ServletJSP配合才能完成。JSP具备了Java技术的简单易用,完全的面向对象,具有平台无关性且安全可靠,主要面向因特网的所有特点。


<1>JSP页面是如何被执行的?JSP执行效率比Servlet低吗?

当客户端向一个JSP页面发出请求时,Web ContainerJSP转化成Servlet的源代码(只在第一次请求时),然后编译转化后的Servlet并加载到内存中执行,执行的结果Response到客户端。

   JSP只在第一次执行的时候会转化为Servlet,以后每次执行Web容器都是直接执行编译后的Servlet,所以JSPServlet只是在第一次执行的时候不一样,JSP慢一点,以后的执行都是相同的。

 

<2>JSP如何处理运行时异常(run-time)exceptions?

  可以使用页面的errorPage属性捕获没有处理的运行时异常,然后自动转向到一个错误处理页面,代码如下:

<%@ page errorPage=error.jsp” %>

  如果在页面请求时出现运行时异常是,以上代码会把页面转向到JSP页面error.jsp,在error.jsp里面,可以通过以下代码定义这个页面是错误处理页:

<%@ page isErrorPage=true” %>

这样描述错误信息的Throwable对象就可以在error.jsp页面里面访问到。


<3>如果jsp表单元素的值为空,如何避免null出现在页面上?

  可以写一个简单的函数对空值进行处理,判断值是否为空,如果是空就返回空字符串。实例代码如下:

<%!

String blanknull(String s){

return (s == null) ? “” : s;

}

%>

  在你的JSP里面,可以使用以上函数输出文本框或者其他页面元素的值,实例代码如下:

<input type=text” name=shoesize” value=<%=blanknull(shoesize)% >” >

 

 

完整页面代码:

 

<%@ page language="java" contentType="text/html; charset=GBK" pageEncoding="GBK" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=GBK">

<title>jspDemo</title>

</head>

<body>

<!-- 定义处理null值的方法 -->

<%!

String nullProcess(String s)

{

return s==null?"填写":s;

}

%>

<form action="#" method="get">

爱好:<input type="text" name="hobby" value="<%=nullProcess(request.getParameter("hobby"))%>">

<input type="submit" value="提交"> 

</form>

<%

String hobby=request.getParameter("hobby");

    out.println(hobby);

%>

</body>

</html>

 

<4>如何避免JSP页面自动生成session对象?为什么要这么做?

 

    在默认情况下,在对一个JSP页面发出请求时,如果session还没有建立,JSP页面会自动为请求建立一个session对象,但是session是比较消耗资源的,如果没必要保持和使用session,就不应该创建session, 例如一些只是用来宣传产品的网站,往往没必要使用session来保存信息,可以使用jsp页面指令session=false”来避免JSP页面为每个请求都自动创建session.实例代码如下:

 

<%@ page session=false>

 

<5>servletsJSP之间能共享session对象吗?

 

当然可以,

HttpSession session = request.getSession(true);

session.putValue(variable,value);

 

<6>Servlet都有哪些方法?主要作用是什么?

HttpServlet 类包含 init() 、 destroy() 、 service() 等方法。其中 init() 和 destroy() 方法是继承的。

(1) init() 方法

在 Servlet 的生命期中,仅执行一次 init() 方法。它是在服务器装入 Servlet 时执行的。 可以配置服务器,以在启动服务器或客户机首次访问 Servlet 时装入 Servlet 。 无论有多少客户机访问 Servlet ,都不会重复执行 init() 

缺省的 init() 方法通常是符合要求的,但也可以用定制 init() 方法来覆盖它,典型的是管理服务器端资源。 例如,可能编写一个定制 init() 来只用于一次装入 GIF 图像,改进 Servlet 返回 GIF 图像和含有多个客户机请求的性能。另一个示例是初始化数据库连接。缺省的 init() 方法设置了 Servlet 的初始化参数,并用它的 ServletConfig 对象参数来启动配置, 因此所有覆盖 init() 方法的 Servlet 应调用 super.init() 以确保仍然执行这些任务。在调用 service() 方法之前,应确保已完成了 init() 方法。

(2) service() 方法

service() 方法是 Servlet 的核心。每当一个客户请求一个 HttpServlet 对象,该对象的 service() 方法就要被调用,而且传递给这个方法一个“请求”( ServletRequest )对象和一个“响应”( ServletResponse )对象作为参数。 在 HttpServlet 中已存在 service() 方法。缺省的服务功能是调用与 HTTP 请求的方法相应的 do 功能。例如, 如果 HTTP 请求方法为 GET ,则缺省情况下就调用 doGet() 。 Servlet 应该为 Servlet 支持的 HTTP 方法覆盖 do 功能。因为 HttpServlet.service() 方法会检查请求方法是否调用了适当的处理方法,不必要覆盖 service() 方法。只需覆盖相应的 do 方法就可以了。

当一个客户通过 HTML 表单发出一个 HTTP POST 请求时, doPost ()方法被调用。 与 POST 请求相关的参数作为一个单独的 HTTP 请求从浏览器发送到服务器。当需要修改服务器端的数据时,应该使用 doPost() 方法。

当一个客户通过 HTML 表单发出一个 HTTP GET 请求或直接请求一个 URL 时, doGet() 方法被调用。 与 GET 请求相关的参数添加到 URL 的后面,并与这个请求一起发送。当不会修改服务器端的数据时,应该使用 doGet() 方法。

Servlet 的响应可以是下列几种类型:

一个输出流,浏览器根据它的内容类型(如 text/HTML )进行解释。

一个 HTTP 错误响应 重定向到另一个 URL 、 servlet 、 JSP 

(3) destroy() 方法

destroy() 方法仅执行一次,即在服务器停止且卸装 Servlet 时执行该方法。典型的,将 Servlet 作为服务器进程的一部分来关闭。缺省的 destroy() 方法通常是符合要求的,但也可以覆盖它,典型的是管理服务器端资源。例如,如果 Servlet 在运行时会累计统计数据,则可以编写一个 destroy() 方法,该方法用于在未装入 Servlet 时将统计数字保存在文件中。另一个示例是关闭数据库连接。

当服务器卸装 Servlet 时,将在所有 service() 方法调用完成后,或在指定的时间间隔过后调用 destroy() 方法。一个 Servlet 在运行 service() 方法时可能会产生其它的线程,因此请确认在调用 destroy() 方法时,这些线程已终止或完成。

(4) GetServletConfig()方法

GetServletConfig ()方法返回一个 ServletConfig 对象,该对象用来返回初始化参数和 ServletContext 。 ServletContext 接口提供有关 servlet 的环境信息。

(5) GetServletInfo()方法

(GetServletInfo ()方法是一个可选的方法,它提供有关 servlet 的信息,如作者、版本、版权。


当服务器调用 sevlet 的 Service ()、 doGet ()和 doPost ()这三个方法时,均需要 “请求”和“响应”对象作为参数。“请求”对象提供有关请求的信息,而“响应”对象提供了一个将响应信息返回给浏览器的一个通信途径。 javax.servlet 软件包中的相关类为 ServletResponse 和 ServletRequest ,而 javax.servlet.http 软件包中的相关类为 HttpServletRequest 和 HttpServletResponse 。 Servlet 通过这些对象与服务器通信并最终与客户机通信。 Servlet 能通过调用“请求”对象的方法获知客户机环境,服务器环境的信息和所有由客户机提供的信息。 Servlet 可以调用“响应”对象的方法发送响应,该响应是准备发回客户机的。

 

<7>Java Servlet的主要功能和作用是什么?

   Servlet 通过创建一个框架来扩展服务器的能力,以提供在 Web 上进行请求和响应服务。当客户机发送请求至服务器时,服务器可以将请求信息发送给 Servlet ,并让 Servlet 建立起服务器返回给客户机的响应。 当启动 Web 服务器或客户机第一次请求服务时,可以自动装入 Servlet 。装入后, Servlet 继续运行直到其它客户机发出请求。 Servlet 的功能涉及范围很广。例如, Servlet 可完成如下功能:

(1) 创建并返回一个包含基于客户请求性质的动态内容的完整的 HTML 页面。

(2) 创建可嵌入到现有 HTML 页面中的一部分 HTML 页面( HTML 片段)。

(3) 与其它服务器资源(包括数据库和基于 Java 的应用程序)进行通信。

(4) 用多个客户机处理连接,接收多个客户机的输入,并将结果广播到多个客户机上。例如, Servlet 

以是多参与者的游戏服务器。

(5) 当允许在单连接方式下传送数据的情况下,在浏览器上打开服务器至 applet 的新连接,并将该连

接保持在打开状态。当允许客户机和服务器简单、高效地执行会话的情况下, applet 也可以启动客户浏览器和服务器之间的连接。可以通过定制协议或标准(如 IIOP )进行通信。

(6) 对特殊的处理采用 MIME 类型过滤数据,例如图像转换和服务器端包括( SSI )。

(7) 将定制的处理提供给所有服务器的标准例行程序。例如, Servlet 可以修改如何认证用户。

<8>Request对象的主要方法有哪些?

setAttribute(String name,Object):设置名字为namerequest的参数值

getAttribute(String name):返回由name指定的属性值

getAttributeNames():返回request对象所有属性的名字集合,结果是一个枚举的实例

getCookies():返回客户端的所有Cookie对象,结果是一个Cookie数组

getCharacterEncoding():返回请求中的字符编码方式

getContentLength():返回请求的Body的长度

实例

getInputStream():返回请求的输入流,用于获得请求中的数据

getMethod():获得客户端向服务器端传送数据的方法

getParameter(String name):获得客户端传送给服务器端的有name指定的参数值

getParameterNames():获得客户端传送给服务器端的所有参数的名字,结果是一个枚举的实例

getParameterValues(String name):获得有name指定的参数的所有值

getProtocol():获取客户端向服务器端传送数据所依据的协议名称

getQueryString():获得查询字符串

getRequestURI():获取发出请求字符串的客户端地址

getRemoteAddr():获取客户端的IP地址

getRemoteHost():获取客户端的名字

getSession([Boolean create]):返回和请求相关Session

getServerName():获取服务器的名字

getServletPath():获取客户端所请求的脚本文件的路径

getServerPort():获取服务器的端口号

removeAttribute(String name):删除请求中的一个属性

<9>JSP中如何写文本文件?

使用PrintWriter对象,如:

<%@ page import=java.io.*” %>

<%

String str = print me;

String nameOfTextFile = /usr/anil/imp.txt;

try {

PrintWriter pw = new PrintWriter(new File

OutputStream(nameOfTextFile));

pw.println(str);

pw.close();

} catch(IOException e) {

out.println(e.getMessage());

}

%>

<10>JSP的缺点有哪些?

.JSP页面的调试并不算很强大;

JSP与其它脚本语言的交互,以及JSP页面嵌入Java语言,会造成JSP页面的可读性和可扩展性变差

 

<11>JSP中如何删除一个COOKIE?

首先创建一个与要删除的Cookie同名的Cookie,同时在其构造器内将其值设为null,然后用setMaxAge()方法将其生命设为0,使用setPath()方法将将其路径设为”/”,最后使用response对象的addCookie()方法添加此Cookie对象。

<%

Cookie killMyCookie = new Cookie(mycookie, null);

killMyCookie.setMaxAge(0);

killMyCookie.setPath(/);

response.addCookie(killMyCookie);

%>

 

Servlet API:

 

javax.servlet.http.Cookie

Method:

public void setPath(java.lang.String uri)

Specifies a path for the cookie to which the client should return the cookie. The cookie is visible to all the pages in the directory you specify, and all the pages in that directory's subdirectories. A cookie's path must include the servlet that set the cookie, for example, /catalog, which makes the cookie visible to all directories on the server under /catalog. Consult RFC 2109 (available on the Internet) for more information on setting path names for cookies.

Parameters:uri - a String specifying a path

 

<12>如何现实servlet的单线程模式?

 

<%@ page isThreadSafe=false%>

 

<13>Servlet的生命周期?

 

   Servlet是一种可以 在Servlet容器中运行的组件,那么理所当然就应该有一个从创建到销毁的过程,这个过程我们可以称之为Servlet生命周期。Servlet的生命周期可以分为加载、实例化、初始化、处理客户请求和卸载五个阶段,体现在方法上主要是init()、service()和destroy()三个方法。

生命周期的具体说明如下:

 ①Servlet容器完成加载Servlet类和实例化一个Servlet对象

 

·            ② init()方法完成初始化工作,该方法由Servlet容器调用完成

 

·            ③service()方法处理客户端请求,并返回响应结果

 

·            ④ destroy()方法在Servlet容器卸载Servlet之前被调用,释放一些资源

 

<14>介绍一下javax.servlet.Servlet接口及其主要方法?

 

Servlet接口的主要作用是提供Servlet生命周期的init()service()destroy()方法。

servlet接口中的主要方法有:

void init(ServletConfit config)throws ServletException     

servlet被载入后和实施服务前由servlet引擎进行一次性调用。如果init()产生溢出UnavailableException,则 servle退出服务。

ServletConfig getServletConfig()     

返回传递到servletinit()方法的ServletConfig对象

Void service(ServletRequest request,ServletResponse response)throwsServletException,IOException   

  处理request对象中描述的请求,使用response对象返回请求结果

String getServletInfo()         

返回描述servlet的一个字符串

void destory()        

 当servlet将要卸载时由servlet引擎调用,销毁Servlet实例。

 

<15>HttpServlet类中的主要方法都有哪些?各自的作用是什么?

HttpServlet的主要方法有 doGet, doPost, doPut, doDelete, doTrace等等

 

Void doGet(HttpServletRequest request,HttpServletResponse response)throws ServletException,IOException  

    servlet引擎调用用处理一个HTTP GET请求。输入参数、HTTP头标和输入流可从request对象、response头标和response对象的输出流中获得。


Void doPost(HttpServletRequest request,HttpServletResponse response)throws ServletException,IOException

     servlet引擎调用用处理一个HTTP POST请求。输入参数、HTTP头标和输入流可从request对象、response头标和response对象的输出流中获得。


Void doPut(HttpServletRequest request,HttpServletResponse response)throws ServletException,IOException

     servlet引擎调用用处理一个HTTP PUT请求。本方法中请求URI指出被载入的文件位置。


Void doDelete(HttpServletRequest request,HttpServletResponse response)throws ServletException,IOException

     servlet引擎调用用处理一个HTTP DELETE请求。请求URI指出资源被删除。


Void doOptions(HttpServletRequest request,HttpServletResponse response)throws ServletException,IOException

     servlet引擎调用用处理一个HTTP OPTIONS请求。返回一个Allow响应头标表明此servlet支持的HTTP方法。一个servlet不需要覆盖此方法,因为 HttpServlet方法已经实现规范所需的功能。


Void doTrace(HttpServletRequest request,HttpServletResponse response)throws ServletException,IOException

     servlet引擎调用用处理一个HTTP TRACE请求。使得请求头标被反馈成响应关标。一个servlet不需要覆盖此方法,因为HttpServlet方法已经实现HTTP规范所需的功能。


Void service(HttpServletRequest request,HttpServletResponse response)throws ServletException,IOException

     Service(Request request,Response response)调用的一个立即方法,带有指定HTTP请求和响应。此方法实际上将请求导向doGet()doPost()等等。不应该覆盖此方法。


Void service(Request request,Response response)throws ServletException,IOException

     将请求和响应对象置入其指定的HTTP子类,并调用指定HTTPservice()方法。

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值