可以从两个方面去看Servlet:
a、API:有一个接口servlet,它是servlet规范中定义的用来处理客户端请求的程序需要实现的顶级接口。
b、组件:服务器端用来处理客户端请求的组件,需要在web.xml文件中进行置。
注:以上是从servlet的api角度和组件看待servlet的,我倒是感觉还如从定义上说,可能更容易理解. 1)servlet是运行在服务端的小程程序,是sun公司提供的一套规范的接口. 2)用来处理客户端请求,响应给游览器的动态资源. 这两种说法都可以,其实都是一样的.
默认第一次访问servlet时创建该对象
服务器关闭servlet就销毁了
service(ServletRequest req, ServletResponse res)方法
注:这是一道有关servlet的声明周期的题,务必要清楚servlet的创建销毁时机.
init(),1次
destory(),服务器没有关闭, 不执行
service(),10次
request对象创建10个
response创建10个
注:每次访问service方法都必执行,其中service方法有两个参数
ServletRequest :代表请求 认为ServletRequest 内部封装的是http请求的信息
ServletResponse :代表响应 认为要封装的是响应的信息
servlet声明周期分5个步骤
1.加载servlet.当tomcat第一次访问servlet的时候,tomcat就会负责servlet的实例化.
2.初始化,当servlet被实例化执行,tomcat会被调用init()方法初始化这个对象
3.处理服务.当游览器访问servlet的时候,servlet会调用service方法处理请求
4.销毁.当tomcat关闭时或者检测到servlet要从tomcat删除的时候,自动调用destroy方法,让该实例释放掉所占的资源,一个servlet如果长时间不被使用的话,也会被tomcat自动销毁
5.卸载.当servlet调用完destroy方法后,等待垃圾回收,如果需要再次使用这个servlet会重新调用init方法进行初始化操作.
注:只要访问servlet,service就会被调用,init只有第一次访问到的时候才会被调用.destroy只有在tomcat被关闭时才会被调用.
区别:
Servlet处于服务器进程中,它通过多线程运行service()方法,一个实例可以服务于多个请求,并且实例一般不会被销毁;而CGI对每个请求都产生一个新的进程,服务完成后就销毁,所有效率低于Servlet
注:我们都知道web服务器所处理的内容都是静态的,要想处理动态内容,需要依赖于web应用程序,如php、jsp、python、perl等。但是web server如何将动态的请求传递给这些应用程序?它所依赖的就是cgi协议.简单的说就是通过cgi协议,再结合已搭建好的web应用程序,就可以让web server也能"处理"动态请求
博客园骏马金龙https://www.cnblogs.com/f-ck-need-u/p/7627035.html建立读一下即可,其中cgi协议重点理解一下,其他可以不读或者略读.
get是用来从服务器上获取数据,而post是用来向服务器传递数据;
get将表单中数据按照variable=value的形式,添加到action所指向的URL后面,并且两者用"?“连接,变量之间用”&"连接;而post是将表单中的数据放在form的数据体中,按照变量与值对应的方式,传递到action所指定的URL。
get是不安全的,因为在传输过程中,数据是被放在请求的URL中;而post的所有操作对用户来说都是不可见的。
get传输的数据量小,这主要应为受url长度限制;而post可以传输大量的数据,所有上传文件只能用post提交。
get限制form表单的数据集必须为ASCII字符;而post支持整个
get包含请求体,post不包含请求体.
注:从数据长度、安全性、传递方式、是否包含请求体、数据流向、字符集谈即可
默认情况是调用doGet()方法,JSP页面中的Form表单的method属性设置为post的时候,调用的为doPost()方法;为get的时候,调用deGet()方法。
转发(Forword)
通过RequestDispatcher对象的forward(HttpServletRequest request,HttpServletResponse response)方法实现的。RequestDispatcher可以通过HttpServletRequest 的getRequestDispatcher()方法获得。例如下面的代码就是跳转到login_success.jsp页面。
request.getRequestDispatcher("login_success.jsp").forward(request, response);
重定向(Redirect) 是利用服务器返回的状态吗来实现的。客户端浏览器请求服务器的时候,服务器会返回一个状态码。服务器通过HttpServletRequestResponse的setStatus(int status)方法设置状态码。如果服务器返回301或者302,则浏览器会到新的网址重新请求该资源。
从地址栏显示来说
forward是服务器请求资源,服务器直接访问目标地址的URL,把那个URL的响应内容读取过来,然后把这些内容再发给浏览器。浏览器根本不知道服务器发送的内容从哪里来的,所以它的地址栏还是原来的地址。
redirect是服务端根据逻辑,发送一个状态码,告诉浏览器重新去请求那个地址,所以地址栏显示的是新的URL。
从数据共享来说
forward:转发页面和转发到的页面可以共享request里面的数据.
redirect:不能共享数据.
从运用地方来说
forward:一般用于用户登陆的时候,根据角色转发到相应的模块.
redirect:一般用于用户注销登陆时返回主页面和跳转到其它的网站等
从效率来说
forward:高.
redirect:低.
注:转发是服务器行为,重定向是客户端行为。
自动刷新不仅可以实现一段时间之后自动跳转到另一个页面,还可以实现一段时间之后自动刷新本页面。Servlet中通过HttpServletResponse对象设置Header属性实现自动刷新例如:
Response.setHeader("Refresh","1000;URL=http://localhost:8080/servlet/example.htm");
其中1000为时间,单位为毫秒。URL指定就是要跳转的页面(如果设置自己的路径,就会实现每过一秒自动刷新本页面一次)