精华内容
下载资源
问答
  • AJAX 单页面应用的两种实现思路

    千次阅读 2017-10-24 16:10:26
    现在,单页面应用已经是一趋势,这不仅能提升用户体验,还能降低服务器资源的损耗,也是 Web App 与原生 App 一战的最大资本! 在我们还无法完全享受 fetch API 带给我们的便利时,我们的单页面开发的根基...

    现在,单页面应用已经是一种趋势,这不仅能提升用户体验,还能降低服务器资源的损耗,也是 Web App 与原生 App 一战的最大资本!

    在我们还无法完全享受 fetch API 带给我们的便利时,我们的单页面开发的根基仍旧是 AJAX。当我们知道了 AJAX 这个东西后,感觉前路一片光明,但是真正用起来就会发现还有很多问题是我们需要考虑的。

    本文我会首先介绍一下我所理解的前后端分离,然后我们介绍 AJAX 实现单页面应用的两种思路及其对比。 

    前后端分离

    做为一个在学校一直和 CMS 打交道,同时还要负责数据库、服务器运维的程序员,我是深深体会过“上古时代” 的前后端耦合带来的痛苦的。所幸的是,前端、后端都是自己一个人做,也就不需要去和前端或者后端撕逼了。

    上古时代的撕逼

    小前:诶,后端,我的页面有代码更新了,我把新代码传给你,你帮我更新一下后端的模板。 
    小后:更你妹,你今天都™叫我更新十多次了,还要我更新?没得商量,100块一次,再后面的每次修改加价 20! 
    小前:咱两谁跟谁呀,谈钱多伤感情呀! 
    小后:谈感情才伤钱,去去去,自己花点时间学者写我们后端的代码,我可以教你,200 包会! 
    小前:滚!都赖设计,今天都改了十多次了。 
    小设:啊,这十多次里有七八次是产品把需求改了,能赖我吗? 
    小汪:改点需求怎么了,老大说了要让产品做到极致,那就得改。你们是在用代码改变世界,你想让用户边用你的东西边骂你吗?还不快利索点改! 
    ……

    而 AJAX 和 Node 的出现于流行则让整个 Web 开发步入了 “大前端” 时代。网上一大片关于现在前后端分离与 “大前端” 趋势的文章,而想真的尝到这些甜头,自己实践就是必须的了,这里不说太多。

    这里先明确一下,下面要讲的内容里的 AJAX 单页面应用的架构是这样(为了方便,这里明确了技术栈每一项的方向,真实的开发可以自己选择语言和数据库):

    1. 后端使用 Java + MySQL 为公司内网的服务器提供内网数据 API,供内网其他 Web 服务器调取。
    2. 前端编写 Node 服务器,模板渲染,吐出首屏,路由管理,以及提供直接面向浏览器的数据 API。
    3. 再靠前一点,使用 Apache 或 Nginx 做负载均衡,转发请求到内网的其他服务器上。
    4. 浏览器端只有在首屏是接收服务器返回的整个页面,之后全部采用 AJAX 来进行数据的更新,利用服务器端 API 返回的数据进行模板渲染,达到页面的更新。

    这里有几个问题可以延伸去思考:

    1. 由服务器端进行首屏渲染的好处
    2. 这里面可能存在的数据安全问题?如何避免?

    就这样,大家各司其职,前端利用 JavaScript + Node 入侵了服务器端,后端的工作变得更加专一,前端的控制力变得更加强。虽然前端的任务似乎加重了,但是整个开发的效率则是大大提升,前后端唯一需要耦合的就是数据 API 的标准规范!

    今天我们主要目标是前端使用 AJAX 进行单页面开发这一环。说到 AJAX 就脱离不了数据 API,网上有着许多免费、公开的的 API 服务提供,当然也可以换一种思路:拦截 AJAX 请求,返回假数据。很幸运,后面那种思路已经有 “轮子” 帮我们做了,这里选择 Mock.js 进行 AJAX 请求的拦截与特定模板假数据的生成。

    思路1:url hash + hashChange 事件

    页面不刷新而带来 url 变化我们最先想到的肯定就是 url hash 了。我们使用 location.hash 可以轻松的访问与变更 hash 值。

    至于 hash 值变动带来页面可能的上下闪动(页面上可能有对应 hash 值 id 的元素),我们只需要禁用锚点点击的默认事件就行。

    hash 值的变动同时还会触发全局对象上的 hashChange 事件,在这个事件里我们就能做很多事情了。我们在这个事件阶段需要做的就是依照 hash 值得变动,解析 url 之后,向对应的服务器端 API 发起 AJAX 请求获得数据更新页面。

    首先我们来封装一下 AJAX 请求生成器(点击链接后面链接查看源码):ajax.js

    准备好首屏页面 index.html(这里简单起见,没有使用模板引擎进行模板+数据的渲染)

     
    1. <a class="ajax-anchor" data-href="abc" href="/abc">#abc</a>
    2. <a class="ajax-anchor" data-href="def" href="/def">#def</a>
    3. <a class="ajax-anchor" data-href="hij" href="/hij">#hij</a>
    4. <div id="contariner">
    5. 初始数据!
    6. </div>

    然后利用 Mock.js 进行 AJAX 拦截,提供假数据模板:

     
    1. Mock.mock(/http:\/\/yangfch3\.com(\/\w+)*\?[\w^\w]*/, {
    2. "array|+1": [
    3. "AMD",
    4. "CMD",
    5. "UMD"
    6. ]
    7. });

    禁用 AJAX 请求锚点的默认点击事件(用到了 ES6 的特性,在实际使用过程中请考虑兼容性)

     
    1. var ajaxAnchors = document.querySelectorAll('.ajax-anchor');
    2. var contariner = document.querySelector('#contariner');
    3. window.addEventListener('click', function(e) {
    4. if ([...ajaxAnchors].indexOf(e.target) > -1) {
    5. e.preventDefault();
    6. location.hash = e.target.dataset['href'];
    7. }
    8. }, false);

    使用 hashChange 事件来触发请求

     
    1. var callback = function(responseText, status, xhr) {
    2. contariner.innerHTML = responseText;
    3. };
    4. window.addEventListener('hashchange', function(e) {
    5. var api = 'https://api.yangfch3.com?q=' + location.hash.substr(1);
    6. new Ajax(api, callback);
    7. }, false)

    现在我们,点击对应的链接,页面只进行了局部的数据更新,并且我们点击浏览器后退、前进按钮可以恢复之前的页面状态!

    浏览器的状态缓存机制(back-forward cache)让我们能在不做任何处理的情况下回到或前进到某一状态。

    如果需要在用户每次后退进入或前进进入时页面做出相应的响应,则可以监听 pageshow 和 pahehide 事件进行相应的处理!

    pageshow 会在当前页面加载完后、点击浏览器后退/前进按钮重新进入当前页时触发(问题:调用 history 后退/前进 API 时会不会触发? -会);pagehide 在浏览器卸载页面的时候触发,而且是在 unload 事件之前触发

    pageshow 与 pagehide 事件对象 persisted 属性可以用于检测当前页是否是由 BFCache 载入。

    现在我们总结一下这个方案的优点:

    1. 实现简单
    2. 符合我们的一般思路,兼容性也强
    3. 状态的回退与前进十分方便

    那么缺点呢?或者说在某些情境下存在的缺点。

    直说吧,这套方案在我们的页面内容需要被搜索引擎收录的时候存在缺陷。搜索引擎收录爬虫在到达某个地址后不会执行页面的 JS,收录时不会像我们的浏览器一样先发起一个 Ajax 请求生成完整内容再收录,这就对网站的 SEO(如果需要的话)带来了不便。

    网上有着这个问题的探讨,例如以下文章:

    1. 用 PhantomJS 来给 AJAX 站点做 SEO 优化

    2. 单页面架构的 SEO

    3. 常见搜索引擎 UA

    基本思路

    1. 后端:准备两套服务器代码,一套给 AJAX 单页面应用用的数据服务器,一套专门给搜索引擎爬虫用的 旁路渲染服务器(提供的是完整的对应页面的 HTML 代码)。

    2. 后端接入层:一般是 Ngnix 会 Apache,根据请求的 UA,判断请求来自用户还是引擎爬虫,分流至上面后端的某台服务器上。

    3. 浏览器端:给爬虫用的 <a> 的 href 使用跳转型链接,这样爬虫遇到这个链接时才会继续跳转、深爬,爬虫遇到 #xxx 这样的 href 是不理会的;我们的 JavaScript 代码则禁用这些跳转链接的默认行为,代之为变更 hash值,使页面无需刷新。说通俗点就是:给爬虫看的是一套,对用户做的是另一套!

    Google 当然也是考虑到了这一点的,所以提出了 #! 方案。

    搜索引擎爬虫虽然不会去对你的 #xxx 做出例会,但是能够智能地识别 #!xxx 这样的 href,转化为请求 ?_escaped_fragment=xxx,你需要做的就是在服务器上准备好 ?_escaped_fragment=xxx 对应的 HTML 代码,就能被搜索引擎收录了。

    # #! 结构对于程序员来说还是比较容易接受的,但是对于需要直观的链接用于记忆的站点来说就不那么友好了。

    有些站点是 abc.com/#/xxx/yyy,有些是 abc.com/#xxx/yyy,还有 abc.com/#!/xxx/yyy 、abc.com/#!xxx/yyy 这样的,同时输入网址时,还需要 shift + 数组组合输入,不方便!

    例如以前 twitter 的 https://twitter.com/#!/yangfch3,引来了用户的大量抱怨。

    当然,如果你的单页面应用是无需 SEO 的话(例如后台管理界面),那么事情就相对简单一些了!

    下面我们开始介绍 Ajax 单页面应用的第二种实现思路,开始逃离 # 和 #!

    思路2:histroy API + popstate 事件

    有没有一种方案,能够:

    1. 实现页面 url 的变化
    2. 同时不会引起页面刷新
    3. 并且无需采用 # 或 #! 结构,页面的 url 是直观的、贴近用户平时习惯的

    很幸运,我们能找到这个东西,HTML5 中 history 新 API 加上 popstate 事件能够完美地做到这一点。

    history 对象里的 pushState() 和 replaceState() 来无更新地改变页面的 url,使用 popState 事件来实现浏览器工具栏前进、后退时的状态管理。

    流程是这样的:

    1. 页面第一次加载,可以使用 replaceState() 来初始化 history.state 以及处理一些相关的页面初始化事务。
    2. 用户点击链接,触发点击事件
    3. 点击事件的处理函数中,禁用链接的默认跳转,使用 pushState() 来更新页面的 url,同时根据新 url 的对应 API 发起 Ajax 请求获得数据,更新页面内容,同时更新 history.state 对象
    4. 用户点击浏览器的前进、后退按钮,触发 popState 事件,我们在 popstate 事件的处理中实现前、后状态的恢复

    相关实现代码,可以查看 demo 的源码。

    这样,我们就实现了对用户的友好,接下来就是另外一件事了:解决搜索引擎的收录问题(SEO)

    Discourse 做出了很好的探索:因为不使用井号结构,每个URL都是一个不同的请求。所以,要求服务器端对所有这些请求,返回给用户的不能是 404,同时 返回给搜索引擎爬虫的 HTML 也需要包含页面的 SEO 内容!能否将这两者做一下结合呢?看下面的解构:

     
    1. <html>
    2.   <body>
    3.     <section id='container'></section>
    4.     <noscript>
    5.       ... ...
    6.     </noscript>
    7.   </body>
    8. </html>

    奥秘就在 noscript 标签那,对于不能执行 JS 的引擎爬虫来说,noscript 里的内容专门为其准备,而对于用户来说,这个返回的页面又能正常使用。

    当然,对于用户来说,noscript 显得冗余了,所以我们还是可以在服务器上针对用户与爬虫准备两套方案

    总而言之,使用 history API 和 popState 事件的最大原因就是我们想去掉 url 里的 # 和 #!,让我们的 url 变得更加亲近、自然!而相比思路 1 麻烦了的一点就是我们需要使用 popState 事件来手动恢复前后的状态,好在这并不是困难的一件事,一般的框架(Vue、React、pjax 等)都有着非常方便地自动管理解决方案。

    小结

    这两种思路各有好处,到底采用哪一个你需要做出决断,决断的做出需要考虑对用户的友好、实现的难易程度、是否需要 SEO、服务器端解决方案……

    总之,单页面应用的前景是光明的,在现阶段,Single Page Web App 是唯一能在移动端叫板原生 App 的角色。

    展开全文
  • Android 页面跳转动画的两种实现方式

    千次阅读 2016-11-18 15:44:06
    第一跳转页面的方法,在XML中定义个动画,一个是页面进入的动画,一个是页面退出动画,实现方式如下: 写一个进入动画 alpha_in android:duration= "1000" android:fromAlpha= "0.0" android:...

    先说一下在XML中定义动画的类型,分别有:

    alpha 渐变透明度动画效果
    scale 渐变尺寸伸缩动画效果
    translate 画面转换位置移动动画效果
    rotate 画面转移旋转动画效果

    在XML中定义动画上面的动画类型可以随意组合,达到想要的效果,下面是代码片段:

    <?xml version="1.0" encoding="utf-8"?>
    <set xmlns:android="http://schemas.android.com/apk/res/android">
    <!--  渐变透明度动画效果   -->
        <alpha
            android:duration="1000"
            android:fromAlpha="0.0"
            android:toAlpha="1.0" />
    
        <!--
        fromAlpha:开始时透明度
        toAlpha: 结束时透明度
        duration:动画持续时间 -->
    
    </set>
    
    
    <!-- 画面转移旋转动画效果   -->
    <?xml version="1.0" encoding="utf-8"?>
    <set xmlns:android="http://schemas.android.com/apk/res/android">
        <rotate
            android:fromDegrees="0"
            android:pivotX="100%"
            android:pivotY="0"
            android:toDegrees="360"
            android:duration = "1000"/>
        <!--
      fromDegrees   动画开始时的角度
      toDegrees     动画结束时物件的旋转角度,正代表顺时针
      pivotX    属性为动画相对于物件的X坐标的开始位置
      pivotY    属性为动画相对于物件的Y坐标的开始位置    -->
    
    </set>
    
    
    
    
    
    <!-- 渐变尺寸伸缩动画效果   -->
    <?xml version="1.0" encoding="utf-8"?>
    <set xmlns:android="http://schemas.android.com/apk/res/android">
        <translate
            android:fromXDelta="0"
            android:fromYDelta="0"
            android:toXDelta="-100%"
            android:toYDelta="0"
            android:duration = "500"/>
        <!--fromXDelta,fromYDelta   起始时X,Y座标,屏幕右下角的座标是-->
        <!--toXDelta, toYDelta     动画结束时X,Y的座标 &ndash;&gt;-->
    
    </set>
    
    <!-- 画面转换位置移动动画效果   -->
        <?xml version="1.0" encoding="utf-8"?>  
        <set xmlns:android="http://schemas.android.com/apk/res/android">  
             <scale    
             android:interpolator= "@android:anim/decelerate_interpolator"      
             android:fromXScale="0.0"      
             android:toXScale="1.5"      
             android:fromYScale="0.0"      
             android:toYScale="1.5"      
             android:pivotX="50%"      
             android:pivotY="50%"      
             android:startOffset="0"      
             android:duration="10000"  
             android:repeatCount="1"    
             android:repeatMode="reverse"  
             />  
        </set>  
        <!--  
        interpolator指定动画插入器,常见的有加速减速插入器accelerate_decelerate_interpolator,加速插入器accelerate_interpolator,减速插入器decelerate_interpolator。  
        fromXScale,fromYScale,动画开始前X,Y的缩放,0.0为不显示,1.0为正常大小  
        toXScale,toYScale,动画最终缩放的倍数,1.0为正常大小,大于1.0放大  
        pivotX,pivotY动画起始位置,相对于屏幕的百分比,两个都为50%表示动画从屏幕中间开始  
        startOffset,动画多次执行的间隔时间,如果只执行一次,执行前会暂停这段时间,单位毫秒  
        duration,一次动画效果消耗的时间,单位毫秒,值越小动画速度越快  
        repeatCount,动画重复的计数,动画将会执行该值+1次  
        repeatMode,动画重复的模式,reverse为反向,当第偶次执行时,动画方向会相反。restart为重新执行,方向不变  
         -->  

    第一种跳转页面的方法,在XML中定义两个动画,一个是页面进入的动画,一个是页面退出动画,实现方式如下:

    写一个进入动画 alpha_in

    <alpha
            android:duration="1000"
            android:fromAlpha="0.0"
            android:toAlpha="1.0" />

    alpha_out

    <alpha
            <alpha
            android:duration="1000"
            android:fromAlpha="1.0"
            android:toAlpha="0.0" />

    在java代码中实现方式:

    startActivity(new Intent(A.this, B.class));               overridePendingTransition(R.anim.alpha_into,R.anim.alpha_out);

    这种实现能在跳转的时候实现动画,当返回页面时候就没有动画了。

    第二种跳转页面的方法,在XML中定义四个,

    第一个是打开页面的动画 translate_into 相当于A跳转B,B的动画效果

    <?xml version="1.0" encoding="utf-8"?>
    <set xmlns:android="http://schemas.android.com/apk/res/android">
        <translate
            android:fromXDelta="100%"
            android:fromYDelta="0"
            android:toXDelta="0"
            android:toYDelta="0"
            android:duration = "500"
            />
    </set>

    第二个XML translate_out 相当于A跳转B,A的动画效果

    <?xml version="1.0" encoding="utf-8"?>
    <set xmlns:android="http://schemas.android.com/apk/res/android">
        <translate
            android:fromXDelta="0"
            android:fromYDelta="0"
            android:toXDelta="-100%"
            android:toYDelta="0"
            android:duration = "500"/>
    </set>

    第三个XML translate_close_into 相当于A跳转B后,从B返回到A时候A的动画效果

    <?xml version="1.0" encoding="utf-8"?>
    <set xmlns:android="http://schemas.android.com/apk/res/android">
    
        <translate
            android:fromXDelta="-100%"
            android:fromYDelta="0"
            android:toXDelta="0"
            android:toYDelta="0"
            android:duration = "500"/>
    </set>

    第四个XML translate_close_out相当于A跳转B后,从B返回到A时候B的动画效果

    <?xml version="1.0" encoding="utf-8"?>
    <set xmlns:android="http://schemas.android.com/apk/res/android">
        <translate
            android:fromXDelta="0"
            android:fromYDelta="0"
            android:toXDelta="100%"
            android:toYDelta="0"
            android:duration = "500"/>
    </set>

    在styles中定义:

    <style name="Anim_fade" parent="android:Theme">
            <item name="android:windowAnimationStyle">@style/PageAnimation</item>
        </style>
            <style name="PageAnimation" parent="@android:style/Animation.Activity">
                <item name="android:activityOpenEnterAnimation" >@anim/translate_into</item>
                <item name="android:activityOpenExitAnimation">@anim/translate_out</item>
                <item name="android:activityCloseEnterAnimation">@anim/translate_close_into</item>
                <item name="android:activityCloseExitAnimation">@anim/translate_close_out</item>
            </style>

    最后异步在AndroidManifest中在需要跳转的连个Activity设置 android:theme=”@style/Anim_fade”

    <activity android:name=".A"
                android:theme="@style/Anim_fade"/>
                <activity android:name=".B"
                android:theme="@style/Anim_fade"/>

    在java代码中正常调用跳转也买年就行了,设置Theme在页面返回也有退出的动画效果

    展开全文
  • JSP页面跳转的几实现方法

    千次阅读 2017-11-06 14:30:34
    初衷:将登录用户的用户名 密码form提交到页面2(jsp就是servlet 提交到servlet的就不说了) 由页面2判断用户名密码的正确性继而决定跳转的方向 下面是几实现方法 使用href超链接标记 客户端跳转 使用...

    初衷:将登录用户的用户名 密码form提交到页面2(jsp就是servlet  提交到servlet的就不说了) 由页面2判断用户名密码的正确性继而决定跳转的方向 下面是几种实现方法

    使用href超链接标记      客户端跳转

    使用javascript               客户端跳转

    提交表单                        客户端跳转

    使用response对象      客户端跳转

    使用forward总做标记  服务器跳转

    使用requestDispatcher类 服务器跳转

    页面1

    1. <form name="form1" method="POST" action="login02.jsp">  
    2.    <input type="text" name="name">  
    3.    <input type="text" name="psd">  
    4.    <input type="submit" value="提交">  
    5.    <input type="reset" value="重置">  


    页面2

    1. <%response.setCharacterEncoding("utf-8");  
    2. response.setHeader("iso-8859-1","utf-8");  
    3. request.setCharacterEncoding("utf-8");  
    4.     String name = request.getParameter("name");  
    5.     String psd  = request.getParameter("psd");  
    6.     if(name.equals("admin")&&psd.equals("123")){%>  
    7.     <script type="text/javascript">  
    8.     window.location="login03.jsp";  
    9.     </script>  
    10.    <% }  
    11.    else{  %>  
    12.          <script type="text/javascript">  
    13.          window.location="http://www.baidu.com";  
    14.          alert(window.location.href);  
    15.          </script>  
    16.    <% }%>  


    页面1提交到页面2之后 java代码负责判断 然后通过js代码进行跳转

     

    页面3

    1. <%response.setCharacterEncoding("utf-8");  
    2. response.setHeader("iso-8859-1","utf-8");  
    3. request.setCharacterEncoding("utf-8");  
    4.     String name = request.getParameter("name");  
    5.     String psd  = request.getParameter("psd");  
    6.       if(name.equals("admin")&&psd.equals("123")){  
    7.       response.sendRedirect("http://www.baidu.com");//路径001  
    8.       return;  
    9.       }  
    10.       else{  
    11.       response.sendRedirect("login01.jsp");  
    12.       return;  
    13.       }  
    14.     %>  


    页面1提交到页面3之后通过 response对象的sendredirect()方法 重定向

    在上段代码的路径001中说明一点 sendredirect()中的URL是可以带参数 eg sendredirect("url?name="+name);

    重定向 顺便传递参数 sendredirect注意的第二点:一般此句之后紧跟一句 return;(原因:通过sendredirect方法做重定向是在页面处理完之后才会有实际动作的,譬如上个例子里 页面的用户名 密码输入完毕 点击提交 然后后一个页面判断 判断完即处理完 页面3是不需要输出的 也是输不出来东西的 没有return再有别的输出是没有意义的 而且有的时候芳儿因为无意义的输出而报错)

    使用 response对象实现页面的跳转有2中方法 上面是一种 下面这种是是利用 setHeader()方法

    还是页面1提交 把页面3的代码修改一下就可以了:

    1. <%response.setCharacterEncoding("utf-8");  
    2.   response.setHeader("iso-8859-1","utf-8");  
    3.   request.setCharacterEncoding("utf-8");  
    4.       String name = request.getParameter("name");  
    5.       String psd  = request.getParameter("psd");  
    6.         if(name.equals("admin")&&psd.equals("123")){  
    7.       //  response.sendRedirect("http://www.baidu.com");  
    8.      //   return;  
    9.      response.setHeader("Refresh","1;url=http://www.baidu.com");  
    10.         }  
    11.         else{  
    12.        // response.sendRedirect("login01.jsp");  
    13.        // return;  
    14.        response.setHeader("Refresh","1;url=login01.jsp");  
    15.         }  
    16.       %>  


    response.setHeader("Refresh","等待的秒数;url=绝对路径或者相对路径"); 路径问题sendredirect也一样 绝对路径相对路径都没意见 上例都是等待1秒之后跳转

     

    response重定向和forward跳转的区别

    response:1执行完所有的代码再跳转到目标页 2跳转到目标页后浏览器的URL会改变 3在浏览器中重定向 4可以跳转到其他服务器上的页面 eg:百度。

    forward跳转:1直接跳转到目标网页 其后的代码不再执行 2跳转到目标页后URL不变 虽然URL显示的是index1.jsp 但其实你看的index2。jsp的内容 3在服务器端重定向 4无法跳转到其他服务器上的页面

     

    RequestDispatcher类

    基本方法

    RequestDispatcher  rd = request.getRequestDispatcher("目标页面");

    rd.forward(response,request);

    使用 RequestDispatcher跳转与forward动作标记实现页面跳转的基本原理是一样的。

    RequestDispatcher与response重定向跳转的区别:1执行完所有代码再跳转到目标页 2跳转到目标页后URL不变 虽然URL显示的是index1.jsp 但其实你看的index2.jsp的内容 3在服务器端重定向 4无法跳转到其他服务器上的页面

    RequestDispatcher与forward动作标记跳转的区别:forward 1 forward动作标记之后的代码不再执行 立即跳转到目标页面 2指定目标页面时既可以用绝对路径也可以用相对路径

    RequestDispatcher跳转 1执行完所有代码 包括RequestDispatcher之后的所有代码再跳转到目标页面 2指定目标页面时只能用绝对路径

     

     Servlet可通过两种方式得到RequestDispatcher对象:调用ServletContext的getRequestDispatcher(String path)方法,path参数指定目标组件的路径。调用ServletRequest的getRequestDispatcher(String path)方法以上两种方式的区别在于,前者的path参数必须是绝对路径,而后者的path参数可以是绝对路径,也可以是相对路径。所谓绝对路径,就是指以符号"/"开头的路径,"/"表示当前web应用的URL入口。

    展开全文
  • uniapp 移动端 两种横竖屏切换方案

    千次阅读 2021-04-10 00:26:53
    1、打开uniapp的manifest.json 文件,找到左侧菜单最后一栏 “源码视图”,点进去,在最底部添加以下代码 ...2、在需要横屏的页面个生命周期设置你要的方向 // 页面加载完横屏正方向 onLoad()

    全局配置横竖屏

    1、在pages.json中添加配置:

    "globalStyle": {
    		"pageOrientation": "auto"
    	}
    

    此方法可以配置全部页面横竖屏切换()

    2、打开uniapp的manifest.json 文件,找到左侧菜单最后一栏 “源码视图”,点进去,在最底部添加以下代码

    "orientation" : [
    		//竖屏正方向
    		"portrait-primary",
    		//竖屏反方向
    		"portrait-secondary",
    		//横屏正方向
    		"landscape-primary",
    		//横屏反方向
    		"landscape-secondary",
    		//自然方向
    		"default"
    	]
    

    方案一、横竖屏自动切换的页面

    说明:这个方案是指定某个页面 可根据用户手机横/竖自动切换,不过需要写两套样式,横竖各一套, 在data定义一个判断横竖的值,再搭配uniapp 页面生命周期onResize监听窗口的变化,横时isLandScape初始值为true,竖为false,给最外层view根标签的类样式使用三元判断动态绑定,isLandScape的值为true用横屏类样式,false用竖屏类样式。

    1、我们先来看张效果图

    横竖屏自动切换

    2、需要横竖屏自动切换的页面写入

    	// 页面加载完给自然方向,它就能根据用户横竖自动切换
    	onLoad() {
    			// #ifdef APP-PLUS
    			plus.screen.lockOrientation('default');
    			// #endif
    		},
    	// 页面关闭时清除横屏正方向
    	onUnload() {
    			// #ifdef APP-PLUS
    			plus.screen.lockOrientation('portrait-primary');
    			// #endif
    		},
    

    3、其他不需要横屏的页面 例如:index.vue

    在两个生命周期中设置竖屏 并且关闭页面时清除

    	onLoad() {
    			// #ifdef APP-PLUS
    				 plus.screen.lockOrientation('portrait-primary'); 
    			// #endif
    		},
    	onUnload() {
    			// #ifdef APP-PLUS
    				  plus.screen.lockOrientation('portrait-primary'); 
    			// #endif
    		},
    

    特别说明:// #ifdef APP-PLUS 与 // #endif 是让代码在app生效,解决plus is not defined的报错

    4、核心逻辑代码

    ①、在data中初始一个判断横竖屏切换的值

    isLandScape: false // 是否横屏,默认为竖屏
    

    ②、在页面生命周期onResize中监听窗口的变化

    		onResize() {
    			let _this = this
    			uni.getSystemInfo({
    				success: function(res) {
    					if (res.windowWidth > res.windowHeight) {
    						// 横屏
    						_this.isLandScape = true
    					} else {
    						// 竖屏
    						_this.isLandScape = false
    					}
    				}
    			})
    		}
    

    5、在需要横竖屏切换的页面中用CSS预处理语言写两套样式(横/竖),我用的是scss

    // 竖屏   chart_portrait是父类包裹层,tbcls只是我的表格样式,你可以根据你的具体需求写相应的样式
    	.chart_portrait {
    		height: 36vh;
    		font-size: 2vh;
    		text-align: center;
    
    		.tbcls {
    			width: 97vw;
    		}
    	}
    
    	// 横屏
    	.chart_lanscape {
    		height: 82vh;
    		font-size: 2vw;
    		text-align: center;
    
    		.tbcls {
    			width: 98vw;
    		}
    
    	}
    

    6、用三元判断data中的isLandScape是否为false,是的话为竖屏,那么就用竖屏类样式,否则用横屏类样式

    <view :class="{'chart_portrait': !isLandScape, 'chart_lanscape': isLandScape}">
    </view>
    

    方案二 进入指定页面固定死横屏,出来自动切为竖屏

    说明:这个方案就相对简单很多,只需要进入切换为横屏,出来切竖屏,不过根标签view需要修改样式,我用的vw/vh,会自动适配高宽,也可以用百分比和rem,但是别用rpx,有坑

    1、还是先看效果图

    在这里插入图片描述

    2、js

      onLoad() {
        // 进入当前页面 自动切换成固定横屏
        // #ifdef APP-PLUS
        plus.screen.lockOrientation("landscape-primary");
        // #endif
      },
      onUnload() {
        // 退出当前页面时 自动切换成竖屏
        // #ifdef APP-PLUS
        plus.screen.lockOrientation("portrait-primary");
        // #endif
      },
    

    3、css

    // 横屏   
    .chart_lanscape {
      height: 82vh;
      font-size: 2vw;
      text-align: center;
    	// 这是我的表格类名  让其宽为视口宽的98%
      .tbcls {
        width: 98vw;
      }
    }
    

    两个方案的区别

    • 相同点:都是指定某个页面,两种退出当前页面都是自动切换为竖屏模式

    • 不同点:

      • 第一种:可根据用户手机横/竖自动切换,不过需要写两套样式,横竖各一套,

        在data定义一个判断横竖的值,再搭配uniapp 页面生命周期onResize监听窗口的变化,横时isLandScape初始值为true,竖为false,给最外层view根标签的类样式使用三元判断动态绑定,isLandScape的值为true用横屏类样式,false用竖屏类样式。

      • 第二种: 进入就固定死横屏,只需要写一套类样式。

    注意

    需要横/竖屏切换的页面尽量使用 百分比布局 和 px , rem,切换时有rpx坑

    结尾

    这两个效果图的源代码我已经发在码云上了,感兴趣的小伙伴可以去阅读或克隆到本地用真机调试感受一下横竖屏(不知如何真机调试,点我进入教程)。希望这篇文章能帮到你,感谢您的观看。😊

    参考文章链接:https://blog.csdn.net/weixin_50880237/article/details/109848509
    gitee源代码:https://gitee.com/lhs1303574731/uni-moblile-demo

    展开全文
  • /* 必须,规定元素的排列方向 */ flex-direction: column; /* 必须占满屏 */ height: 100%; /* 没有这个就不能滚动了 */ overflow: auto; } .detail-header { width: 100%; height: 100px; text-align: ...
  • 最常见的CSS页面布局

    千次阅读 2019-03-04 06:51:48
    本文主要介绍了实现页面布局的几方法。 以常见的左中右布局为例。 2. 代码实现 公共样式部分 html * { margin: 0; padding: 0; } .layout { margin-bottom: 20px; } .layout article { width: 100%; ...
  • 页面置换算法

    万次阅读 多人点赞 2019-05-27 19:21:28
    页面置换算法 实验目的 1.设计和实现最佳置换算法、先进先出置换算法、最近最久未使用置换算法、改进型Clock淘汰算法和页面缓冲算法PBA; 2.通过页面访问序列随机发生器实现对上述算法的测试及性能比较。 实验...
  • 前言 在Android中,我们常遇到的场景就是在...那么在Flutter的开发过程中,页面之间的数据传递也是必不可少的,又是怎么把一个页面的数据传递(共享)给另外一个页面,或者关闭当前页面并把当前页面的数据带给前一...
  • TCP/IP协议中,FTP标准命令TCP端口号为21,Port方式数据端口为20。FTP协议的任务是从一台计算机将文件传送到另一台计算机,它与这两台计算机所处的位置、联接的方式、甚至是是否使用相同的操作...FTP的传输有两种方...
  • TCP/IP协议中,FTP标准命令TCP端口号为21,Port方式数据端口为20。FTP协议的任务是从一台计算机将文件传送到另一台计算机,它...每操作系统使用上有某一些细微差别,但是每协议基本的命令结构是相同的。    
  • 这确实代表了两种不同的方向。 传统的通过 session 来记录用户认证信息的方式我们可以理解为这是一种有状态登录,而 JWT 则代表了一种无状态登录。可能有小伙伴对这个概念还不太熟悉,我这里就先来科普一下有状态...
  • word怎么文字竖排的两种方法

    千次阅读 2021-04-28 02:23:12
    步骤二:单击“文件”,选择“页面设置”。步骤三:打开“页面设置”对话框,点击“文档网格”,在文字排列中选择“垂直”项,然后点击“确定”即可。步骤四:默认会将页面调整成横向,如果想让...
  • Latex学习笔记 (3) 页面设置

    千次阅读 2019-03-25 09:22:24
    LaTex提供了 geometry 包用于页面的长度和布局,例如纸张大小,边距,脚注,标题,方向等。 文章目录介绍纸张的尺寸、方向和边距微调 LaTeX 页面尺寸 介绍 假设在a4paper中创建文档,文本宽度不应超过6英寸,高度...
  • 当前比较流行的页面布局方式

    万次阅读 2018-08-23 08:24:53
    1.固定宽度布局:当前各大网站的页面都是固定宽度布局。 优点:更好的适应当前市场上所有的设备:我们知道当前市面上主流的集中分辨率为以下几 800*600 1024*768 1280*1024等属于普通显示器所支持的分辨率 1280*...
  • 页面布局的方式有哪些?

    千次阅读 2020-07-08 13:18:26
    常见的页面布局方式有六:双飞翼、多栏、弹性、流式、瀑布流、响应式布局 (1)、双飞翼布局 经典三列布局,也叫做圣杯布局【Holy Grail of Layouts】是Kevin Cornell在2006年提出的一个布局模型概念,在国内最早...
  • 理论上来说,这个方式是最简单有效的,不过在这里我想说几个小志个人对显示隐藏页面元素的几方式看法: display 属性的方式; visibility 属性的方式; opacity 属性的方式; width & height 属性的改变
  • 安卓的屏幕方向和摄像头方向1. 前言2. Android 的屏幕方向2.1 什么是屏幕方向?2.2 为什么要获取屏幕方向?2.3 屏幕方向的获取与设置2.3.1 如何获取屏幕方向?2.3.2 如何设置屏幕方向?2. Android 的摄像头方向 1. ...
  • 小程序开发之页面布局

    万次阅读 2017-06-05 15:04:21
    网页布局(layout)是CSS的一...2009年,W3C提出了一新的方案—-Flex布局,可以简便、完整、响应式地实现各种页面布局。目前,它已经得到了所有浏览器的支持,这意味着,现在就能很安全地使用这项功能。Flex布局将成
  • css实现div水平,垂直居中(两种方法)

    千次阅读 2019-04-07 15:20:49
    说到这里,我们再去考虑垂直居中:页面在垂直方向上块级元素不一定只有一个,即 块级元素没有“默认占一列”这样的规定 ,因此即使把margin设置成auto,也不能自动计算出margin到底该是多少...... 了解了以上问题...
  • 在做 Flutter 开发的时候所有的页面以及页面上的元素都变成了 Widget ,创建一个页面或者视图直接 new 一个新的 widget 就可以,相关的参数我们可以直接通过构造函数直接传递。 我们做 Android 开发的人员都知道 ...
  • java 的个发展方向 javaee和Android

    千次阅读 2016-12-24 18:32:54
    两种技术的发展都是很不错的,关键是看自己更加喜欢和倾向于哪一种技术。前期的学习可以看一下视频教程,有个系统的了解和学习,千锋在扣丁学堂上有javaEE和Android开发的视频资料,有了一定的掌握之后,找一些专业...
  • 今天讨论一个话题,这是在考研的专业课考试中的一个问题:静态页面和动态页面的联系和区别 ,这考的我就很猝不及防 ,这个方面虽然以前有了解 ,但是理解得并不深刻,网安方向涉及到的东西太多了,慢慢学习吧~首先来...
  • 用户体验 | 页面阅读进度提示

    万次阅读 多人点赞 2020-12-21 11:13:42
    相信很多人都在项目中用过这么一个玩意 —— NProgress.js库,或者是其它类似的库,它们的作用很实用:页面加载进度提示。 顾名思义,就是在刚进入页面或刷新或...当然,目前第一场景比较多。 用JS达到实时进度提
  • 移动端Web页面适配方案(整理版)

    千次阅读 多人点赞 2020-05-15 14:17:50
    移动端web页面的开发,由于手机屏幕尺寸、分辨率不同,或者需要考虑横竖屏问题,为了使得web页面在不同移动设备上具有相适应的展示效果,需要在开发过程中使用合理的适配方案来解决这个问题。 早期网页设计采用静态...
  • Android 固定屏幕方向

    千次阅读 2017-01-05 13:35:54
    两种实现方法。 第一种,就是最简单的,在清单文件里面设置固定方向。具体在注册activity的时候加上一句固定屏幕的控制。 android:screenOrientation="portrait" 上面第一种方法很简单。但是一个一个的设置比较...
  • @Override public void onCreate(Bundle savedInstanceState, PersistableBundle persistentState) { super.onCreate(savedInstanceState, ...有上面的方法加载页面,程序不会报错,但是xml中的内容不能显示出
  • 两种方式处理ViewPager点击事件

    万次阅读 2017-03-21 18:43:28
    我总结了两种方式: 对 ViewPager 的每个页面设置点击事件 通过onTouch()方法处理 下面分别说明一下:(一)对 ViewPager 的每个页面设置点击事件比如这种广告轮询,如果想要点击进入,就要给详情页面传入一个id,...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 160,369
精华内容 64,147
关键字:

两种页面方向

友情链接: TMS320VC5509.rar