您的位置:首页 > 编程语言 > Java开发

idea中原生Servlet3.0开发之---使用配置类和注解的方式整合SpringMVC

2018-11-14 19:23 447 查看

以注解方式来启动SpringMVC前需了解的基础知识:

1、web容器在启动的时候,会扫描每个jar包下的META-INF/services/javax.servlet.ServletContainerInitializer


2、加载这个文件指定的类SpringServletContainerInitializer


3、spring的应用一启动会加载感兴趣的WebApplicationInitializer接口的下的所有组件;

  
4、并且为WebApplicationInitializer组件创建对象(组件不是接口,不是抽象类)
    1)、AbstractContextLoaderInitializer:创建根容器;createRootApplicationContext();
    2)、AbstractDispatcherServletInitializer:
            创建一个web的ioc容器;createServletApplicationContext();
            创建了DispatcherServlet;createDispatcherServlet();
            将创建的DispatcherServlet添加到ServletContext中;
                getServletMappings();
    3)、AbstractAnnotationConfigDispatcherServletInitializer:注解方式配置的DispatcherServlet初始化器
            创建根容器:createRootApplicationContext()
                    getRootConfigClasses();传入一个配置类
            创建web的ioc容器: createServletApplicationContext();
                    获取配置类;getServletConfigClasses();
===========================    
总结:
    以注解方式来启动SpringMVC;继承AbstractAnnotationConfigDispatcherServletInitializer;
实现抽象方法指定DispatcherServlet的配置信息;

===========================
定制SpringMVC;
1)、@EnableWebMvc:开启SpringMVC定制配置功能;相当于web.xml中配置的 <mvc:annotation-driven/>;

2)、配置组件(视图解析器、视图映射、静态资源映射、拦截器。。。)
    extends WebMvcConfigurerAdapter

===========================

springmvc父子容器

各自负责一些扫描的包

父容器:功能类的包,如:Controller,前端控制器,视图解析器

子容器:业务模块的包,如:service,repositories,数据库事物

使用配置类和注解的方式整合SpringMVC的实例步骤:

一、导入servlet和springmvc的jar包

[code]<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.atguigu</groupId>
<artifactId>springmvc-annotation</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>war</packaging>

<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>4.3.11.RELEASE</version>
</dependency>

<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>3.0-alpha-1</version>
<scope>provided</scope>
</dependency>
</dependencies>

<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>2.4</version>
<configuration>
<failOnMissingWebXml>false</failOnMissingWebXml>
</configuration>
</plugin>
</plugins>
</build>
</project>

二、创建MyWebAppInitializer .java相当于web.xml文件

并继承抽象类AbstractAnnotationConfigDispatcherServletInitializer(具体可看博文开始时描述)

此类相当于web.xml;加载spring和springmvc,并设置拦截

[code]package com.atguigu;

import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;

import com.atguigu.config.AppConfig;
import com.atguigu.config.RootConfig;

//web容器启动的时候创建对象;调用方法来初始化容器以前前端控制器
public class MyWebAppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {

//获取根容器的配置类;(Spring的配置文件)   父容器;
@Override
protected Class<?>[] getRootConfigClasses() {
// TODO Auto-generated method stub
return new Class<?>[]{RootConfig.class};
}

//获取web容器的配置类(SpringMVC配置文件)  子容器;
@Override
protected Class<?>[] getServletConfigClasses() {
// TODO Auto-generated method stub
return new Class<?>[]{AppConfig.class};
}

//获取DispatcherServlet的映射信息
//  /:拦截所有请求(包括静态资源(xx.js,xx.png)),但是不包括*.jsp;
//  /*:拦截所有请求;连*.jsp页面都拦截;jsp页面是tomcat的jsp引擎解析的;
@Override
protected String[] getServletMappings() {
// TODO Auto-generated method stub
return new String[]{"/"};
}

}

 三、创建spring的配置文件RootConfig.java,即父容器

[code]package com.atguigu.config;

import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.ComponentScan.Filter;
import org.springframework.context.annotation.FilterType;
import org.springframework.stereotype.Controller;

//Spring的容器不扫描controller;父容器
@ComponentScan(value="com.atguigu",excludeFilters={
@Filter(type=FilterType.ANNOTATION,classes={Controller.class})
})
public class RootConfig {

}

四、创建springmvc的配置文件AppConfig.java,即子容器

[code]package com.atguigu.config;

import java.util.List;

import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.ComponentScan.Filter;
import org.springframework.context.annotation.FilterType;
import org.springframework.stereotype.Controller;

//SpringMVC只扫描Controller;子容器
//useDefaultFilters=false 禁用默认的过滤规则;
@ComponentScan(value="com.atguigu",includeFilters={
@Filter(type=FilterType.ANNOTATION,classes={Controller.class})
},useDefaultFilters=false)
public class AppConfig {

}

五、 框架搭建好后,创建controller和service等业务代码,进行测试

HelloController.java

[code]package com.atguigu.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import com.atguigu.service.HelloService;

@Controller
public class HelloController {

@Autowired
HelloService helloService;

@ResponseBody
@RequestMapping("/hello")
public String hello(){
String hello = helloService.sayHello("tomcat..");
return hello;
}

}

HelloService.java

[code]package com.atguigu.service;

import org.springframework.stereotype.Service;

@Service
public class HelloService {

public String sayHello(String name){

return "Hello "+name;
}

}

 六、运行tomcat测试

说明:controller能访问到,并且能调用service,说明springmvc配置成功

 

阅读更多
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: