1. Web页面中都可以使用哪些方式来发送HTTP请求?
答:(1)用户在浏览器的地址栏中输入URL并按Enter键;
(2)用户单击了HTML页面中的超链接;
(3)用户在HTML页面中填写一个表单并提交。
- GET与POST两种请求方式有什么区别?分别适用于什么情况?
答:(1)GET方法用来检索资源。它的含义是“获得(get)由该URI标识的资源”。GET方法请求的资源通常是静态资源。使用GET也可以请求动态资源,但一般要提供少量的请求参数。
(2)POST方法用来向服务器发送需要处理的数据,它的含义是“将数据发送(post)到由该URI标识的动态资源”。
- HTTP响应内容的类型都有哪些?如何设置HTTP响应内容的类型?
答:HTTP响应内容的类型有:
(1)public PrintWriter getWriter():返回一个PrintWriter对象用于向客户发送文本数据。
(2)public ServletOutStream getOutputStream() throws IOException:返回一个输出流对象,它用来向客户发送二进制数据。
(3)public void setContentType(String type):设置发送到客户端响应的MIME内容类型。
设置HTTP响应内容的类型的方法:
设置响应数据内容类型应该使用相应对象的setContentType(),如果没有调用该方法,内容类型将使用默认值text/html,即HTML文档。给定的内容类型可能包括所使用的字符集。例如:response.setContentType(“text/html;charset=UTF-8”);
可以调用响应对象response的setCharacterEncoding()设置响应的字符编码(如UTF-8)。如果没有指定响应的字符编码,PrintWriter将使用ISO-8859-1编码。
如果不使用默认的响应的内容类型和字符编码,应该先调用响应的setContentType(),然后再调用getWriter()或getOutputStream()获得输出流对象。
- 什么是ServletContext对象,它的生存周期如何?
答:Web容器在启动时会加载每个Web应用程序,并为每个Web应用程序创建一个唯一的ServletContext实例对象,该对象称为Servlet上下文对象。
使用ServletContext可以存储数据,该对象是一个作用域对象,它的作用域是整个应用程序。
- ServletContext与ServletRequest的getRequestDispatcher()方法有什么区别?
答:对ServletContext的getRequestDispatcher()只能传递以“/”开头的路径,而对ServletRequest的getRequestDispatcher(),可以传递一个相对路径。
1. 请求中的参数如果是中文,如何正常显示中文参数值?
答:response.setContentType(“text/html;charset=UTF-8”);
2.使用RequestDispatcher的forward()方法转发请求和使用HttpServletResponse的sendRedirect()方法重定向请求有什么区别?
答:RequestDispatcher.forward 方法只能将请求转发给同一个Web应用中的组件,而HttpServletResponse.sendRedirect 方法不仅可以重定向到当前应用程序中的其他资源,还可以重定向到同一个站点上的其他应用程序中的资源,甚至是使用绝对URL重定向到其他站点的资源。
3. 什么是Web归档文件?如何为一个Web应用创建一个WAR文件?如何发布WAR文件?
答:Web归档文件即应用程序打包文件,jar -cvf blog.war *
为一个Web应用创建一个WAR文件的步骤:
(1)打开window下的dos窗口,(window+r再输入cmd回车)。
(2)把dos窗口操作的目录定位到你的webapp所在的目录(先输入“cd\”进到c盘根目录,再输入“cd 复制你的目录的地址”后回车)。
(3)在命令窗口中输入 “jar -cvf 应用名称.war 应用名称” 后回车,下面就会出现很多带有“存储了,压缩了”等字样的信息就表示成功了。
注意:(在命令窗口中输入 “jar -cvf 应用名称.war 应用名称”不同的关键字后面要空一个空格)。
(4)前三步成功后你就可以在你的webapps所在目录下看到一个名为“应用名称.war”的文件。
(5)因为war文件放到tomcat的webapps目录下,tomcat服务器一启动就会自动解压,所以比较方便。
4. 如何编写线程安全的Servlet?
答:使用ServletContext中属性参数;实现 SingleThreadModel 接口,该接口指定了系统如何处理对同一个Servlet的调用。如果一个Servlet被这个接口指定,那么在这个Servlet中的service方法将不会有两个线程被同时执行,当然也就不存在线程安全的问题;在Servlet里面的任何方法里面都不使用实例变量,那么该Servlet就是线程安全的。
1. JSP语法元素有哪些?使用时应注意什么问题?
答:JSP语法元素有JSP脚本元素、JSP指令、JSP动作、表达式语言、JSP注释五种。在访问外部资源之前,需要检查是否可以正常连接和使用,使用时应注意每一种JSP语法元素都具有严格定义的语法。当JSP页面被被访问时,Web容器将JSP页面转换成Servlet类执行后将结果发送给客户,与其他的Web页面一样,JSP页面也有一个唯一的URL,客户可以通过它访问该页面。
2. JSP页面的生命周期包括哪几个阶段?
答:
阶段名称 | 说明 |
①页面转换 | 对页面解析并创建一个包含对应Servlet的Java源文件 |
②页面编译 | 对Java源文件编译 |
③加载和创建实例 | 将编译后的类加载到容器中,并创建一个Servlet实例 |
④调用jspInit() | 调用其他方法之前调用该方法初始化 |
⑤调用_jspService() | 对每个请求调用一次该方法 |
⑥调用jspDestroy() | 当Servlet容器决定停止Servlet服务时调用该方法 |
3. JSP指令和动作有哪些?有什么区别?
答:JSP指令:page指令、include指令、taglib指令;JSP动作:JSP标准动作、标准标签库(JSTL)中的动作和用户自定义动作。
区别:指令是向容器提供关于JSP页面的总体信息,在编译时加入,所谓静态,就是在编译的时候将a.jsp的代码加入进来再编译,之后运行.;而动作是页面发给容器的命令,在运行时加入,所谓动态,就是单独编译,在运行时候加入进来,之后显示,这种include可以传递参数,它指示容器在页面执行期间完成某种任务。
- page指令有哪些常用的属性,这些属性的功能是什么?
答:
属性名 | 功能 |
import | 导入在JSP页面中使用的Java类和接口,其间用逗号分隔 |
contentType | 指定输出的内容类型和字符集 |
pageEncoding | 指定JSP文件的字符编码 |
session | 用布尔值指定JSP页面是否参加HTTP会话 |
errorPage | 用相对URL指定另一个JSP页面用来处理当前页面的错误 |
isErrorPage | 用一个布尔值指定当前JSP页面是否用来处理错误 |
language | 指定容器支持的脚本语言 |
extends | 任何合法地实现了javax. servlet. jsp. JspPage接口的Java类 |
buffer | 指定输出缓冲区的大小 |
autoFlush | 指定是否当缓冲区满时自动刷新 |
info | 关于JSP页面的任何文本信息 |
isThreadSafe | 指定页面是否同时为多个请求服务 |
isELIgnored | 指定是否在此转换单元中对EL表达式求值 |
1. 如何给JSP页面设置初始化参数并访问这些初始化参数?
答:使用JSP对应的Servlet初始化参数 给JSP页面提供初始化参数在三个方面不同于给servlet提供初始化参数。
(1)InitParamter访问方法
使用应用范围内的初始化参数。一般,对单个地servlet或JSP页面分配初始化参数。指定的servlet或JSP页面利用ServletConfig的getInitParameter方法读取这些参数。
但是,在某些情形下,希望设置可由任意servlet或JSP页面借助ServletContext的getInitParameter方法读取的系统范围内的初始化参数。可利用context-param元素声明这些系统范围内的初始化值。
(2)使用内置的application对象访问方法
String value = application.getInitParameter(“参数名”);//---- 得到结果: appParaValue。
2. JSP的四大作用域对象pageContext, request, session、application对应的Servlet类、作用及范围各是什么?
答:存储在应用作用域的对象可被Web应用程序的所有组件共享并在应用程序生命期内都可以访问,application在服务器启动时创建,在服务器关闭时销毁。所有的用户都可以取得此信息,此信息在整个服务器上被保留。
存储在会话作用域的对象可以被属于一个用户会话的所有请求共享并只能在会话有效时才可被访问,服务器会为每个会话创建一个session对象,所以session中的数据可供当前会话中所有servlet共享;
存储在请求作用域的对象可以被处理同一个请求的所有组件共享并仅在该请求被服务期间可被访问,request是表示一个请求,只要发出一个请求就会创建一个request。
存储在页面作用域的对象只能在他们所定义的转换单元中被访问,page对象即this,代表JSP本身,可以调用Servlet类所定义的方法。
作用域名 | 应用作用域 | 会话作用域 | 请求作用域 | 页面作用域 |
对应的对象 | application | session | request | pageContext |
对应的Servlet类 | ServletContext | HttpSession | HttpServletRequest | PageContext |
范围 | 在整个Web应用程序有效 | 在一个用户会话范围内有效 | 在用户的请求和转发的请求内有效 | 只在当前的页面(转换单元)内有效 |
作用 | 在实际应用中,page对象很少在JSP中使用 | 常用于服务器间同一请求不同页面之间的参数传递,常应用于表单的控件值传递 | 常用于web开发中的登录验证界面(当用户登陆成功后浏览器分配其一个session键值对) | 一般用于在多个客户端间共享数据时使用 |
1. 静态include指令何时执行?主页面和被包含的子页面是否转换为一个转换单元?
同一个转换单元的页面之间如何共享数据?
答:静态包含是在JSP页面转换阶段将另一个文件的内容包含到当前JSP页面中。当请求main.jsp页面时,容器在创建main.jsp页面实现类时,把文件other.jsp中的所有内容包含起来,结果代码是主页面和被包含页面的组合,最后作为一个转换单元翻译。同一个转换单元的页面之间通过隐含变量共享数据。
2. <jsp:include>动作指令何时执行?主页面和被包含的子页面是否转换为一个转换单元?动作包含的子页面与主页面共享同一个请求吗?在不同的转换单元中如何进行数据的传递和共享?
答:jsp:include动作指令在JSP页面转换阶段执行。主页面和被包含的子页面不转换为一个转换单元。动作包含的子页面与主页面共享同一个请求。在不同的转换单元中通过请求作用域的对象或隐含变量进行数据的传递和共享。
3. <jsp:forward>动作与<jsp:include>动作有什么相同点和不同点?与<jsp:forward>动作等价的其他两种写法如何表示?
答:相同点:都可以实现转换页面;不同点:当转发到的页面处理完输出后,并不将控制转回主页面。主页面也不包含任何输出。
4. 什么是JavaBean?
答:JavaBeans是java平台的组件技术,在Java Web开发中常用JavaBeans来存放数据、封装业务逻辑等,从而很好地实现业务逻辑和表示逻辑的分离,使系统具有更好的健壮性和灵活性。对程序员来说,JavaBeans最大的好处是可以实现代码的重用,另外对程序的易维护性等也有很大的意义。
5. 访问JavaBean的三个JSP动作中<jsp:useBean>动作的常用属性有哪些?这些属性各有什么作用?
答:
属性 | 作用 |
id属性 | 用来唯一标识一个bean实例 |
scope属性 | 指定bean实例的作用域 |
class属性 | 指定创建bean实例的Java类 |
type属性 | 指定由id属性声明的变量的类型。 |
1. 什么是Model 1体系结构,有何缺点?
答:Model1体系每个请求的目标都是JSP页面。JSP页面负责完成所有任务并将响应发送给客户。缺点:①特需要将大量的Java代码的业务逻辑嵌入到JSP页面中;②不能提高组件的可重用性。
2. 什么是MVC设计模式?其优点是什么?
答:MVC模式将Web组件分为模型(Model)、视图(View)、和控制器(Controller),每个组件完成各自的任务,其中,所有请求的目标都是Servlet控制器,控制器负责分析请求并将响应所需要的数据收集到JavaBean对象或POJO对象中,该对象作为应用程序的模型。最后,Servlet控制器将请求转发到JSP页面。这些页面使用存储在JavaBeans中的数据产生响应。该模型将业务逻辑和数据访问从表示层分离出来。
该模型的最大优点是将业务逻辑和数据访问从表示层分离出来。控制器提供了应用程
序的单一入口点,它提供了较清晰的实现安全性和状态管理的方法,并且这些组件可以根据
需要实现重用。然后,根据客户的请求,控制器将请求转发给合适的表示组件,由该组件来
响应客户。这使得Web页面开发人员可以只关注数据的表示,因为JSP页面不需要任何复
杂的业务逻辑。
3. 实现MVC设计模式的一般步骤是什么?
答:(1)定义JavaBeans存储数据;
(2)定义Servlet处理请求;
(3)将数据存储到JavaBean对象中,将对象存储在JSP视图能够访问的地方;
(4)转发请求或使用响应重定向调用JSP视图进行响应;
(5)JSP视图从JavaBeans对象中提取数据。
1. 什么是会话,一个会话的生产周期从什么时候,到什么时候结束?
答:会话是客户与服务器之间的不中断的请求响应序列。当一个客户向服务器发送第一个请求时就开始了一个会话。对该客户之后的每个请求,服务器能够识别出请求来自于同一个客户。当客户结束会话或服务器在一个预定义的时限内没从客户接收任何请求时,会话结束。当会话结束后,服务器就忘记了客户以及客户的请求。
2. 服务器是如何识别管理属于某一个特定客户的会话的?
答:(1)当客户向服务器发送第一个请求时,服务器就可以为该客户创建一个HttpSession会话对象,并将请求对象与该会话对象关联。服务器在创建会话对象时为其指定一个唯一标识符,称为会话ID,它可以作为该客户的唯一标识。此时,该会话处于新建状态,可以使用HttpSession接口的isNew()来确定会话是否处于该状态。
(2)当服务器向客户发送响应时,服务器将该会话ID与响应数据一起发送给客户,这是通过Set-Cookie响应头实现的。
(3)客户在接收到响应后将会话ID存储在浏览器的内存中。当客户再次向服务器发送请求时,它使用Cookie请求头把会话ID与请求一起发送给服务器。
(4)服务器接收到请求后,从请求对象中取出会话ID,在服务器中查找之前创建的会话对象,找到后将该请求与之前创建的ID值相同的会话对象关联起来。
3. 什么是Cookie,它的作用是什么?Cookie会给客户端带来安全隐患吗?
答:(1)Cookie是客户访问Web服务器时,服务器在客户硬盘上存放的信息,它实际上是一小段文本信息,客户以后访问同一个Web服务器时浏览器会把它们原样发送给服务器。通过让服务器读取它原先保存到客户端的信息,网站能够为浏览者提供一系列的方便。(2)Cookie不会给客户端带来安全隐患,它永远不会以任何方式执行。
- 如何使用隐藏表单域传递会话信息,一般用在什么情况下?
答:在HTML页面中,可以使用下面代码实现隐藏的表单域:
<input type=”hidden” name=”userName”value=”hacker”>
当表单提交时,浏览器将指定的名称和值包含在GET或POST的数据中。这个隐藏域可以存储有关会话的信息。但它的缺点是:仅当每个页面都是由表单提交而动态生成时,才能使用这种方法。单击常规的超链接并不产生表单提交,因此,隐藏的表单域不能支持通常的会话跟踪,只能用在某些特定的操作中,例如在线商店的结账过程。
1. 如何理解会话失效与超时?如何通过程序设置最大失效时间?如何通过Web应用程序部署描述文件设置最大超时时间?二者有什么区别?
答:当用户在一个指定的期限内处于不活动状态时,就将用户的会话终止,这称为会话超时。通过会话对象的setMaxInactiveInterval()方法设置会话最大超时时间。
web.xml文件使用<session-config>元素的子元素<session-timeout>设置最大超时时间,如下所示,
<session-config>
<session-timeout>10</session-timeout>
</session-config>
这里的最大超时时间是对整个应用程序的所有会话对象有效,<session-timeout>元素指定的以分钟为单位的超时期限,setMaxInactiveInterval()方法仅对调用它的会话有影响,其他会话的超时期限仍然是web.xml文件中设置的值。
2. 能否通过客户机的IP地址实现会话跟踪?
答:容器不能使用客户的IP地址唯一标识客户。因为是通过局域网访问Internet尽管在局域网中每个客户有一个IP地址,但对于服务器来说,客户的实际IP地址是路由器的IP地址,所以该局域网的所有客户的IP地址都相同。
- 假如开发的Web应用程序是假设客户支持Cookie的,但应用程序部署后,你发现大多数客户禁用了Cookie,这对应用程序有何影响?如何修改它?
答:来自网站的所有Cookie都被阻止,并且计算机上现有的Cookie不能被网站读取。可在Internet选项中设置。
1. JDBC常用的类对象与接口有哪些?它们的功能如何?
答:Driver接口:通过Class.forName()装载特定厂商提供的数据库驱动程序;
DriverManager类:管理驱动程序,通过getConnection()方法建立与数据库的连接。
Connection对象:代表与数据库的连接,不同的数据库驱动程序和连接的URL都不相同
Statement对象:提供在基层连接上运行SQL语句并访问结果。
ResultSet对象:提供对查询结果集的行访问的方法,并且可以访问结果的不同字段
2. 使用数据源访问数据库的基本思想是什么?这样做有什么好处?
答:数据源是目前Web应用开发中获取数据库连接的首选方法,这种方法是事先建立若干连接对象,将它们存放在数据库连接池中供数据访问组件共享。
使用这种技术,应用程序在启动时只需创建少量的连接对象,不需要为每个HTTP请求都创建一个连接对象,大大降低请求的响应时间。
3. 什么是DAO?DAO设计模式有什么好处?
答:DAO(Data Access Object)称为数据访问对象。DAO设计模式可以在使用数据库的应用程序中实现业务逻辑和数据访问逻辑分离,使应用维护变得更简单。
DAO将数据访问实现(通常使用JDBC技术)封装在DAO类中,提高应用程序的灵活性。
1. 总结并归纳传统JDBC方法访问数据库的步骤。
答:(1)加载驱动程序
(2)建立连接对象
(3)创建语句对象
(4)执行语句并处理结果
(5)关闭建立的对象。
- 总结并归纳使用数据源访问数据库的步骤。
答:在DataSource中事先建立数据库连接,将这些连接保存在连接池中,当java程序访问数据库时,就从连接池中取出空闲状态的连接,当我们的程序访问结束时,再把这些数据库连接放回连接池,从而提高访问数据库的效率。
1. 总结并归纳传统JDBC方法访问数据库的步骤。
答:(1)加载驱动程序
(2)建立连接对象
(3)创建语句对象
(4)执行语句并处理结果
(5)关闭建立的对象。
- 总结并归纳使用数据源访问数据库的步骤。
答:在DataSource中事先建立数据库连接,将这些连接保存在连接池中,当java程序访问数据库时,就从连接池中取出空闲状态的连接,当我们的程序访问结束时,再把这些数据库连接放回连接池,从而提高访问数据库的效率。