黑马程序员javaweb教程:Servlet详解
Servlet详解
1用用再说!
我们先不要去管Servlet是个什么东西,先用用再说!在使用之后,你就会对Servlet有
一个简单的了解。
●使用MyEclipse创建hello项目;
●在src下创建cn.itcast.servlet.OneServlet类;
●让OneServlet实现javax.servlet.Servlet接口,这个接口中一共5个方法,而我们只
需要去实现service()方法;
●打开web.xml文件,部署OneServlet;
●发布hello项目;
●打开浏览器访问http://localhost/hello/myOne。
public class OneServlet implements Servlet {
public void init(ServletConfig config) throws ServletException {} public ServletConfig getServletConfig() {return null;}
public void service(ServletRequest req, ServletResponse res)
throws ServletException, IOException {
res.getWriter().print("Hello JavaWeb!");
}
public String getServletInfo() {return null;}
public void destroy() {}
}
1JavaWeb三大组件
Servlet是JavaWeb三大组件之一,它是我们学习JavaWeb最为基本的组件,也就是说你一定要100%的掌握它。
其它两种:Filter(拦截器)、Listener(观察者模式)
2Servlet的作用
Servlet,即Server Let的意思,用来处理用户请求。当客户端发出请求后,由Tomcat去找到可以处理这一请求的Servlet来处理。
也就是说,用户的请求是由Servlet来处理的!例如用户发出注册请求,那么就应该有处理注册的Servlet来处理;用户发出登录请求,那么就应该有登录Servlet来处理。
也就是说,Servlet是由我们自己来完成的!但Servlet一定要实现javax.servlet.Servlet 接口,并且还要在web.xml文件中部署!不然Tomcat是找不到我们写的Servlet的。
当我们写好了cn.itcast.servlet.MyOneServlet类后,还需要在web.xml文件中添加上面的内容。这就是把MyOneServlet部署到项目中去了!
3JavaWeb请求响应原理
当Tomcat接收到请求(http://localhost:8080/hello/oneServlet)后,Tomcat会找到hello 项目中的web.xml文件,然后通过oneServlet这个请求路径,查找处理这个请求的Servlet
类型。这刚好与
Tomcat通过Servlet类名字去查找Servlet缓存池中是否已经存在了这个Servlet对象,如果存在,那么就不用再去创建,直接获取这个Servlet实例,调用它的service()方法完成请求!
如果这个Servlet不存在,那么Tomcat会通过反射来创建Servlet实例,并把Servlet实例存放到Servlet池中,再去调用Servlet的service方法处理请求。
4Servlet接口
javax.servlet.Servlet接口中方法如下:
●void init(ServletConfig servletConfig):当Tomcat创建Servlet实例后,马上调用init()
方法。这个方法只在创建后调用一次!用来做Servlet初始化工作!一个Servlet实
例只被创建一次,所以init()方法也只被调用一次!(本方法编写对Servlet的初始化
代码)
●void service(ServletRequest request, ServletResponse response):Servlet实例在每次处
理请求时都调用service()方法。
●void destroy():当Tomcat要销毁Servlet实例时,会先调用destroy()方法,再销毁它。
所谓销毁Servlet,其实就是在Servlet缓存池中把Servlet移除!一般只有Tomcat关
闭时,才会销毁Servlet实例!
●ServletConfig getServletConfig():这个方法返回ServletConfig对象,但我们不能自己
去创建ServletConfig对象,所以一般我们会在init()方法中把init()方法的参数保存起
来,然后再在本方法中返回它。ServletConfig对象对应web.xml中当前Servlet实例
的配置信息。
●String getServletInfo():这个方法只是返回一个字符串,用来说明当前Servlet。基本
没用!
5Servlet生命周期
javax.servlet.Servlet接口中,有三个方法说明了Servlet的生命周期:
●void init(ServletConfig):创建后马上调用init()完成初始化;
●void service(ServletRequest,ServletResponse):每次处理请求时调用service()方法;
●void destroy():当Tomcat要销毁Servlet实例时,先调用destroy()方法。
现在你应该已经清楚了,Servlet的实例不由我们创建,Servlet的方法不由我们来调用,这一切都是由Tomcat来完成!!!这就是说由Tomcat来管理Servlet,而我们只需要去编写Servlet实现类,并将其部署到web.xml文件中去!
再次提醒,只有这三个方法是生命周期中的方法。也就是说,生命周期方法会被Tomcat 在不同的时间点来调用!而其它方法就不会被调用了!!!如果你在自己写的Servlet中添加了其他方法,那么Tomcat也是不会去调用它们的!但你可以让生命周期方法去调用你自己写的方法就OK了!
6请求对象和响应对象的基本使用
在Tomcat调用Servlet的service()方法时,需要给service()方法传递参数,这两个参数一个是ServletRequest,另一个是ServletResponse。其实Tomcat传递的是HttpServletRequest 和HttpServletResponse对象。因为我们的请求都是基于HTTP协议的!
HttpServletRequest是ServletRequest的子接口;
HttpServletResponse是HttpServletResponse的子接口。
Tomcat会把所有与请求相关的数据封装到HttpServletRequest对象中。例如请求的是POST还是GET,所有请求头信息,以及请求参数,这些数据都封装到了HttpServletRequest 对象中!!!当我们需要使用这些信息时,可以去调用HttpServletRequest的相关方法来获取。
HttpServletRequest方法:
●String getParameter(String paramName):获取指定请求参数的值;
●String getMethod():获取请求方法,例如GET或POST;
●String getHeader(String name):获取指定请求头的值;
●void setCharacterEncoding(String encoding):设置请求参数编码!只对POST请求中的
参数有效。当调用request.setCharacterEncoding(“utf-8”)之后,再通过getParameter()
方法获取参数值时,那么参数值都已经通过了转码,即转换成了UTF-8编码。所以,这个方法必须在调用getParameter()方法之前调用!
Tomcat会传递给service()方法一个HttpServletResponse对象,这个对象我们称之为响应对象。它可以完成与响应相关的工作。例如向客户端发送响应状态码,向客户端发送响应头信息,向客户端发送响应正文等等!反正只要是与响应相关的方法,你就去HttpServletResponse对象中去查找。
●void setContentType(String contentType):设置响应内部的类型,所谓响应类型,就
是给客户端浏览器用来识别响应内部的类型,如果响应类型是text/html,那么浏览
器就会显示它,如果响应类型为appliction/avi,那么浏览器就会弹出下载对象框。
所以,响应类型是不能写错的。例如:
response.setContent Type(“text/html;charaset=utf-8”),这是告诉构造器,响应内部是
html代码,使用的编码是UTF-8。
●void addHeader(String name, String value):向客户端添加响应头信息;
●void sendError(int code, String errorMsg):向客户端发送状态码,以及错误消息。例
如给客户端发送404:response(404, “您要查找的资源不存在!”)。
●PrintWriter getWriter():获取response的输出流,使用该流可以向客户端响应正文
内容。例如response.getWriter().print(“
Hello JavaWeb!
”);7ServletConfig
ServletConfig对象对应web.xml文件中的
你不能自己去创建ServletConfig对象,Servlet的init()方法的参数就是ServletConfig类型的。Tomcat在调用init()方法时,会传递ServletConfig对象。你可以在init()方法中使用它!
在
c n.itcast.servlet.OneServlet
添加了两个初始化参数,第一个参数的名称为paramName1,第一个参数的值为paramValue1;第二个参数的名称为paramName2,第二个参数值为paramValue2。
在
注意,
称的参数值。getInitParameterNames()方法返回所有参数的名字,返回值类型为Enumeration。