Servlet笔记之(一)
1:什么是Servlet?
Servlet是用java编写的服务器端程序,Servlet必须交个服务器才能运行。侠义的Servlet是指Java语言实现的一个接口,广义的Servlet是指额任何实现了Servlet接口的类。
Servlet能相应任何类型的请求,但大多数情况下Servlet只用来扩展HTTP协议的web服务器。
2:什么是Servlet容器?
负责处理客户请求、把请求传送给Servlet并把结果返回给客户。不同程序的容器实际实现可能有所变化,但容器与Servlet之间的接口是由Servlet API定义好的,这个接口定义了Servlet容器在Servlet上要调用的方法及传递给Servlet的对象。
Tomcat是使用比较多多的一个Servlet容器,它本身也内含了一个HTTP服务器,它也可以被视作一个单独的web服务器。但是,不能将Tomcat和Apache Web服务器混淆,Apache Web Server是一个用C语言实现的HTTP web server;这两个HTTP web server不是捆绑在一起的。同时使用就会存在跨域的问题,Apache Tomcat包含了一个配置管理工具,也可以通过编辑XML格式的配置文件来进行配置把Tomcat中的项目映射到Apache中,让Apache来进行统一的管理。
3:Servlet的基本配置信息?
<!-- 注册一个Servelt --> <servlet> <servlet-name>ServletTest</servlet-name><!--给servlet起一个别名--> <servlet-class>com.cpt.servlet.ServletTest</servlet-class><!--servlet的完整路径--> <!-- 配置初始化值 --> <init-param> <param-name>age</param-name> <param-value>22</param-value> </init-param> <!-- 配置服务器初始化顺序 值可以是0- 6 值越小越优先初始化--> <load-on-startup>1</load-on-startup> </servlet> <!-- 映射一个已知的servlet --> <servlet-mapping> <servlet-name>ServletTest</servlet-name><!--已知的servlet别名--> <url-pattern>/servletTest</url-pattern><!--确定浏览器访问的路径,可以使用/*, *. 等--> </servlet-mapping>
4:ServletConfig分析
在Servlet初始化是配置的初始化值。Implementing Classes:GenericServlet
<!-- 配置初始化值 –>
<init-param> <param-name>age</param-name>
<param-value>22</param-value> </init-param>
java.lang.String getInitParameter(java.lang.String name)--------------通过name值来获取value的值
java.util.Enumeration getInitParameterNames()-------------------------获取所有的name的值,并不是获取所有name对应的value的值,得到的是一个string 的枚举
ServletContext getServletContext()------------------------------------获取Servlet上下文(返回当前ServletContext的引用)
java.lang.String getServletName()-------------------------------------获取当前servlet的名字
5:Servlet生命周期
init(ServletConfig config)---------服务器初始化执行,并且只执行一次
service(ServletRequest req, ServletResponse res) ---当前servlet执行请求、相应要执行的方法
|
接口 |
实现类 |
关系 |
结果 |
| ServletRequest javax.servlet.ServletRequestorg |
org.apache.catalina.connector.RequestFacade | public class RequestFacade implements HttpServletRequest {} public interface HttpServletRequest extends ServletRequest {} |
RequestFacade --> HttpServletRequest --> ServletRequest |
| ServletResponse javax.servlet.ServletResponse |
org.apache.catalina.connector.ResponseFacade |
public class ResponseFacade implements HttpServletResponse {} |
ResponseFacade ->HttpServletResponse --> ServletResponse |
总结:ServletRequest,ServletResponse是sun提供的标准接口,提供给其它服务器来扩展HttpServletRequest,HtttpServletResponse是现实了超文本转移协议,通常情况下我们都把
ServeltRequest,ServletResponse转成HttpServletRequest,HtttpServletResponse来使用。获取里面更多的方法。
destroy() -------当前服务器不再使用Servlet实例调用此方法进行销毁
6:GenericServlet分析
public abstract class GenericServlet implements Servlet, ServletConfig, java.io.Serializable{}
- public void init(ServletConfig config) throws ServletException {
this.config = config;
this.init();
}
该初始化就缓存了ServletConfig一系列的初始化值,这里为什么有两个init(),带参数的init(ServletConfig config) 是servlet初始化执行,init()是提供给实现类现实初始化覆盖,如果实现类覆盖了带参数的init而又没有缓存ServeltConfig就会导致程序出错!
public String getInitParameter(String name) { ServletConfig sc = getServletConfig();//会导致这里获取出错 if (sc == null) { throw new IllegalStateException( lStrings.getString("err.servlet_config_not_initialized")); } return sc.getInitParameter(name); } public Enumeration<String> getInitParameterNames() { ServletConfig sc = getServletConfig(); if (sc == null) { throw new IllegalStateException( lStrings.getString("err.servlet_config_not_initialized")); } return sc.getInitParameterNames(); }
7:HttpServlet分析
我们最终写的Servlet是交给服务器管理执行的,最后是通过浏览器的方式来访问所以引出了HttpServlet,通常我们写的Servlet都是继承这个类
public class ServletTest extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { System.out.println("表单通过GET方法请求执行doGet方法"); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { System.out.println("表单通过post方法请求执行doPost方法"); } }


浙公网安备 33010602011771号