写在前面
整个项目基于servlet 3.0
开发,纯粹用于学习spring mvc
框架原理的。框架设计的使用方式也尽量是参考spring mvc
的,配置全部使用注解做,不要xml。由于作者本人水平有限(第一次写博客),代码若有错误或是遗漏,欢迎指正,再或是有更好的实现,更是跪求指教了。(联系qq1455066227@gmail.com)
本节内容
- 怎么做容器的初始化(
ServletContextListener
) - 明确控制器的分发流程 (
IServlet
)
怎么做容器的初始化
其实对servlet稍微熟悉的同学就知道了,初始化的工作在servlet-api一直都有提供。只要我们实现ServletContextListener
这个接口就OK了。而servlet 3.0后可以支持使用注解来配置WebListener,而不用写入web.xml中。具体代码如下
@WebListener
public class Application implements ServletContextListener
{
@Override
public void contextInitialized(ServletContextEvent servletContextEvent)
{
// todo: 这边servlet容器启动完毕,可以做相关的初始化工作
}
@Override
public void contextDestroyed(ServletContextEvent servletContextEvent)
{
}
}
复制代码
明确控制器的分发流程
我们知道spring mvc中有一个默认的Servlet叫做dispatcherservlet,所有的控制器都是从这个servlet中进去的,所以我们也可以使用一个Servlet,这里我把他取名叫IServlet
,照样使用注解来配置,代码如下:
@WebServlet(urlPatterns = "/")
public class IServlet extends HttpServlet
{
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws IOException
{
// todo: 其实设置urlPatterns = "/"后,除了jsp的静态资源也会被匹配到这个servlet中,需要处理。
req.setCharacterEncoding("UTF-8");
resp.setContentType("text/html; charset=utf-8");
IServletInitiator.allocateRequest(req, resp); // 这里我们对url进行匹配分发到对应的控制器中的路由
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException
{
doPost(req, resp);
}
@Override
protected void doPut(HttpServletRequest req, HttpServletResponse resp) throws IOException
{
doPost(req, resp);
}
@Override
protected void doDelete(HttpServletRequest req, HttpServletResponse resp) throws IOException
{
doPost(req, resp);
}
@Override
protected void doHead(HttpServletRequest req, HttpServletResponse resp) throws IOException
{
doPost(req, resp);
}
@Override
protected void doOptions(HttpServletRequest req, HttpServletResponse resp) throws IOException
{
doPost(req, resp);
}
@Override
protected void doTrace(HttpServletRequest req, HttpServletResponse resp) throws IOException
{
doPost(req, resp);
}
}
复制代码
其实只要这两个东西可行,项目基本上就可以继续了。