Servlet总结

在方法。Servlet需要在web.xml中配置,一个Servlet可以设置多个URL访问。Servlet不是线程安全的,因此要谨慎使用类变量。

Servlet和CGI的区别

CGI的不足之处:

1.需要为每个请求启动一个操作CGI程序的系统进程。如果请求频繁,这将会带来很大的开销。

2.需要为每个请求加载和运行一个CGI程序,这将带来很大的开销。

3.需要重复编写处理网络协议的代码以及编码,这些工作都是非常耗时的。

Servlet的优点:

1.只需要启动一个操作系统进程以及加载一个JVM,大大降低系统的开销。

2.如果多个请求需要做同样处理的时候,这时候只需要加载一个类,这也大大降低了开销。

3.所有动态加载的类可以实现对网络协议以及请求解码的共享,大大降低了工作量。

4.Servlet能直接和Web服务器交互,而普通的CGI程序不能。Servlet还能在各个程序之间共享数据,使数据库连接池之类的功能很容易实现。

Servlet接口中有哪些方法及Servlet生命周期探秘

Servlet接口中定义了5个方法,其中前三个方法与Servlet生命周期相关。

void init(ServletConfig config)
void service(ServletRequest req, ServletResponse
resp)
void destory()
ServletConfig getServletConfig()

生命周期:Web容器加载Servlet并将其实例化后,Servlet生命周期开始,容器运行其init()方法进行Servlet的初始化;请求到达时调用Servlet的service()方法,service()方法会根据需要调用与请求对应的doGet或doPost等方法;当服务器关闭或项目被卸载时服务器会将Servlet实例销毁,此时会调用Servlet的destory()方法,init方法和destory方法只会被执行一次,service方法客户端每次请求Servlet都会执行。Servlet中有时会调用一些需要初始化或销毁的资源,因此可以把初始化资源的代码放入init方法中,销毁资源的代码放入destory方法中,这样就不需要每次处理客户端的请求都要初始化与销毁资源。

get和post请求的区别

1.get请求用来从服务器上获取资源,而post用来向服务器提交资源。

2.get将表达中数据按照name-value的形式,添加到action所指向的URL后面,并且两者使用?连接,而各个变量之间使用&连接;post是将表单中的数据放在HTTP协议的请求头或消息体中,传递到action所指向的URL。

3.get传输的数据要受到URL长度限制(1024字节即256个字符);而post可以传输大量的数据,上下文件通常要使用post方式;

4.使用get时参数会显示在地址栏上,如果这些数据不是敏感数据,那么可以使用get;对于敏感数据应使用post;

5.get使用MIME类型application/x-www-form-urlencoded的URL编码(也可以叫百分号编码)文本的格式传递参数,保证被传送的参数由遵循规范的文本组成,例如一个空格的编码是“

6.get方式提交表单的典型应用是搜索引擎。get方式就是被设计为查询用的

什么情况下调用doGet()和doPost()

Form标签里的method的属性为get时调用doGet(),为post时调用doPost()。

转发(Forward)和重定向(Redirect)的区别

转发(Forward)通过RequestDispatcher对象的forward(HttpServletRequest

request, HttpServletResponse

response)方法实现的。RequestDispatcher可以通过HttpServletRequest的getRequestDispatcher()方法获得。

重定向(Redirect)是利用服务器返回的状态码来实现的。客户端浏览器请求服务器的时候,服务器会返回一个状态码。服务器通过HttpServletRequestResponse的setStatus(int

status)方法设置状态码。如果服务器返回301或者302,则浏览器会到新的网址重新请求该资源。

1.从地址栏显示

forward是服务器请求资源。服务器直接访问目标地址的URL,把那个URL的响应内容读取过来,然后把这些内容再发给浏览器。浏览器根本不知道服务器发送的内容从哪里来的,所以它的地址栏还是原来的地址。

redirect是服务端根据逻辑,发送一个状态码,告诉浏览器重新去请求那个地址,所以地址栏显示的是最新的URL。

2.从数据共享

forward:转发页面和转发到的页面可以共享request中的数据。

redirect:不能共享数据。

3.从运用地方

forward:一般用于用户登录的时候,根据角色转发到相应的模块。

redirect:一般用于用户注销登录时返回主页面和跳转到其他的网站等。

4.从效率

forward:高

redirect:低

自动刷新(Refresh)

自动刷新不仅可以实现一段时间之后自动跳转到另一界面,还可以实现一段时间之后自动刷新本页面。Servlet中通过HttpServletResponse对象设置Header属性实现自动刷新例如:

Response.setHeader("Refresh",

"1000;URL=http://localhost:8080/servlet/examp");

其中1000为时间,单位为毫秒。URL指定就是要跳转的页面(如果设置自己的路径,就会实现没过一秒自动刷新本页面一次)。

Servlet与线程安全

Servlet不是线程安全的,多线程并发的读写会导致数据不同步的问题。解决的办法是尽量不要定义全局name属性,而是要把name变量分别定义在doGet()和doPost()方法内。虽然使用synchronized(name){}语句块可以解决问题,但是会造成线程的等待,不是很科学的办法。

注意:多线程的开发的读写Servlet类属性会导致数据不同步。但是如果只是并发地读取属性而不写入,则不存在数据不同步的问题。因此Servlet里的只读属性最好定义为final类型的。

JSP和Servlet是什么关系?

Servlet是一个特殊的Java程序,它运行于服务器的JVM中,能够依靠服务器的支持向浏览器提供显示内容。JSP本质上是Servlet的一种简易形式,JSP会被服务器处理成一个类似于Servlet的Java程序,可以简化页面内容的生成。Servlet和JSP最主要的不同点在于,Servlet的应用逻辑是在Java文件中,并且完全从表示层中的HTML分离开来。而JSP的情况是Java和HTML可以组合成一个扩展名为.jsp的文件。有人说,Servlet就是在Java中写HTML,而JSP就是在HTML中写Java代码,当然这个说发是很片面且不够准确的。JSP侧重于视图,Servlet更侧重于控制逻辑,在MVC架构模式中,JSP适合充当视图(view)而Servlet适合充当控制器(controller)。

JSP工作原理:

JSP是一种Servlet,但是与HttpServlet的工作方式不太一样。HttpServlet是先由源代码编译为class文件后部署到服务器下,为先编译后部署。而JSP则是先部署后编译。JSP会在客户端第一次请求JSP文件时被编译为HttpJspPage类(接口Servlet的一个子类)。该类会被服务器临时存放在服务器工作目录里。例如:工程JspLoginDemo下有一个名为login.jsp的Jsp文件,把工程第一次部署到服务器上后访问这个jsp文件,我们发现这个目录下多了两个文件。.class文件便是JSP对应的Servlet。编译完毕后在运行class文件来响应客户端请求。以后客户端访问login.jsp的时候。Tomcat将不再重新编译JSP文件,而是直接调用class文件来响应客户端的请求。

由于JSP只会在客户端第一请求的时候被编译,因此第一次请求JSP时会感觉比较慢,之后就会感觉快很多。如果把服务器保存的class文件删除,服务器也会重新编译JSP。

开发Web程序时经常需要修改JSP。Tomcat能够自动检查到JSP程序的改动。如果检测到JSP源代码发生了改动。Tomcat会在下次客户端请求JSP时重新编译,而不需要重启Tomcat。这种自动检测功能时默认开启的,检测改动会消耗少量的时间,在部署Web应用的时候可以在web.xml中将它关掉。

JSP有那些内置对象?作用分别是什么?

JSP有9个内置对象:

request:封装客户端的请求,其中包含来自GET或POST请求的参数。

response:封装服务器对客户端的响应。

pageContext:通过该对象可以获取其他对象。

session:封装用户会话的对象。

application:封装服务器运行环境的对象。

out:输出服务器响应的输出流对象。

config:Web应用的配置对象。

page:JSP页面本身(相当于Java程序中的this)。

exception:封装页面抛出异常的对象。

Request对象的主要方法有那些?

setAttribute(String name, Object

obj):设置名字为name的request的参数值。

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

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

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

getCharacterEncoding():返回请求中的字符编码方式=getContentLength():返回请求的Body长度。

getHeader(String name):获得HTTP协议定义的文件头信息。

getHeaders(String name):返回指定名字的request

Header的所有值,结果是一个枚举的实例。

getHeaderNames():返回所有request Header的名字,结果是一个枚举实例。

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):删除请求中的一个属性