了解servlet基础有助于我们了解web服务,其实如果你servlet基础好的话,你可以不用springmvc这种第三方框架,自己包装一个简单servlet框架,接下我们来说下工作中常用的servlet基础
1、ServletConfig
这个类主要是获取servlet配置文件信息,比如获取初始化参数,和servletContent,举个列子
假如我web.xml配置了一个servlet
<servlet> <servlet-name>Gservlet</servlet-name> <servlet-class>servlet.Gservlet</servlet-class> <init-param> <param-name>name</param-name> <param-value>test</param-value> </init-param> </servlet> <servlet-mapping> <servlet-name>Gservlet</servlet-name> <url-pattern>/Gservlet</url-pattern> </servlet-mapping>
public class Gservlet extends HttpServlet{ private String param; public void setParam(String param) { this.param = param; } public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException { ServletConfig config = this.getServletConfig(); //断点打在这里获取初始化参数及其他信息 } }
1、ServletContent
servlet上下文,它保护整个web服务的上下信息,这个接口功能很强大,可以动态创建servlet,filter,listent
并且注册他们,还提供获取上下文的初始化参数信息,和上下web的工程的信息
比如动态注册一个servlet应用
ServletRegistration.Dynamic dynamic = servletContext.addServlet("dservlet",DServlet.class); dynamic.addMapping("/Dservlet");
获取web应用的初始化参数
web.xml
<context-param> <param-name>encode</param-name> <param-value>utf-8</param-value> </context-param>
servletContext.getInitParameterNames()
用的最多应该还是
servletContext.getContextPath() //获取web工程名,取决你web包的名称
servletContext.getRealPath("/xx") //获取文件在相对web工程目录的相对位置
3、ServletRegistration
这个类是提供动态注册的类,spring boot 就是通过动态注册servlet到容器
举个注册的列子
try { //比如注册RgisterServlet类 RgisterServlet rgisterServlet = servletContext.createServlet(RgisterServlet.class); rgisterServlet.setName("register"); ServletRegistration.Dynamic dynamic = servletContext.addServlet("register",rgisterServlet); dynamic.addMapping("/registerServlet"); } catch (ServletException e) { e.printStackTrace(); }
4、ServletContainerInitializer
这个类提启动注册相关的servlet功能,这个提供了
void onStartup(Set<Class<?>> var1, ServletContext var2) throws ServletException; //来注册servlet服务
比如我们用spring开发web程序时,会用到一个spring web包(注意,一定要这种目录)
接下来看看里面的内容
里面提供了一个SpringServletContainerInitializer类,这个类把ServletContext带入到这个,然后通过相关功能,把@controller 类动态(ServletRegistration)注入到servlet容器中,所有如果我们需要动态注册相关的servlet到容器中,只要和上面一样在META-INF/services/java.servlet.ServletContainerInitializer中写入我们的实现类就行(只要继承 ServletContainerInitializer)