7.Servlet
Servlet是个能处理http请求与响应过程的类。
7.1Servelt的基本架构
Servlet接口
-
void init(ServletConfig var1) 当前对象的初始化
-
ServletConfig getServletConfig() 获取到ServletConfig实例对象
-
void service(ServletRequest var1, ServletResponse var2) 提供服务
-
String getServletInfo() 获取到Servlet信息
-
void destory(); 销毁服务
同时还有一个ServletConfig的接口
ServletConfig接口
主要实现配置加载
-
String getServletName() 获取Servlet的名字
-
ServletContext getServletContext() 获取到Servlet的上下文
-
String getInitParameter(String var1) 获取到Servlet配置中的初始化参数
-
Enumeration getInitParameterNames() 获取到Servlet配置中的所有的初始化 参数
GenericServlet类
该类虽然实现了Servlet接口,但是更多的是对 ServletConfig接口进行了实现,而把对应的Http 请求方法Service,扔给了其子类HttpServlet。
HttpServlet类
该类主要就是完成用户的请求和响应。自定义的 Servlet必须继承该类!
常用:
-
doGet(req,resp)
-
doPost(req,resp) 只有提交表单和Ajax发送请求会用到
自定义Servlet类
声明一个类,继承自HttpServlet
自定义Servlet是一个单例设计,同时能够支持多线程并发访问,能提高多线程的访问能力,所以可能会造成线程安全性问题。不能添加同步锁,因为会影响性能,访问速度会降低。应尽量把变量写到方法里,避免线程安全性问题,因为运行时,方法存在栈帧里,是线程独享的。
配置部署Servlet
在web.xml中,配置Servlet的信息
<!-- 步骤1:先配置Servlet的 位置 --> <servlet> <!--定义Servlet的名 字,供将来请求时能够找到该 Servlet--> <servlet-name>TestController</servlet-name> <servlet-class>com.csi.eshop.controller.TestController</servlet-class> <init-param> <param-name>username</param-name> < param-value>zhangsan</param-value> </init-param> <init-param> <param-name>age</param-name> <param-value>20</param-value> </init-param> </servlet> <!-- 步骤2:配置什么样的请求 要找到哪一个对应Servlet --> <servlet-mapping> <servlet-name>TestController</servlet-name> <url-pattern>/TestController</url-pattern> </servlet-mapping>
Servlet运行步骤:
1. 先去URL中找到对应的请求(url-partten) 2. 找到请求所对应的Servlet的名字 (servlet-name) 以上两个部分都是在servlet-mapping中. 3. 根据名字找到Servlet配置节点中的Servlet的名字(servlet-name) 4. 再确定Servlet的class所在位置 (servlet-class)
7.2Servlet生命周期
-
实例化Servlet
首先由客户端发起请求,容器会解析请求的 URL,找到对应Servlet配置中的"url-partten", 紧跟着继续查找对应“servlet-name”,找到了 “servlet-name”就会使用"servlet-class"实现类实例化。
-
调用init方法实现Servlet初始化
当容器执行自定义Servlet时,会自动调用init方 法,实现Servlet的初始化。
-
调用Service方法提供服务
在HttpServlet中的Service方法,会根据用户提交的方式,选择调用doXXX方法,如果我们自己重写了Service方法,而没有调用doXXX具体的方法,可能在请求后,如果同时存在service以及对应doXXX方法时,只会调用service这一个方法。
-
调用destory方法实现销毁
当web容器销毁时,会调用每一个自定义Servlet 中的destory实现对Servlet的销毁功能。
7.3在Servlet中获取request、session、 application内置对象的方式
//获取request,在调用doxx方法和service方法时,会存在两个对应对象,其中一个就是request doXXX(HttpServletRequest request,HttpServletResponse response) service(HttpServletRequest request,HttpServletResponse repsonse) //获取Session HttpSession session =request.getSession() ; //获取Application ServletContext application =request.getServletContext() ;
7.4request的一些其他方法
-
getContextPath() 获取到当前项目的上下文路径
-
getMethod() 获取到请求的方式
-
getHeader(String str) 获取到请求的头信息的内容
7.5response的一些其他方法
-
getWriter() 获取到PrintWriter对象,在内置对象中,代表out对象
PrintWriter out =response.getWriter();
out.println();
-
setContentType(String txt):设置当前页面响应的内容形式。
response.setContentType("application/json;charset=utf-8") ;
response.setContentType("img/jpeg")