---恢复内容开始---
servlet 是Javaweb的三大组件之一。
三大组件:servlet,filter,lisoner
客户端通过服务器想浏览器发出请求。
我们所写的AServlet、BServlet,都是由我们实现servlet接口的实现类。
servlet是单例的,一个类一个servlet,他们的功能是不同的。但他是线程不安全的,而且效率是高的。有可能出现一个servlet处理同时处理多个请求,所以最好不要在servlet中随便创建成员变量,有可能出现一个线程是读操作,另一个线程是写操作,这样就出现线程不安全的问题。但如果是只读,或者只写操作还可以。
servlet 类我们写(比如执行什么功能),但是对象由Tomcat创建。
servlet完成的三大块:
获取请求数据、 请求处理、完成响应。
servlet的三大生命周期方法:init(),//第一次请求servlet则创建。destroy()//Tomcat关闭则死亡。
service(),,,//可以多次调用,每次处理请求都会调用。
而这些方法都是由Tomcat调用,调用destory则servlet死亡,关闭Tomcat则死亡。
tomcat怎么访问servlet,servlet只是一个java类???
需要用xml配置文件,将servlet和URL的路径绑在一起。
在xml配置中,获取初始化参数。
获取初始化参数
需要调用service时,Tomcat将service的两个参数强转成httpservletrequest,和 httpservletresponse类型。然后通过httpservletreques得到当前的请求方式,是post还是get,如果是post,则调用doPost方法,如果是get,则调用get方法。
4打头,是客户端的错误。
一般情况下,servlet的创建时第一次被调用的时候,但是可以设置xml文件实现服务器开启时就创建。
图中的<load-on-startup> 表示第一次开启的时候就创建的顺序。
ServletContext==application
生命周期在服务器开启时创建,服务器关闭时死亡。
一个项目只有一个servletcontext对象。
servletconfig()。getservletContext();
正常我们创建一个servlet会继承httpservlet
public void servlet extends httpservlet(){
………………}
但其实,httpservlet继承了servletconfig接口。
javaweb中有四大域对象,即pageContext,servletContext,servletrequest,httpsession。
域对象是什么?有什么作用?
域对象不需要创建直接在servlet区域中调用,作用是保存数据以及servlet之间的数据传递。所以域对象有两大功能,第一存数据,第二取数据。
servletcontext可以设置全局的初始化参数,此初始化参数不属于任何一个servlet
下面是一个小练习:
访问量的统计。
第一次访问的时候建立一个int型的变量在servletcontext这个对象中,之后的每次访问都+1;
首先,第一次访问的时候用setattribute()这个函数来创建一个属性,
将输入流转化为字符串,需要用到commons.ioUtils这个工具类。
URI=项目名+servlet路径:、/goods/AServlet
URL:不包含路径的参数的请求路径。即?之后全没有
获取请求参数,用户向服务器发出请求,如果请求参数在请求体中,则是post请求,如果是URL中,则是get请求。
其中第一个和最后一个最为常用。
转发是一个请求,跨多个servlet,但是使用一个request和response域。
这是转发,request.getRequestDispatcher("/TwoServlet").forword(request,reponse);
请求转发是只显示转发至的servlet响应体。
在转发中,留头不留体,比如AServlet转发至BServlet,在A中设置响应头和响应体,在B中设置响应体,那么,A中只会留头(为了证明|A参与)不会留体,只会留B中的体。、
转发地址栏不会发生变化,如果想地址栏发生变化,那么必须使用重定向。如果想在下一个servlet中获得request域中的数据,那么必须使用转发。
服务器默认编码是iso8859-1;而浏览器默认的编码是gbk;但是Tomcat8的默认编码是utf-8;
响应编码:不乱码,只需加上response.setContextType("text/thml";"charset=utf-8");
请求编码:页面是什么编码,那么获得请求参数就是什么编码。在获得请求参数之前,要加上request.setCharacterEncoding("utf-8");然后在用request.getParameter("XXX");
以“/”开头,则是绝对路径,绝对路径要加项目名+。。。
不以“/”开头,则是相对路径
---恢复内容结束---
原文地址:https://www.cnblogs.com/hanmengdi/p/9457202.html