Spring-纯Java创建一个SSM【webapp】
阅读原文时间:2023年07月08日阅读:3

纯Java搭建webapp

QuickStart

使用纯 Java 来搭建一个 SSM 环境,即在项目中,不存在任何 XML 配置,包括 web.xml

引入依赖

<!--    TODO 【Java创建SSM】1、引入依赖    -->
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-webmvc</artifactId>
    <version>5.1.6.RELEASE</version>
</dependency>
<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>javax.servlet-api</artifactId>
    <version>4.0.1</version>
    <scope>provided</scope>
</dependency>

controller

/**
 * @Author Coder_Pans
 * @Date 2022/11/23 21:48
 * @PackageName:PACKAGE_NAME
 * @ClassName: org.panstack.controller.HelloController
 * @Description: TODO 【Java创建SSM】2、HelloController 用于测试
 * @Version 1.0
 */
@Controller
public class HelloController {
    // 注入Service
    @Autowired
    HelloService helloService;

    @GetMapping("/hello")
    @ResponseBody
    public String hello(){
        return helloService.hello();
    }
}

Service

/**
 * @Author Coder_Pans
 * @Date 2022/11/23 22:14
 * @PackageName:org.panstack.service
 * @ClassName: HelloService
 * @Description: TODO 【Java创建SSM】6、验证Service是否能被过滤
 * @Version 1.0
 */
@Service
public class HelloService {

    public String hello(){
        return "hello java -> Ssm";
    }
}

User实体类

/**
 * @Author Coder_Pans
 * @Date 2022/11/23 22:52
 * @PackageName:org.panstack.pojo
 * @ClassName: User
 * @Description: TODO 用户实体类,用于测试json
 * @Version 1.0
 */
public class User {
    private String name;
    // TODO Json修改时间格式
    // @JsonFormat(pattern = "yyyy-MM-dd hh:mm")
    private Date birthDay;

    public String getName() {
        return name;
    }

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

    public Date getBirthDay() {
        return birthDay;
    }

    public void setBirthDay(Date birthDay) {
        this.birthDay = birthDay;
    }

    public User(String name, Date birthDay) {
        this.name = name;
        this.birthDay = birthDay;
    }

    public User() {
    }

}

工程创建成功之后,首先添加 Spring 的配置文件:

/**
 * @Author Coder_Pans
 * @Date 2022/11/23 21:53
 * @PackageName:org.panstack.config
 * @ClassName: SpringConfig
 * @Description: TODO 【Java创建SSM】3、添加Spring配置类
 * 这个配置类文件相当于applicationContext.xml
 * @Version 1.0
 */
@ComponentScan(
        basePackages = "org.panstack",
        useDefaultFilters = true,
        excludeFilters = {
                @ComponentScan.Filter(type = FilterType.ANNOTATION, classes = Controller.class)})
@Configuration
public class SpringConfig {
}
  • @Configuration :注解表示这是一个配置类,在我们这里,这个配置的作用类似于 applicationContext.xml
  • @ComponentScan: 注解表示配置包扫描,里边的属性和 xml 配置中的属性都是一一对应的,useDefaultFilters 表示使用默认的过滤器,然后又除去 Controller 注解,即在 Spring 容器中扫描除了 Controller 之外的其他所有 Bean

创建 springmvc 的配置文件:

/**
 * @Author Coder_Pans
 * @Date 2022/11/23 21:58
 * @PackageName:org.panstack.config
 * @ClassName: SpringMVCConfig
 * @Description: TODO 【Java创建SSM】4、添加SpringMVC配置
 * 这个配置类相当于spring-servlet.xml
 * @Version 1.0
 */
@ComponentScan(basePackages = "org.panstack",
        useDefaultFilters = false,
        includeFilters = {
                @ComponentScan.Filter(type = FilterType.ANNOTATION, classes = Controller.class),
                //TODO 【Java创建SSM】 6、将SpringConfig对Spring的配置加入WebInit一起启动
                @ComponentScan.Filter(type = FilterType.ANNOTATION, classes = Configuration.class)})
@Configuration
public class SpringMVCConfig extends WebMvcConfigurationSupport {
    /**
     * TODO 【Java创建SSM】7、解决静态资源过滤
     * @param registry
     */
    @Override
    protected void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/**").addResourceLocations("classpath:/");
    }

    /**
     * TODO【Java创建SSM】9、配置解析jsp
     * @param registry
     */
    @Override
    protected void configureViewResolvers(ViewResolverRegistry registry) {

        registry.jsp().prefix("/jsp/").suffix(".jsp");
    }

    /**
     * TODO【Java创建SSM】10、配置路径映射
     * @param registry
     */
    @Override
    protected void addViewControllers(ViewControllerRegistry registry) {
        registry.addViewController("/hello3").setViewName("hello");
    }
    /**
     * TODO 配置消息转换,解决时间格式
     */
    @Override
    protected void configureMessageConverters(List<HttpMessageConverter<?>> converters) {

        ObjectMapper om = new ObjectMapper();
        // 设置自己的格式
        om.setDateFormat(new SimpleDateFormat("yyyy-MM-dd"));// TODO 全局修改时间格式
        MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter(om);
        converters.add(converter);
    }
}

使用 Java 代码去代替 web.xml 文件,这里会用到 WebApplicationInitializer

/**
 * @Author Coder_Pans
 * @Date 2022/11/23 22:04
 * @PackageName:org.panstack.config
 * @ClassName: WebInit
 * @Description: TODO 【Java创建SSM】5、配置原来的web.xml
 * 这个配置类相当于web.xml
 * @Version 1.0
 */

public class WebInit implements WebApplicationInitializer {

    public void onStartup(ServletContext servletContext) throws ServletException {
        AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext();
        ctx.register(SpringMVCConfig.class);// 注册mvc配置类
        ServletRegistration.Dynamic springmvc = servletContext.addServlet("springmvc", new DispatcherServlet(ctx));// 传入上下文ctx
        springmvc.addMapping("/");
        springmvc.setLoadOnStartup(1);// 添加一个启动时机

    }
}

WebInit 的作用类似于 web.xml,这个类需要实现 WebApplicationInitializer 接口,并实现接口中的方法,当项目启动时,onStartup 方法会被自动执行,我们可以在这个方法中做一些项目初始化操作,例如加载 SpringMVC 容器,添加过滤器,添加 Listener、添加 Servlet 等。

注意:

由于我们在 WebInit 中只是添加了 SpringMVC 的配置,这样项目在启动时只会去加载 SpringMVC 容器,而不会去加载 Spring 容器,如果一定要加载 Spring 容器,需要我们修改 SpringMVC 的配置,在 SpringMVC 配置的包扫描中也去扫描 @Configuration 注解,进而加载 Spring 容器,还有一种方案可以解决这个问题,就是直接在项目中舍弃 Spring 配置,直接将所有配置放到 SpringMVC 的配置中来完成,这个在 SSM 整合时是没有问题的,在实际开发中,较多采用第二种方案,第二种方案,SpringMVC 的配置如下:

@Configuration
@ComponentScan(basePackages = "org.panstack")
public class SpringMVCConfig {
}


<dependencies>
    <!--    TODO 【Java创建SSM】1、引入依赖    -->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-webmvc</artifactId>
        <version>5.1.6.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>javax.servlet-api</artifactId>
        <version>4.0.1</version>
        <scope>provided</scope>
    </dependency>
    <!--   TODO 【Java创建SSM】8、解析jsp的依赖     -->
    <dependency>
        <groupId>javax.servlet.jsp</groupId>
        <artifactId>javax.servlet.jsp-api</artifactId>
        <version>2.3.1</version>
    </dependency>
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>3.8.1</version>
        <scope>test</scope>
    </dependency>
    <!--   解析json依赖     -->
    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-databind</artifactId>
        <version>2.14.0</version>
    </dependency>

</dependencies>