PC端、移動端頁面適配方案


摘自:https://www.cnblogs.com/huanzi-qch/p/12053799.html

PC端、移動端頁面適配方案

 

  前言

  頁面自適應PC端、移動端大體上可以分為兩種:

  1、在同一個頁面進行自適應布局,通常使用CSS3 @media 媒體查詢器實現

  2、兩套頁面,在后端進行統一適配,根據不同的瀏覽器UA返回對應的頁面

 

  本文記錄在java后端進行PC端、移動端頁面適配的方案

 

  工程結構

  想要實現后端統一適配,首先要規范好工程結構

  后端代碼,跟之前差不多,響應的viewName路徑,直接從業務模塊開始,適配工作交給aop;兩套頁面,對應的業務模塊,分別放在兩個目錄下面

  

 

  aop適配器

  統一的適配工作交由aop環繞切面進行,思路如下:

  1、首先切入點是所有模塊的controller

  2、if判斷,方法返回值為ModelAndView才需要進行處理

  3、獲取瀏覽器UA進行判斷,修改返回值ModeAndView的viewName

    PC端ua:windows nt、macintosh

    移動端ua:iphone、ipod、android

 

  現在的UA標識判斷還過於簡單,並沒有完全覆蓋市面上所有的PC端、移動端,這個需要自行補充

復制代碼
/**
 * PC端、手機端頁面適配器
 */
@Aspect
@Component
@Slf4j
public class ComputerOrMobileAdapterAspect {

    /**
     * Pointcut 切入點
     * 匹配controller包下面的所有方法
     */
    @Pointcut(value = "execution(public * cn.huanzi.qch.springbootuniappmui.*.controller.*.*(..))")
    public void pointcut() {
    }

    /**
     * 環繞通知
     */
    @Around(value = "pointcut()")
    public Object around(ProceedingJoinPoint pjp) {
        //request對象
        HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.currentRequestAttributes()).getRequest();

        try {
            //獲取返回值
            Object o = pjp.proceed();

            //攔截返回值為ModelAndView即可
            if("org.springframework.web.servlet.ModelAndView".equals(o.getClass().getName())){
                 /*
                PC端ua:windows nt、macintosh
                移動端ua:iphone、ipod、android
             */
                String adapter;
                String ua = request.getHeader("user-agent").toLowerCase();
                if (ua.contains("iphone") || ua.contains("ipod") || ua.contains("android")) {
                    adapter = "mobile";
                } else {
                    adapter = "computer";
                }
                log.info("PC端、手機端頁面適配器:" + adapter);

                //強勢修改
                ModelAndView modelAndView = (ModelAndView) o;
                String viewName = modelAndView.getViewName();
                modelAndView.setViewName(adapter + "/" + viewName);
                o = modelAndView;
            }

            return o;
        } catch (Throwable throwable) {
            //返回統一錯誤頁面
            log.error(throwable.getMessage());
            return new ModelAndView("common/error/500");
        }
    }
}
復制代碼

 

  測試與效果

  由於我們已經規范了工程結構,HTML文件的存放路徑是先分PC端、移動端兩個大目錄,每個大目錄下面才是具體的業務模塊目錄,因此我們的controller中設置的viewName直接從業務模塊目錄開始就可以了,前面的兩個大目錄又aop去適配統一添加

復制代碼
@RestController
@RequestMapping("/index/")
public class IndexController {

    @GetMapping("index")
    public ModelAndView index(){
        return new ModelAndView("index/index");
    }

    @GetMapping("getData")
    public String getData(){
        return "獲取數據接口";
    }
}
復制代碼

 

  效果演示

  可以看到,已經能根據不同的UA響應不同的HTML頁面,同時,只有controller中,響應值為ModeAndView的aop適配器才會進行工作

  同時,瀏覽器的url是直接從業務模塊開始,而不是在aop適配器修改后的路徑

 

  后記

  在java后端進行PC端、移動端頁面適配的方案就暫時記錄到這,后續再進行補充

 

  代碼開源

  代碼已經開源、托管到我的GitHub、碼雲:

  GitHub:https://github.com/huanzi-qch/springBoot

  碼雲:https://gitee.com/huanzi-qch/springBoot

作者: huanzi-qch
若標題中有“轉載”字樣,則本文版權歸原作者所有。若無轉載字樣,本文版權歸作者和博客園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,否則保留追究法律責任的權利.
請注意:作者五行缺錢,如果喜歡這篇文章,請隨意打賞!
 
好文要頂  關注我  收藏該文   


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM