上次说道tomcat就是一个成品web服务器,他的底层应该是用socket接口实现了连接,然后绑定网址\监听,然后又读取数据.
然后又把数据包装成request对象以及response对象
这让tomcat看上去更像一台机器,里面装什么具体内容由开发者来决定.也像一个饭店,卖什么风格的菜由开饭店的人来决定.
具体什么菜,其实就是你开发什么样的servlet.
作为一个web应用来说,有很多sevlet\jsp等等的材料,其中servlet是核心的服务内容体现.
当一个开发者开发了很多servlet,要安装到tomcat中,首先需要编译成class文件,然后把这些文件放到webapps文件夹.这样启动tomcat的时候,这些servlet才会投入使用.
这有点像c语言中程序的运行.很多时候运行的程序不仅仅包括你刚写的代码,也包括系统中已经有二进制格式的程序,例如printf函数,c语言中把这个叫做链接.应该说所有程序应该都叫链接,有这么一步.
所以把servlet的class文件放在webapps,就好像c语言中的链接一样.
在c语言中是有个命令叫做link ,那么在tomcat中,servlet代码与tomcat容器的"link"接口,就是告诉tomcat,这里有servlet,方式是两种,一个是在web.xml文件中写上servlet标签(servlet class ,mapping),或者用注解方式,在servlet的类上面加上@Webservlet.
每个servlet都有个ServletConfig对象,在这个对象里面可以配置一些要求tomcat对servlet采取一些预先的配置措施,例如启动顺序,loadonstartup,initpm等等.
//获取ServletConfig
ServletConfig servletConfig = this.getServletConfig();
String value1 = servletConfig.getInitParameter("key1");
String value2 = servletConfig.getInitParameter("key2");
System.out.println(value1);
System.out.println(value2);
除了servletconfig对象,还有对每个web应用(所有servlet\jsp,listener等等)都有个ServetContext,这是一个全局唯一的配置.可以对所有servlet作一些统一的配置.
@WebServlet("/attr.do")
public class ServletContextAttrServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
ServletContext servletContext = this.getServletContext();
servletContext.setAttribute("key","BJ");
servletContext.setAttribute("key","IT");
servletContext.removeAttribute("key");
}
}
filter,过滤器,在请求到达servlet之前可以预先作一些处理和筛选(例如判断是否登陆),设置一些请求的中文编码格式的等等.filter像servlet一样可以在web.xml中作配置,或者用@WebFilter方式。
@WebFilter("/*")
public class AnnotationFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
System.out.println(" Annotation Filter....");
filterChain.doFilter(servletRequest, servletResponse);
}
@Override
public void destroy() {
}
}
Listener对象,可以实现对ServletContext, HttpRequest, 还有HttpSession三个对象的监听。这三个对象的产生、修改、销毁等变化,都可以根据需要获取有关信息。
public class HttpServletRequestLifecycleListener implements ServletRequestListener {
@Override
public void requestDestroyed(ServletRequestEvent sre) {
System.out.println("----------Start requestDestroyed------------");
System.out.println((HttpServletRequest)sre.getServletRequest());
System.out.println("----------End requestDestroyed------------");
}
@Override
public void requestInitialized(ServletRequestEvent sre) {
System.out.println("----------Start Initialized------------");
System.out.println((HttpServletRequest)sre.getServletRequest());
System.out.println("----------End Initialized------------");
}
}