victory的博客

长安一片月,万户捣衣声

0%

SpringMVC | spring和springMVC的整合

spring和springMVC的整合

1、不整合:需要将spring所管理的内容都交给springMVC管理,这样会造成业务逻辑混乱
2、整合:spring的配置文件什么时候加载?怎么加载?
解决办法:监听器,可以在ServletContext加载时,通过监听器加载spring的配置文件,创建spring容器
spring提供的监听器:ContextLoaderListener
3、bean被创建两次的问题:在springMVC中只扫描控制层,在spring中,通过包含或排除对所扫描的包进行指定
4、spring和springMVC的关系
spring是父容器
springMVC是子容器
规定:子容器能够调用父容器的bean,而父容器不能够调用访问子容器中的bean

1.项目目录

2.web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
  <display-name>SpringMVC04</display-name>
  <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>
  
  <filter>
    <filter-name>CharacterEncodingFilter</filter-name>
    <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
    <init-param>
      <param-name>encoding</param-name>
      <param-value>UTF-8</param-value>
    </init-param>
  </filter>
  <filter-mapping>
    <filter-name>CharacterEncodingFilter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>
  
  <servlet>
    <servlet-name>springDispatcherServlet</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
      <param-name>contextConfigLocation</param-name>
      <param-value>classpath:springMVC.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>springDispatcherServlet</servlet-name>
    <url-pattern>/</url-pattern>
  </servlet-mapping>
  
  <!-- 使用自定义监听器模拟spring、springMVC整合 -->
  <!-- <listener>
    <listener-class>com.atguigu.listener.SpringListener</listener-class>
  </listener> -->
  
  <!-- 使用spring提供的监听器模整合spring、springMVC -->
  <!-- needed for ContextLoaderListener -->
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:spring.xml</param-value>
    </context-param>

    <!-- Bootstraps the root web application context before servlet initialization -->
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>
</web-app>

3.spring.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd">

    <!-- <bean id="user" class="com.atguigu.bean.User"></bean> -->
    
    <context:component-scan base-package="com.atguigu">
        <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
    </context:component-scan>
    
    <bean id="teacher" class="com.atguigu.bean.Teacher"></bean>
</beans>

4.springMVC.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:mvc="http://www.springframework.org/schema/mvc"
    xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd
        http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd">
    
    <context:component-scan base-package="com.atguigu.controller"></context:component-scan>
    
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/view/"></property>
        <property name="suffix" value=".jsp"></property>
    </bean>
    
    <mvc:default-servlet-handler/>
    <mvc:annotation-driven />
    
    <!-- 
        处理文件,将客户端上传的File文件处理为MultipartFile
        注意:文件解析器bean中的id必须设置为multipartResolver 
    -->
    <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
        <!-- 设置文件解析的编码,注意一定要和页面的pageEncoding保持一致 -->
        <property name="defaultEncoding" value="UTF-8"></property>
        <!-- 设置最大上传文件大小 -->
        <property name="maxUploadSize" value="88888888"></property>
    </bean>
    
    <!-- 异常处理 -->
    <bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
        <property name="exceptionMappings">
            <props>
                <prop key="java.lang.NullPointerException">error</prop>
            </props>
        </property>
    </bean>
    
    <!-- <mvc:interceptors>
        默认拦截所有请求
        第一种方式
        <bean class="com.atguigu.interceptor.FirstInterceptor"></bean>
        <bean class="com.atguigu.interceptor.SecondInterceptor"></bean>
        
            第二种方式
            此方式要求拦截器上必须加注解@Component
        
        <ref bean="firstInterceptor" />
        
        设置自定义拦截方式
        <mvc:interceptor>
            <bean></bean>
            <mvc:mapping path=""/>
            <mvc:exclude-mapping path=""/>
        </mvc:interceptor>
    </mvc:interceptors> -->
</beans>

5.index.jsp

<a href="testListener">测试监听器</a>

6.User.java

package com.atguigu.bean;

import org.springframework.stereotype.Component;

@Component
public class User {
    private Integer id;
    private String username;
    public Integer getId() {
        return id;
    }
    public void setId(Integer id) {
        this.id = id;
    }
    public String getUsername() {
        return username;
    }
    public void setUsername(String username) {
        this.username = username;
    }
    public User() {
        System.out.println("User==>构造方法");
    }
}

7.Teacher.java

package com.atguigu.bean;

public class Teacher {
    private Integer id;
    
    private String name;

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Teacher() {
        System.out.println("Teacher==>构造方法");
    }

    @Override
    public String toString() {
        return "Teacher [id=" + id + ", name=" + name + "]";
    }
}

8.SpringListener.java(自定义监听器)

package com.atguigu.listener;

import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

/**
 * Application Lifecycle Listener implementation class SpringListener
 *
 */
public class SpringListener implements ServletContextListener {

    /**
     * Default constructor. 
     */
    public SpringListener() {
        // TODO Auto-generated constructor stub
    }

    /**
     * @see ServletContextListener#contextDestroyed(ServletContextEvent)
     */
    public void contextDestroyed(ServletContextEvent arg0)  { 
         // TODO Auto-generated method stub
    }

    /**
     * @see ServletContextListener#contextInitialized(ServletContextEvent)
     */
    public void contextInitialized(ServletContextEvent sce)  { 
        ApplicationContext ac = new ClassPathXmlApplicationContext("spring.xml");
        ServletContext servletContext = sce.getServletContext();
        servletContext.setAttribute("ac", ac);
    }
}

9.TestController.java

package com.atguigu.controller;

import javax.servlet.ServletContext;
import javax.servlet.http.HttpSession;

import org.springframework.context.ApplicationContext;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

import com.atguigu.bean.Teacher;

@Controller
public class TestController {
    @RequestMapping("/testListener")
    public void testListener(HttpSession session){
        //获取spring所管理的teacher对象
        ServletContext servletContext = session.getServletContext();
        ApplicationContext ac = (ApplicationContext)servletContext.getAttribute("ac");
        Teacher teacher = ac.getBean("teacher", Teacher.class);
        System.out.println(teacher);
    }
}