1、Spring Boot——使用Java搭建SSM环境

在学习Spring Boot之前先使用Java搭建一个SSM环境。因为在Spring Boot项目中,正常来说不存在XML配置,这是因为Spring Boot不推荐使用XML,注意,并非不支持。Spring Boot推荐开发者使用Java配置来搭建框架,Spring Boot中,大量的自动化配置都是通过Java配置来实现的,这一套实现方案,我们也可以自己做,即自己使用纯Java来搭建一个SSM环境,即在项目中,不存在任何XML配置,包括web.xml。
如果使用纯Java搭建SSM工程,要求tomcat版本必须7以上(实际上tomcat版本在7以上,servlet版本也是3.0以上,以前刚开始学习web的时候,要使用一个servlet,要在web.xml中注册一下才能用,除此之外还可以加一个注解@WebServlet,但是如果用的是tomcat6的话,它是没有这个注解的,7以上才有,而tomcat里面有servlet),servlet版本至少要3.0以上。
搭建步骤:
1、创建工程
创建一个普通的Maven工程,并添加SpringMVC的依赖。
(1)把新创建的工程打成一个war包,无需webapp目录和web.xml文件(可以不必创建web工程)。同时这里环境的搭建还需要用到Servlet,所以我们还需要引入Servlet的依赖(一定不能使用低版本的Servlet,但是Servlet低版本和高版本的名字不一样Servlet-api和jsp-api是低版本的,最新的稳定版是2.5,如果不用注解配置的话,使用低版本的Servlet是完全OK的。新版本的叫javax.servlet-api,最新的稳定版是4.0.1,其实它就是接着低版本的,就是名字变了而已):
在这里插入图片描述

<dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>4.0.1</version>
             <scope>provided</scope>
        </dependency>

(2)、添加SpringMVC的依赖

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

2、添加Spring配置
创建一个SpringConfig的配置文件

/**
 * @Configuration注解表示这是一个配置类,在我们这里,这个配置的作用类似于aplicationContext.xml
 *ComponentScan表示配置包扫描,类似于applicationContext.xml文件中的<context:component-scan base-package="org.javaboy.ytwl" use-default-filters="true">
 * <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
 * </context:component-scan>
 * 里面的配置和XML中的属性都是一一对应的,useDefaultFilters表示使用默认的过滤器,然后又出去Controller注解,即在Spring容器中扫描出来Controller之外的其他所有Bean.
 */
@Configuration
@ComponentScan(basePackages = "com.sxt",useDefaultFilters = true,excludeFilters = {@ComponentScan.Filter(type = FilterType.ANNOTATION,classes = Controller.class)})
public class SpringConfig {
}

3、添加SpringMVC配置
创建一个SpringMVCConfig的配置文件

@Configuration
//配置包扫描
@ComponentScan(basePackages = "com.sxt",useDefaultFilters = false,includeFilters = {@ComponentScan.Filter(type = FilterType.ANNOTATION,classes = Controller.class)})
public class SpringMVCConfig {
}

注意,如果不需要在SpringMVC中添加其他的额外配置,这样就可以了。即视图解析器,静态资源过滤,JSON解析,文件上传等等,如果都不需要配置的话,这样就可以了。

4、配置web.xml
此时,我们并没有web.xml文件(web.xml文件是启动引导的,系统的一些最基础的东西,都是从这里面去加载的,包括Spring,SpringMVC的容器都是读了web.xml之后才能加载出来的),这时,我们可以使用Java代码去代替web.xml文件。首先创建一个WebInit文件,实现WebApplicationInitializer

/**
 * WebInit的作用类似于web.xml,这个类需要实现WebApplicationInitializer 接口,并实现接口中的方法
 * 当项目启动时,onStartup方法会被自动执行,我们可以在这个方法中做一些项目初始化操作,
 * 例如加载SpringMVC容器,添加过滤器,添加Listener、添加Servlet
 * */
public class WebInit implements WebApplicationInitializer {
    @Override
    public void onStartup(ServletContext servletContext) throws ServletException {
        //一个web工程可以没有Spring的配置,但是一定要有SpringMVC的配置
        //加载SpringMVC配置文件
        AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext();
          ctx.register(SpringMVCConfig.class);
        //添加DispatcherServlet,第一个参数是servlet的名字
        ServletRegistration.Dynamic springmvc = servletContext.addServlet("springmvc", new DispatcherServlet(ctx));
        //给DispatcherServlet添加路径映射,相当于xml文件中的 <servlet-mapping>
         springmvc.addMapping("/");
        //给DispatcherServlet添加启动时机
        springmvc.setLoadOnStartup(1);
    }
}

5、测试
最后添加一个HelloController,然后启动项目

@RestController
public class HelloController {
    @GetMapping("/hello")
    public String hello(){
        return "hello controller!";
    }

}

启动成功:
在这里插入图片描述
那么如果再加一个service,在controller中注入service,然后用controller调用service会怎样呢?

HelloService:

@Service
public class HelloService {
    public String hello(){
        return "hello service!";
    }
}

HelloController:

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

项目启动后会发现报如下错误:无法创建helloController,因为无法解决helloService依赖,没有查找到一个叫helloService的bean,首先叫检查有没有加注解,加了,然后检查注解有没有扫描,也扫描了,那么就是扫描的文件本身没有执行。因为在WebInit配置类中只配置了SpringMVC的,没有配置Spring的,所以Spring的配置文件是无效的。

 org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'helloController': Unsatisfied dependency expressed through field 'helloService'; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'com.sxt.service.HelloService' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}

那么这个Spring的配置文件要怎么去加载呢?因为WebInit中已经没有地方可以去写了,可以在SpringMVC中添加,SpringMVC的配置文件中只扫描Controller,但是我们可以配置成它除了扫描Controller,还扫描Spring的配置文件

@Configuration
//配置包扫描
@ComponentScan(basePackages = "com.sxt",useDefaultFilters = false,includeFilters = {@ComponentScan.Filter(type = FilterType.ANNOTATION,classes = Controller.class),@ComponentScan.Filter(type = FilterType.ANNOTATION,classes = Configuration.class)})
public class SpringMVCConfig {
}

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

第二种方案:删除SpringConfig配置文件,在SpringMVC配置文件中直接扫描所有

@Configuration
//配置包扫描
@ComponentScan(basePackages = "com.sxt")
public class SpringMVCConfig {
}

这种方案所有的注解都在SpringMVC中扫描,启动项目,访问接口:
在这里插入图片描述6、其他配置
(1)静态资源过滤
静态资源过滤在SpringMVC的XML中的配置如下:

 <mvc:resources mapping="/**" location="/"/>

在Java配置的,如果要配置静态资源过滤,需要让SpringMVC的配置继承WebMvcConfigurationSupport,进而重写WebMvcConfigurationSupport中的方法。
例如:在resouses目录下创建一个js文件,要怎么才能访问到呢?
在这里插入图片描述在SpringMVC的配置文件中配置静态资源过滤

@Configuration
//配置包扫描
@ComponentScan(basePackages = "com.sxt")
public class SpringMVCConfig extends WebMvcConfigurationSupport {
    @Override
    protected void addResourceHandlers(ResourceHandlerRegistry registry) {

        registry.addResourceHandler("/js/**").addResourceLocations("classpath:/");
    }
}

在这里插入图片描述重写addResourceHandlers方法(在Spring Boot中自动重写了该方法)在这个方法中配置静态资源过滤,这里我将静态资源放在了resources目录下,所以资源位置是classpath:/,如果采用了Java来配置SSM环境,资源也可以放在webapp目录下,此时只需要修改配置中的资源位置就可以了,如果采用Java来配置SSM环境,一般来说可以不必使用webapp目录,除非要使用JSP做页面模板,否则可以忽略webapp目录。

(2)视图解析器
在XML文件中,通过如下方式配置视图解析器:

  <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/jsp"/>
        <property name="suffix" value=".jsp"/>
    </bean>

如果通过Java类一样也可以类似功能。
首先为我们的项目添加webapp目录,webapp目录中添加一个jsp目录,jsp目录中添加jsp文件,
在这里插入图片描述
然后引入jsp的依赖

 <dependency>
            <groupId>javax.servlet.jsp</groupId>
            <artifactId>javax.servlet.jsp-api</artifactId>
            <version>2.3.1</version>
        </dependency>

然后,在配置类中,继续重写方法:

@Configuration
//配置包扫描
@ComponentScan(basePackages = "com.sxt")
public class SpringMVCConfig extends WebMvcConfigurationSupport {
    //视图解析器
    @Override
    protected void configureViewResolvers(ViewResolverRegistry registry) {
        registry.jsp("/jsp/",".jsp");
    }
    }

接下来,在controller中添加控制器,即可访问jsp页面

@Controller
public class HelloController2 {
    @GetMapping("/hello2")
    public String hello(){
        return "hello";
    }
}

在这里插入图片描述
(3)路径映射
有的时候,我们的控制器的作用仅仅只是一个跳转,就像上面小节的控制器,里边没有任何业务逻辑,像这种情况,可以不用定义方法,可以直接通过路径映射来实现变量访问。如果在XML中配置路径映射如下:

<mvc:view-controller path="/hello" view-name="hello" status-code="200"/>

这行配置表示如果用户访问/hello这个路径,则直接将名为hello的视图返回给用户,并且响应码为200,这个配置就可以替代controller中的方法。
如果在Java代码中,写法如下:

@Configuration
//配置包扫描
@ComponentScan(basePackages = "com.sxt")
public class SpringMVCConfig extends WebMvcConfigurationSupport {
   //路径映射
    @Override
    protected void addViewControllers(ViewControllerRegistry registry) {
        registry.addViewController("/hello3").setViewName("hello");
    }
    }

此时,用户访问/hello3接口,就能看到名为hello的视图文件
在这里插入图片描述
(4)JSON配置
SpringMVC可以接收JSON参数,也可以返回JSON参数,这一切依赖于HttpMessageConverter,HttpMessageConverter可以将一个JSON字符串转为对象,也可以将一个对象转为JSON字符串,实际上它的 底层还是依赖于具体的JSON库,所有的JSON库要在SpringMVC上返回或者接收JSON,都必须提供和自己相关的HttpMessageConverter。SpringMVC默认提供了Jackson和gson的HttpMesageConverter,分别是:MappingJackson2HttpMessageConverter和GsonHttpMessageConverter正因为如此,我们在SpringMVC中,如果要使用JSON和gson我们只需要添加依赖,加完依赖就可以直接使用了。具体的配置是在AllEncompassingFormHttpMessageConverter类中完成的。

如果开发者使用了fastjson,那么默认情况下SpringMVC并没有提供fastjson的HttpMessageConverter,这个需要我们自己提供,如果是在XML配置中,fastjson除了加依赖,还要显示配置HttpMessageConverter

 <!-- fastjson依赖-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.49</version>
        </dependency>
 <mvc:annotation-driven>
        <mvc:message-converters>
            <bean class="com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter"></bean>
        </mvc:message-converters>
    </mvc:annotation-driven>

如果在Java配置SSM中,我们一样也可以添加这样的配置;

@Configuration
//配置包扫描
@ComponentScan(basePackages = "com.sxt")
public class SpringMVCConfig extends WebMvcConfigurationSupport {
    //配置fastjson
    @Override
    protected void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
        FastJsonHttpMessageConverter converter = new FastJsonHttpMessageConverter();
       //设置编码方式
        converter.setDefaultCharset(Charset.forName("UTF-8"));
        FastJsonConfig fastJsonConfig = new FastJsonConfig();
        fastJsonConfig.setCharset(Charset.forName("UTF-8"));
        converter.setFastJsonConfig(fastJsonConfig);
        converters.add(converter);
    }
    }

测试,在控制器中添加一个方法,测试fastjson

  @GetMapping("/hello4")
    public List<String> hello4(){
        ArrayList<String> list=new ArrayList<>();
        for (int i=0;i<10;i++){
            list.add("张三+"+i);
        }
        return list;
    }

然后,就可以在接口中直接返回JSON了,此时的JSON数据将通过fastson生成。
在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值