*一个请求服务器创建一个servlet处理请求会很消耗资源:
想办法是多个请求到达同一个servlet让该servlet做请求转发.
<servlet-name>action</servlet-name>
<servlet-class>ActionServlet</servlet-class>
通过通配符的方式使多个请求到达同一个url-pattern减少配置量.
web.xml中url-pattern的统配符匹配方式:
1>精确匹配:
<url-pattern>/addEmp</url-pattern>
2>前缀匹配:(使用最多分模块)
<url-pattern>/user/*</url-pattern>
<url-pattern>/flight/*</url-pattern>
可以被拦截:
http://localhost:8080/web04/user/login
http://localhost:8080/web04/user/user/login
不可被拦截:
http://localhost:8080/web04/admin/user/login
3>后缀匹配:
前面不能有 /
<url-pattern>*.do</url-pattern>
<url-pattern>*.php</url-pattern
<url-pattern>*.htm</url-pattern>
http://localhost:8080/web04/user/login不可匹配
http://localhost:8080/web04/user/user/login.do可以匹配
问题:
<url-pattern>*.html</url-pattern>和静态页面谁会被返回
浏览器发送一个请求首先tomcat拦截,然后去web.xml中匹配,看下有没有url-pattern的配置
若找不到就去部署目录中找静态文件,若找不到404异常.
http://localhost:8080/web04/day09.zip 浏览器若无法解析则弹出下载框下载.
4>完全模糊匹配:
<url-pattern>/*</url-pattern>(过滤器使用)
在servlet中想办法根据不同的url,手动做请求分发.
request.getRequestURI();String
request.getRequestURL();StringBuffer
servlet生命周期(一般不是自己创建的东西有生命周期)
生命周期指:对象的创建到消亡的过程
4个阶段:
1>对象创建:
谁创建了Servlet对象? 什么时候创建的.
tomcat(web容器)创建,
默认情况下载第一次请求到来的时候创建,若请求再次到达该servlet Tomcat不会创建servlet对象会直接使用创建过的,所以servlet对象在web容器中是单例的.(减少资源创建节省资源...)
非单:
main{
new Context()....
}
class Context
{
}
单例:
main{
new Context()....
}
class Context
{
private static Context context;
private Context(){}
public static Context getContext(){
if(context==null){
context=new Context();
}
return context;
}
}
}
若servlet对象是单例的,则在大数据并发访问对象的临界资源时,容易出现线程安全问题1, synchronized servlet/ system.out.println()加锁了不适合服务器端应用,适合客户端
2,尽量不要在servlet中编写需要修改的临界资源.(成员变量)...
我们可以修改web.xml来告诉tomcat当web容器启动的时候立即创建servlet对象.
<load-on-startup>1</load-on-startup>
num:代表servlet对象创建的优先级
2>初始化:
init(ServletConfig config){}
servlet生命周期相关的API:(类与接口)
Servlet(I)
Init(ServletConfig config)
Servic(ServletRequest,ServletResponse);
destory()
ServletConfig(I)
ServletRequest(I)
ServletResponse(I)
Servlet子类GenericServlet(AC)implements Servlet
init(){}
destroy(){}
service()(抽象)
HttpServlet(AC)extends GenericServlet
service(HttpServletRequest req,HttpServletResponse resp){}
ActionServlet extends HttpServlet(我们自己的)
HttpServletRequest(I)
HttpServletResponse(I)
初始化阶段问题:
谁调用初始化方法init()? 什么时候调用?
tomcat容器调用init方法.
在servlet创建后,执行init()立即执行init()进行对象初始化,仅仅执行1次.
init方法中一般编写什么代码?
对成员变量进行初始化.
在对象创建完毕后仅仅执行一次义务.
init(ServletConfig config)
{
super.init(config);//不能省父类有事要做.
}
ServletConfig接口作用:
config对象中包含了用户在web.xml中对当前servlet的一些初始化参数的配置信息.
如何在web.xml中配置初始化参数?
<init-param>
<param-name>words</param-name>
<param-value>dog</param-value>
</init-param>
如何使用config对象读取初始化参数?
config.getInitParameter("words");
模板设计模式:
GenericServlet()
{
init(ServletConfig config)
{
.........................
init();
init2...();(钩子方法子类不想执行带参的时可以执行不带参的...重写不带参的时候任然可以执行该方法.)
}
init(){};
}
ActionServlet{
init(ServletConfig config){
super.init(config)
}
}
3>业务调用:
谁调用的?什么时候调用?
web容器调用.
请求到达servlet对象时调用一次.service方法可以调用多次.
405异常
如果service方法写错,tomcat会调用httpServlet的service的方法.
HttpServlet{
service(req,resp)
{
if(get){
doget(req,resp)
}else if(post){
doPost(req,resp);
}
}
doGet(){
throw new 405异常.
}
doPost(){
throw new 405异常.
}
4>对象的销毁:destory(){}
谁调用?什么时候调用?
web容器调用.
看tomcat心情.(tomcat内部有一个动态监测不常用的servlet对象会把servlet销毁.)
应用被移除.或服务器被关闭.
servlet对象销毁之前执行一次该生命周期方法.(一生只死一次...)