Spring和Servlet结合

Posted 萌新Newcxp

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring和Servlet结合相关的知识,希望对你有一定的参考价值。

Spring和Servlet结合

不使用注解直接从Spring容器中获取对应的实现类(Spring工具类:WebApplicationContextUtils - 罗锐原 - 博客园 (cnblogs.com)

Spring工具类:WebApplicationContextUtils

WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE 为键存放在ServletContext的属性列表中。您当然可以直接通过以下语句获取 WebApplicationContext:

WebApplicationContext wac =(WebApplicationContext)servletContext.getAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE);

但通过位于 org.springframework.web.context.support 包中的WebApplicationContextUtils 工具类获取 WebApplicationContext 更方便:

ApplicationContext ac1 =WebApplicationContextUtils.getRequiredWebApplicationContext(ServletContext sc);
ApplicationContext ac2 =WebApplicationContextUtils.getWebApplicationContext(ServletContext sc);
ac1.getBean("beanId");
ac2.getBean("beanId");

说明:
这种方式适合于采用Spring框架的B/S系统,通过ServletContext对象获取ApplicationContext对象,然后在通过它获取需要的类实例。

上面两个工具方式的区别是,前者在获取失败时抛出异常,后者返回null。

servletContext sc 换成

1.servlet.getServletContext()

2.this.getServletContext()

3.request.getSession().getServletContext();

实例、

public class demoServlet extends HttpServlet {
 IDemoWS demoWS;
 public void init() throws ServletException {         
        super.init();
        ServletContext servletContext = this.getServletContext(); 
        WebApplicationContext ctx =WebApplicationContextUtils.getWebApplicationContext(servletContext);
        demoWS = (ISignpicWS)ctx.getBean("demoWS");
    }  
 protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  .....//request.getSession().getServletContext()
 }
}

自己初始化Controller类

public class delController extends HttpServlet {
    TestService testService;
    @Override
    public void init() throws ServletException {
        super.init();
         testService = (TestService) WebApplicationContextUtils.getWebApplicationContext(this.getServletContext()).getBean("testServiceImpl");
    }
}

Spring和Tomcat关系

Tomcat和jettey是HTTP服务器和Servlet容器,负责给类似Spring这种servlet提供一个运行的环境,其中:Http服务器与Servlet容器的功能界限是:可以把HTTP服务器想象成前台的接待,负责网络通信和解析请求,Servlet容器是业务部门,负责处理业务请求。

Tomcat和Servlet作为Web服务器和Servlet容器的结合,可以接受网络http请求解析为Servlet规范的请求对象和响应对象。比如,HttpServletRequest对象是Tomcat提供的,Servlet是规范,Tomcat是实现规范的Servlet容器,SpringMVC是处理Servlet请求的应用,其中DispatcherServlet实现了Servlet接口,Tomcat负责加载和调用DispatcherServlet。同时,DispatcherServlet有自己的容器(SpringMVC)容器,这个容器负责管理SpringMVC相关的bean,比如Controler和ViewResolver等。同时,Spring中还有其他的Bean比如Service和DAO等,这些由全局的Spring IOC容器管理,因此,Spring有两个IOC容器。

如果只是使用spring(不包含springmvc),那么是tomcat容器解析xml文件,通过反射实例化对应的类,根据这些servlet规范实现类,触发对应的代码处理逻辑,这个时候tomcat负责http报文的解析和servlet调度的工作。

如果使用spring mvc,那么tomcat只是解析http报文,然后将其转发给dispatchsetvlet,然后由springmvc根据其配置,实例对应的类,执行对应的逻辑,然后返回结果给dispatchservlet,最后由它转发给tomcat,由tomcat负责构建http报文数据。


以上是关于Spring和Servlet结合的主要内容,如果未能解决你的问题,请参考以下文章

如何将简单的 Servlet 与 JDBC 结合起来?代码导致 ClassNotFoundException

mybatis学习笔记二mybatis结合spring mvc实现(用户登录,数据查询)

Servlet和Spring的面试总结

Servlet和Spring的面试总结

Servlet和Spring的面试总结

Servlet1 Mac 下 Tomcat和IntelliJ IDEA结合使用