Springboot PC和手机端分离

在现代的网站中所有的手机端和PC端显示不同具有三种不同的方案,一种是自适应方案,这种方案一般实现的理念是移动优先,基本上所有的体验和UI都是以移动端为主,适应PC端的业务和显示效果,这种往往提供了手机端和PC端相似或者一致的用户体验。

第二种是手机端和PC端完全是采用两个独立的站点的形式设计的,读取统一数据来源或者是独有的数据来源,提供特别的功能或者是完全不同的用户体验,甚至开发团队都不是一组人员。

第三种也是我们今天·说的这种,通过判定不同的设备,在一个应用中完成不同的数据读取和模板渲染功能,这种方案介于上述两种方案中间,虽然已经不再是一种非常流行的方案,但是还有很多的开发者选择了这种做法。

在Springboot中可以根据JavaScript或者是后端直接判定当前用户的设备状态。在这里使用后端的方式键判定。

  1. 首先增加一个XML包(这个包不在Maven中,需要引入第三方的仓库)

xml <dependencies> <dependency> <groupId>org.springframework.mobile</groupId> <artifactId>spring-mobile-device</artifactId> <version>2.0.0.M3</version> </dependency> <dependencies> <repositories> <repository> <id>spring-milestones</id> <name>Spring Milestones</name> <url>https://repo.spring.io/libs-milestone</url> <snapshots> <enabled>false</enabled> </snapshots> </repository> </repositories>

  1. 接下来编写URL Interrupt,如下代码所示。

```java import org.springframework.web.servlet.LocaleResolver; import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.mobile.device.DeviceHandlerMethodArgumentResolver; import org.springframework.mobile.device.DeviceResolverHandlerInterceptor; import org.springframework.web.method.support.HandlerMethodArgumentResolver; import org.springframework.web.servlet.config.annotation.InterceptorRegistry; import org.springframework.web.servlet.i18n.CookieLocaleResolver; import org.springframework.web.servlet.i18n.LocaleChangeInterceptor;

import java.util.List; import java.util.Locale;

@Configuration public class MobileWebMvcConfigurer implements WebMvcConfigurer { @Bean public DeviceResolverHandlerInterceptor deviceResolverHandlerInterceptor() { return new DeviceResolverHandlerInterceptor(); }

   @Bean
   public DeviceHandlerMethodArgumentResolver
   deviceHandlerMethodArgumentResolver() {
       return new DeviceHandlerMethodArgumentResolver();
   }

   @Override
   public void addInterceptors(InterceptorRegistry registry) {
       registry.addInterceptor(deviceResolverHandlerInterceptor());
       registry.addInterceptor(localeChangeInterceptor());
   }

   @Override
   public void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) {
       argumentResolvers.add(deviceHandlerMethodArgumentResolver());
   }

   //    多语言配置
   @Bean
   public LocaleResolver localeResolver() {
       CookieLocaleResolver slr = new CookieLocaleResolver();
       // 默认语言
       slr.setDefaultLocale(Locale.CHINA);
       return slr;
   }

   @Bean
   public LocaleChangeInterceptor localeChangeInterceptor() {
       LocaleChangeInterceptor lci = new LocaleChangeInterceptor();
       // 参数名
       lci.setParamName("_lang");
       return lci;
   }

   @Override
   public void addResourceHandlers(ResourceHandlerRegistry registry) {
       registry.addResourceHandler("/static/**").addResourceLocations("classpath:/static/");
   }

}

```

  1. 可以在Controller中通过方法来进行Mobile和PC的判定,如下代码所示。
import org.springframework.mobile.device.Device;
@RequestMapping("/")
    public String index(Device device, ModelMap modelMap) {
        通用逻辑
        if (device.isMobile()) {
            // 手机端的逻辑
            return "mobile/index";
        } else {
           // PC的逻辑
            return "index";
        }
    }

链接