一、Servlet配置和映射的要点
二、ServletConfig接口
1、ServletConfig接口的作用
2、重写Servlet中几个方法时需要注意的几点
一、Servlet配置和映射的要点
(1)/代表当前Web应用程序的根目录,而不是整个Web站点的根目录。(因为web.xml中只能配置当前web应用程序中的Servlet所以这里的/代表当前Web应用程序的根目录也是合情合理的,如果代表整个Web站点的根目录不仅不会起到什么用处,还有可能由于不小心写错当前应用程序名称而导致配置错误)
(2)Servlet映射到的URL中也可以使用*通配符,但是只能有两种固定的格式:
一种是 *.扩展名 在*前面不能有目录分隔符"/",例如,*.do 表示匹配以 .do 结尾的所有URL;
另一种是以正斜杠/开头并以/* 结尾,例如, /* 表示配置当前Web应用程序下的所有URL, /action/* 表示匹配当前Web应用程序下的 /action 子路径下的所有URL
总结:
1、* 可以与任何字符匹配,即可以代表目录分割符/,也可以代表路径名action和文件名a.html或a
所以可以认为*本身代表着所有,所以*只能使用在URL最后一级的匹配路径中,因为如果将*放到前面的话,*后面配置的具体路径将没有任何意义。不过如果将*放置到不是最后一级匹配路径的时候*就不代表通配符了而是代表*字符本身的含义了
2、如果URL以/开头的话,*就代表了所有不以/开头的子目录,例如:/yyy/* 中*可以代表 action或action/test 或 action/test/a.html或 action/test/abc/a.do 等;
3、如果URL以*开头的话,*就代表了所有已/开头的扩展名符合配置的所有路径,例如,*.do 中的* 可以代表
/abc/dd.do 或 /ddd.do 或 /action/test/aaa/bbb/ccc.do 中.do之前的所有内容
二、ServletConfig接口
1、ServletConfig接口的作用
(1)ServletConfig接口可以用于直接获取在web.xml中配置的Servlet相关信息,例如:参数名、参数值、Servlet名称等
(2)ServletConfig接口可以获取到ServletContext接口的引用,该引用可以获取ServletContext相关的信息,例如:上下文参数名、上下文参数值、上下文名称、访问WEB-INF下的资源、获取WEB-INF的上级的绝对路径以及对"application"范围内的属性进行操作。
(3)由于一个Web应用程序中的所有Servlet都共享同一个ServletContext对象,所以ServletContext对象被称之为application对象(Web应用程序对象)
2、重写Servlet中几个方法时需要注意的几点
(1)service方法
每当针对某个Servlet的访问请求到达时,Servlet引擎就会调用该Servlet实例对象的service方法来进行响应。HttpServlet中实现的service会根据不同的请求方式进行转发到对应方法处理。HttpServlet类为每一种HTTP 请求方式都定义了一个对应的doXxx方法,例如:与Get请求方式对应的是doGet方法,与Post请求方式对应的是doPost方法。 如果我们重写了service方法,且没有通过super.service()来调用父类方法的话,不管以什么方式访问该Servlet 都无法被转发到doGet或doPost等方法的
(2)doGet和doPost等方法
一般我们都会重写doGet和doPost这两个方法的,不过由于HttpServlet中的doGet和doPost等方法的实现有, resp.sendError(HttpServletResponse.SC_METHOD_NOT_ALLOWED, msg);一旦调用了该方法就会向resp对象中放在错误提示信息,Servlet将不会继续向web界面输入内容,所以当重写doGet和doPost等方法的时候不能通过super.doXxx的方式来调用父类的同名方法,否者就会报 HTTP method GET is not supported by this URL 错误
(3)init
init方法会在第一次执行Servlet之前进行调用初始化Servlet的一些信息。init方法是在GenericServlet类中定义的,并且定义了两个init方法,init()和init(ServletConfig config)两个方法,其中init(ServletConfig config)方法中进行了对init()方法的调用;GenericServlet提供这个无参数的init()方法就是提供我们开发人员进行初始化Servlet进行重写的。因为如果没有这个无参数的init()方法的话,我们就只能对有参数的ini(ServletConfig config)进行重写,可是在重写的时候只有通过super.init(ServletConfig config)调用父类的同名同参的方法才能达到GenericServlet类预期的效果,因为GenericServlet类在init(ServletConfig config) 将参数config保存为自己类的一个私有成员变量,并且实现的ServletConfig接口的其他方法会访问该私有变量,如果没有通过super.init(ServletConfig config)调用父类的同名同参方法的话将,将私有参数将为null,例如:
getServletContext()将会包空指针异常错误。可是GenericServlet却不能确保所有的开发人员都不会忘记通过super.init(ServletConfig config)来调用父 类的同名同参方法,所以就添加了一个无参数的init()方法让开发人
员来进行自己的初始化工作而不会对GenericServlet的其它方法有任何影响。