linux配置Apache中常用的设置详解

在apache中设置访问目录后进入的默认页面

找到apache的配置文件httpd.conf后找到

<IfModule dir_module> 
    DirectoryIndex  index.php index.html
</IfModule>

在其中添加index.php,且需要将index.php写在index.html前面

Apache Rewrite 开启和使用方法 在[Apache安装目录]/conf/httpd.conf中找到

#LoadModule rewrite_module modules/mod_rewrite.so

,去掉前面的注释符号#。如果没有这行,请添加。并确认apache安装目录下的modules文件夹中是否有 mod_rewrite.so这个文件。这样就启用了Mod Rewrite功能。

在[Apache安装目录]/conf/httpd.conf 中找到

Options FollowSymLinks
    AllowOverride None    
    Order deny,allow    
    Deny from all

把“AllowOverride None”改成“ AllowOverride All ”,这样所有的文件夹都支持.htaccess了.

Apache的Order Allow,Deny 详解

Allow和Deny可以用于apache的conf文件或者.htaccess文件中(配合Directory, Location, Files等),用来控制目录和文件的访问授权。 所以,最常用的是: Order Deny,Allow Allow from All

注意“Deny,Allow”中间只有一个逗号,也只能有一个逗号,有空格都会出错;单词的大小写不限。上面设定的含义是先设定“先检查禁止设定,没有禁止的全部允许”,而第二句没有Deny,也就是没有禁止访问的设定,直接就是允许所有访问了。这个主要是用来确保或者覆盖上级目录的设置,开放所有内容的访问权。

按照上面的解释,下面的设定是无条件禁止访问: Order Allow,Deny Deny from All

如果要禁止部分内容的访问,其他的全部开放: Order Deny,Allow Deny from ip1 ip2 或者 Order Allow,Deny Allow from all Deny from ip1 ip2

apache会按照order决定最后使用哪一条规则,比如上面的第二种方式,虽然第二句allow允许了访问,但由于在order中allow不是最后规则,因此还需要看有没有deny规则,于是到了第三句,符合ip1和ip2的访问就被禁止了。注意,order决定的“最后”规则非常重要,下面是两个错误的例子和改正方式:

Order Deny,Allow Allow from all Deny from domain.org 错误:想禁止来自domain.org的访问,但是deny不是最后规则,apache在处理到第二句allow的时候就已经匹配成功,根本就不会去看第三句。 解决方法:Order Allow,Deny,后面两句不动,即可。

Order Allow,Deny Allow from ip1 Deny from all 错误:想只允许来自ip1的访问,但是,虽然第二句中设定了allow规则,由于order中deny在后,所以会以第三句deny为准,而第三句的范围中又明显包含了ip1(all include ip1),所以所有的访问都被禁止了。 解决方法一:直接去掉第三句。 解决方法二: Order Deny,Allow Deny from all Allow from ip1

下面是测试过的例子:

Order deny,allow allow from all deny from 219.204.253.8 #全部都可以通行


Order deny,allow deny from 219.204.253.8 allow from all #全部都可以通行


Order allow,deny deny from 219.204.253.8 allow from all #只有219.204.253.8不能通行


Order allow,deny allow from all deny from 219.204.253.8 #只有219.204.253.8不能通行



Order allow,deny deny from all allow from 219.204.253.8 #全部都不能通行


Order allow,deny allow from 219.204.253.8 deny from all #全部都不能通行


Order deny,allow allow from 219.204.253.8 deny from all #只允许219.204.253.8通行


Order deny,allow deny from all allow from 219.204.253.8 #只允许219.204.253.8通行



Order deny,allow #全部都可以通行(默认的)


Order allow,deny #全部都不能通行(默认的)


Order allow,deny deny from all #全部都不能通行


Order deny,allow deny from all #全部都不能通行


对于上面两种情况,如果换成allow from all,则全部都可以通行!

Order deny,allow deny from 219.204.253.8 #只有219.204.253.8不能通行


Order allow,deny deny from 219.204.253.8 #全部都不能通行


Order allow,deny allow from 219.204.253.8 #只允许219.204.253.8通行


Order deny,allow allow from 219.204.253.8 #全部都可以通行



order deny,allow allow from 218.20.253.2 deny from 218.20 #代表拒绝218.20开头的IP,但允许218.20.253.2通过;而其它非218.20开头的IP也都允许通过。


order allow,deny allow from 218.20.253.2 deny from 218.20 #和上面的差不多,只是掉换的order语句中的allow、deny先后顺序,但最终结果表示全部都拒绝!

form:http://hi.baidu.com/enjoypain/blog/item/f48c7aecdba298d12f2e21ac.html 前段时间做了个Apache的HTTP代理服务器,其中的order allow,deny这部分弄的不太懂,于是上网找资料看,谁知道越看越糊涂,其中有些难以分辨对错甚至是误导。就像破解windows系统密码的一些文章那样,很多都是人云亦云的,并没有经过测试。废话少说,先把我经过测试后分析总结出来的结论show出来,相信这对大家的理解非常有帮助。

总则——

影响最终判断结果的只有两点:

  1. order语句中allow、deny的先后顺序;
  2. allow、deny语句中各自包含的范围。

温馨提醒——

  1. 修改完配置后要保存好并重启Apache服务,配置才能生效;
  2. 开头字母不分大小写;
  3. allow、deny语句不分先后顺序,谁先谁后不影响最终判断结果;但都会被判断到;
  4. order语句中,“allow,deny”之间“有且只有”一个逗号(英文格式的),而且先后顺序很重要;
  5. Apache有一条缺省规则,“order allow,deny”本身就默认了拒绝所有的意思,因为deny在allow的后面;同理,“order deny,allow”本身默认的是允许所有;当然,最终判断结果还要综合下面的allow、deny语句中各自所包含的范围;(也就是说order语句后面可以没有allow、deny语句)
  6. allow、deny语句中,第二个单词一定是“from”,否则Apache会因错而无法启动,
  7. “order allow,deny”代表先判断allow语句再判断deny语句,反之亦然。

上面说的都是要记住的,而下面说的是我独创的理解方法。如果有人看了而没有豁然开朗的感觉,那算是我的失败!

判断原则分4步走——

  1. 首先判断默认的;
  2. 然后判断逗号前的;
  3. 最后判断逗号后的;
  4. 最终按顺序叠加而得出判断结果。

上面三点我说的简单而形象,主要是为了便于记忆。暂时不理解不要紧,继续看下面详细的解说自然会明白。下面以一个普通例子来做解释——

order deny,allow

allow from 218.20.253.2

deny from 218.20

  1. 所谓“首先判断默认的”,就是判断“order deny,allow”这句,它默认是允许所有;
  2. 所谓“然后判断逗号前的”,因为在本例子中的order语句里面,deny在逗号的前面,所以现在轮到判断下面的deny语句了——“deny from 218.20”;
  3. 所谓“最后判断逗号后的”,因为在本例子中的order语句里面,allow在逗号的后面,所以最后轮到判断下面的allow语句了——“allow from 218.20.253.2”。
  4. 所谓“最终按顺序叠加而得出判断结果”,这是一个形象化了的说法,我把每一步判断都看作一个“不透明的图层”,然后一步步按顺序叠加上去,最终得出的“图像”就是判断结果。

用过作图软件的人应该都知道“图层”是怎么回事,我估计Apache关于order allow deny这方面的设计理念和photoshop等作图软件关于图层的设计理念是一样的。即“游戏规则”是一样的。

那么上面的例子就可以是这么一个步骤和图像——

  1. 先画一个白色的大圆,代表“order deny,allow”语句,默认意思是允许所有;
  2. 然后画一个小一点的黑色圆,代表“deny from 218.20”语句,意思是拒绝所有以218.20开头的IP,放进白色的大圆里面;
  3. 最后再画一个白色的圆,代表“allow from 218.20.253.2”语句,意思是允许218.20.253.2通过,放在黑色圆的上面。
  4. 到此为止,我们已经可以看到一个结果了,白色大圆上面有一个黑色圆,黑色圆上面还有一个白色圆。最后,我们所能看到的黑色部分就是拒绝通行的,剩下的白色部分都是允许通行的。判断的结果就是这么简单形象!

如果不懂的用作图软件,我们再来个非常贴近生活的比喻——

把上面的例子改动一点点,以便更好的理解:

order deny,allow

allow from 218.20.253.2

deny from 219.30

  1. 首先拿一张A4白纸,代表第order语句,意思是允许全部;
  2. 然后拿一张黑色纸剪一个圆,放在A4纸里面的某个位置上,代表deny语句,意思是拒绝所有以219.30开头的IP;
  3. 最后拿白纸再剪一个圆,放在黑色圆的旁边,代表allow语句,意思是允许218.20.253.2通过;注意,这个例子不是放进黑色圆里面了,因为deny和allow语句不再有相互包含的关系了。
  4. A4纸上面有一个黑色圆和一个白色圆,结果自然很明显了。不过白色的A4纸上再放一个白色的圆,显然是多余的了,因为大家都是白色的,都代表允许,所以就重复了,可以去掉白色的圆而不会影响判断结果。

如果看到这里还没明白,那一定是我还有什么没说清楚的。那么请好好分析我所做过的测试例子,将在最后列出来。

在这里再啰嗦一下,allow、deny语句后面跟的参数有多种形式,有不同的表达方式,我在网上看到的做法是deny from IP1 IP2 IP3或allow from domain.com等。其它的表达方式大家再找别的资料看吧。我想说的是另一种表达方式:

order deny,allow

allow from IP1 IP2

allow from domain.info

allow from 219.20.55.0/24

deny from all

我没具体验证过这是否对,不过这样是可以正常启动Apache服务的,按道理应该是正确的表达方式。哈哈,像我这样的入门者只能这样了,还希望大家多多指教!

下面是测试过的例子:

Order deny,allow allow from all deny from 219.204.253.8 #全部都可以通行


Order deny,allow deny from 219.204.253.8 allow from all #全部都可以通行


Order allow,deny deny from 219.204.253.8 allow from all #只有219.204.253.8不能通行


Order allow,deny allow from all deny from 219.204.253.8 #只有219.204.253.8不能通行



Order allow,deny deny from all allow from 219.204.253.8 #全部都不能通行


Order allow,deny allow from 219.204.253.8 deny from all #全部都不能通行


Order deny,allow allow from 219.204.253.8 deny from all #只允许219.204.253.8通行


Order deny,allow deny from all allow from 219.204.253.8 #只允许219.204.253.8通行



Order deny,allow #全部都可以通行(默认的)


Order allow,deny #全部都不能通行(默认的)


Order allow,deny deny from all #全部都不能通行


Order deny,allow deny from all #全部都不能通行


对于上面两种情况,如果换成allow from all,则全部都可以通行!

Order deny,allow deny from 219.204.253.8 #只有219.204.253.8不能通行


Order allow,deny deny from 219.204.253.8 #全部都不能通行


Order allow,deny allow from 219.204.253.8 #只允许219.204.253.8通行


Order deny,allow allow from 219.204.253.8 #全部都可以通行



order deny,allow allow from 218.20.253.2 deny from 218.20 #代表拒绝218.20开头的IP,但允许218.20.253.2通过;而其它非218.20开头的IP也都允许通过。


order allow,deny allow from 218.20.253.2 deny from 218.20 #和上面的差不多,只是掉换的order语句中的allow、deny先后顺序,但最终结果表示全部都拒绝!

Android 沉浸式状态栏的三种实现方式

沉浸式状态栏

Google从android kitkat(Android 4.4)开始,给我们开发者提供了一套能透明的系统ui样式给状态栏和导航栏,这样的话就不用向以前那样每天面对着黑乎乎的上下两条黑栏了,还可以调成跟Activity一样的样式,形成一个完整的主题,和IOS7.0以上系统一样了。

首先看下效果

三种方式实现沉浸式状态栏

首先看下第一种方式

  • 系统的方式沉浸式状态栏实现
  • 步奏一
//当系统版本为4.4或者4.4以上时可以使用沉浸式状态栏
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
            //透明状态栏
            getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
            //透明导航栏
       getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);
}
  • 步奏二
       布局加入:
        android:fitsSystemWindows="true"
        android:clipToPadding="true"

我们看下activity和布局文件
FirstActivity.java:

 /**
     * 沉浸式状态栏
     */
    private void initState() {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
            //透明状态栏
           getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
            //透明导航栏
            getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);
        }
    }

activity_first.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <TextView
        android:fitsSystemWindows="true"
        android:clipToPadding="true"
        android:layout_width="match_parent"
        android:layout_height="140dp"
        android:textSize="24dp"
        android:background="@color/mask_tags_1"
        android:text="你好,沉浸式状态栏"/>

</LinearLayout>

接着看下第二种方式

实现思路,添加隐藏布局,然后我们动态的计算状态栏的高度,然后把这个高度设置成这个隐藏的布局的高度,便可以实现
在这里我们通过反射来获取状态栏的高度

/**
     * 通过反射的方式获取状态栏高度
     *
     * @return
     */
    private int getStatusBarHeight() {
        try {
            Class<?> c = Class.forName("com.android.internal.R$dimen");
            Object obj = c.newInstance();
            Field field = c.getField("status_bar_height");
            int x = Integer.parseInt(field.get(obj).toString());
            return getResources().getDimensionPixelSize(x);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return 0;
    }

来看下SecondActivity和布局文件吧
SecondActivity.java

package com.example.translucentbarstest;

import android.os.Build;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.view.WindowManager;
import android.widget.LinearLayout;

import java.lang.reflect.Field;

/**
 * Created by 若兰 on 2016/1/22.
 * 一个懂得了编程乐趣的小白,希望自己
 * 能够在这个道路上走的很远,也希望自己学习到的
 * 知识可以帮助更多的人,分享就是学习的一种乐趣
 * QQ:1069584784
 * csdn:http://blog.csdn.net/wuyinlei
 */

public class SecondActivity extends AppCompatActivity {
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_two);
        initState();
    }

    /**
     * 动态的设置状态栏  实现沉浸式状态栏
     *
     */
    private void initState() {

        //当系统版本为4.4或者4.4以上时可以使用沉浸式状态栏
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
            //透明状态栏
            getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
            //透明导航栏
            getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);
            //
            LinearLayout linear_bar = (LinearLayout) findViewById(R.id.ll_bar);
            linear_bar.setVisibility(View.VISIBLE);
            //获取到状态栏的高度
            int statusHeight = getStatusBarHeight();
            //动态的设置隐藏布局的高度
            LinearLayout.LayoutParams params = (LinearLayout.LayoutParams) linear_bar.getLayoutParams();
            params.height = statusHeight;
            linear_bar.setLayoutParams(params);
        }
    }

    /**
     * 通过反射的方式获取状态栏高度
     *
     * @return
     */
    private int getStatusBarHeight() {
        try {
            Class<?> c = Class.forName("com.android.internal.R$dimen");
            Object obj = c.newInstance();
            Field field = c.getField("status_bar_height");
            int x = Integer.parseInt(field.get(obj).toString());
            return getResources().getDimensionPixelSize(x);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return 0;
    }
}

activity_second.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context="com.example.translucentbarstest.TwoActivity">

    <!--这个是隐藏的布局,然后通过动态的设置高度达到效果-->
    <LinearLayout
        android:id="@+id/ll_bar"
        android:layout_width="fill_parent"
        android:layout_height="1dp"
        android:orientation="vertical"
        android:background="#e7abff"
        android:visibility="gone">
    </LinearLayout>
    <TextView
        android:fitsSystemWindows="true"
        android:clipToPadding="true"
        android:layout_width="match_parent"
        android:layout_height="140dp"
        android:background="@color/mask_tags_3"
        android:text="你好,沉浸式状态栏"/>

</LinearLayout>

接下来看下第三种

这个是用的github上的第三方库

步奏一
              android:fitsSystemWindows="true"
              android:clipToPadding="true
步奏二
               SystemBarTintManager tintManager = new SystemBarTintManager(this);
            // 激活状态栏
            tintManager.setStatusBarTintEnabled(true);
            // enable navigation bar tint 激活导航栏
            tintManager.setNavigationBarTintEnabled(true);
            //设置系统栏设置颜色
            //tintManager.setTintColor(R.color.red);
            //给状态栏设置颜色
            tintManager.setStatusBarTintResource(R.color.mask_tags_1);
            //Apply the specified drawable or color resource to the system navigation bar.
            //给导航栏设置资源
            tintManager.setNavigationBarTintResource(R.color.mask_tags_1);

来看下代码吧
ThreeActivity.java

package com.example.translucentbarstest;

import android.os.Build;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.WindowManager;

import com.readystatesoftware.systembartint.SystemBarTintManager;

/**
 * Created by 若兰 on 2016/1/22.
 * 一个懂得了编程乐趣的小白,希望自己
 * 能够在这个道路上走的很远,也希望自己学习到的
 * 知识可以帮助更多的人,分享就是学习的一种乐趣
 * QQ:1069584784
 * csdn:http://blog.csdn.net/wuyinlei
 */

public class ThreeActivity extends AppCompatActivity{
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_three);
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
            //透明状态栏
            getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
            //透明导航栏
            getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);
            SystemBarTintManager tintManager = new SystemBarTintManager(this);
            // 激活状态栏
            tintManager.setStatusBarTintEnabled(true);
            // enable navigation bar tint 激活导航栏
            tintManager.setNavigationBarTintEnabled(true);
            //设置系统栏设置颜色
            //tintManager.setTintColor(R.color.red);
            //给状态栏设置颜色
            tintManager.setStatusBarTintResource(R.color.mask_tags_1);
            //Apply the specified drawable or color resource to the system navigation bar.
            //给导航栏设置资源
            tintManager.setNavigationBarTintResource(R.color.mask_tags_1);
        }
    }
}

activity_three.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#ffff"
    android:orientation="vertical"
    tools:context="com.example.translucentbarstest.ThirdActivity">

    <TextView
        android:layout_width="match_parent"
        android:layout_height="140dp"
        android:background="@color/mask_tags_5"
        android:clipToPadding="true"
        android:fitsSystemWindows="true"
        android:text="你好,沉浸式状态栏"
        android:textSize="24dp"/>
</LinearLayout>

好了,原来自己以为沉浸式状态栏听着好厉害(有可能自己原先不知道),但是真正自己去做了,去了解了,也没有那么难、那么神秘了,我想这也是自己成长了一些。
继续努力。这个是上传的github上的demohttps://github.com/wuyinlei/-,如有疑问,欢迎交流

作者:若兰明月
链接:http://www.jianshu.com/p/be2b7be418d7
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

美文美图 空间日志 空间美文 美女壁纸 手机壁纸

美文美图APP是一个以美文,美图,散文,爱情,日志,心情,人生,个性签名为主题的美文欣赏,散文阅读,手机图片浏览APP,这里主要有一些伤感爱情美文,情感故事,心情随笔日记,经典散文,精美短篇文章,唯美句子语录,唯美图片,小清新图片,经典笑话以及人生哲理感悟之类的经典文章!

主要功能有:

1、美文频道,阅读经典美文;

2、个性签名(个性昵称,个性签名,空间日志,好友印象,说说大全),发空间说说不用愁;

3、美图浏览,保存图片,设置手机壁纸

下载地址:http://android.myapp.com/myapp/detail.htm?apkName=com.cqmvxiaobai.www

 

 

 

再见再也不能相见

离别的初秋树叶还没有泛黄,娇嫩的叶子迎着风仿佛跳着忧伤离别的舞蹈,眼前的山一座一座的相互交叉就像是一个个未知数,正如人生那坎坷荆棘无法预料,头脑总是一幕幕的画面一帧接一帧的闪动着,有儿时的唠叨,少年的鼓励,成年的牵挂。操碎了心,付出一生伤了身,这下远离我们只能梦中相见,来世再聚。

slidingmenu在Android studio 26.0.0下编译出现Caused by: java.lang.IllegalStateException: SlidingMenu mode must be LEFT, RIGHT, or LEFT_RIGHT

slidingmenu在Android studio 26.0.0下编译出现Caused by: java.lang.IllegalStateException: SlidingMenu mode must be LEFT, RIGHT, or LEFT_RIGHT

代码如下:

mSlidingMenu = new SlidingMenu(this); // 设置滑动方向,左滑菜单 mSlidingMenu.setMode(SlidingMenu.LEFT); // 设置监听开始滑动的触碰范围 mSlidingMenu.setTouchModeAbove(SlidingMenu.TOUCHMODEFULLSCREEN);// TOUCHMODEMARGIN // 设置边缘阴影的宽度,通过dimens资源文件中的ID设置 mSlidingMenu.setShadowWidthRes(R.dimen.shadowwidth); // 设置边缘阴影的颜色/图片,通过资源文件ID设置 mSlidingMenu.setShadowDrawable(R.drawable.listshadow); // 设置menu全部打开后,主界面剩余部分与屏幕边界的距离,通过dimens资源文件ID设置 mSlidingMenu.setBehindOffsetRes(R.dimen.slidingmenuoffset); // menu.setBehindWidth(width – (imagewidth + 20));// 设置SlidingMenu菜单的宽度 // 设置是否淡入淡出 mSlidingMenu.setFadeEnabled(true); // 设置淡入淡出的值,只在setFadeEnabled设置为true时有效 mSlidingMenu.setFadeDegree(0.35f); // 将menu绑定到Activity,同时设置绑定类型 mSlidingMenu.attachToActivity(this, SlidingMenu.SLIDINGWINDOW); mSlidingMenu.setTouchModeAbove(SlidingMenu.TOUCHMODENONE); // set the Above View setContentView(R.layout.contentframe); mSlidingMenu.setMenu(R.layout.menu_frame);

错误地方,翻开源码: TypedArray ta = context.obtainStyledAttributes(attrs, styleable.SlidingMenu); int mode = ta.getInt(0, 0); this.setMode(mode); 这里mode 没有读取到mode 这里返回为-1

在设置模型的时候 不是 0 1 2 抛出了 该异常 public void setMode(int mode) { if(mode != 0 && mode != 1 && mode != 2) { throw new IllegalStateException(“SlidingMenu mode must be LEFT, RIGHT, or LEFT_RIGHT”); } else { this.mViewBehind.setMode(mode); } } 原因:

应该是当前this 读取不到 styleable.SlidingMenu, 应该属于 this.getApplicationContext()下面的初始化 改成下面结果编译成功了。

修改:

mSlidingMenu = new SlidingMenu(this.getApplicationContext())

thinkphp 控制器中动态切换数据库 sqlite

tp文档:http://doc.thinkphp.cn/manual/switch_database.html

参照:

M("User","think_","mysql://root:123456@localhost:3306/test")->query("查询SQL");

比较直接的方式,我这里是要切换到sqlite数据库

代码如下:

$pageSize = 20;
 $page = 1;
 $li = M("article","","sqlite://root:123456@localhost:3306/".ROOT_PATH.'/sqlite数据库名称')
        ->query("select * from article where big_id={$big_id} and small_id={$small_id} order by id desc limit ".($page-1)*$pageSize.",".$pageSize );
        //echo "select * from article where big_id={$big_id} and small_id={$small_id} order by id desc limit ".($page-1)*$pageSize.",".$pageSize;
        $data['state'] = 1;
        $data['msg'] = "获取成功";
        $data['data'] = array(
            
            'pageSize' => $pageSize,
            'page' => $page,
            'datas' => $li
            
            );

        exit( json_encode( $data ) );

root:123456@localhost:3306/ 是默认加的 链接需要这样的格式 不加这段无法成功,按照这样的格式加,没有密码也没有关系 随意输入

ROOT_PATH 是sqlite数据库根目录

这样就可以访问数据库了。

{
state: 1,
msg: "获取成功",
data: {
pageSize: 30,
page: 0,
datas: [
{
id: "5382",
title: " 君顏爲誰笑ヽ 紅顏爲誰笑ヽ",
url: "",
content: null,
img: null,
big_id: "0",
small_id: "0"
},
{
id: "5381",
title: " 牽手望月亮 拉手看星星",
url: "",
content: null,
img: null,
big_id: "0",
small_id: "0"
}]
}
}

注:文档中还有其他切换方式,可以去试试。

JazzyViewPager 嵌套photoview 异常问题处理:java.lang.IllegalArgumentException: pointerIndex out of range at android.view.MotionEvent.nativeGetAxisValue(Native Method)

做图片展示用到JazzyViewPager插件和photoview插件,至于插件代码就不贴了,可以去github上面搜索,后期有空整理一个结合的demo。

前者是滑动带有各种动画切换效果

后者是手势放大缩小图片效果

当快速放大图片和缩小图片会偶尔出现异常,错误信息:

java.lang.IllegalArgumentException: pointerIndex out of range at android.view.MotionEvent.nativeGetAxisValue(Native Method)

原因分析: 因为调用了requestDisallowInterceptTouchEvent,所以会导致父类的view多点触摸有些情况下会出现数组溢出的情况.

网上的解决多法多为catch这个异常, 这种做法是可以的. 但是我个人是喜欢优雅并且效率高并且易扩展的做法.

因为我的是父的viewPager冲突了, 当requestDisallowInterceptTouchEvent(true) 时, 简单的理解就是父view无法接收到触摸事件, 多点触摸时就会造成崩溃, 所以即使requestDisallowInterceptTouchEvent(true) 时, 父view也让它去接收事件.

在JazzyViewPager自定义插件中找到 onInterceptTouchEvent

替换这个重写方法和追加2个重写方法代码如下:

@Override
    public boolean onInterceptTouchEvent(MotionEvent arg0) {
        super.onInterceptTouchEvent(arg0);
        return mEnabled ? super.onInterceptTouchEvent(arg0) : false;
        //return  super.onInterceptTouchEvent(arg0);
    }
    private boolean mIsDisallowIntercept = false;
    @Override
    public void requestDisallowInterceptTouchEvent(boolean disallowIntercept) {
        // keep the info about if the innerViews do
        // requestDisallowInterceptTouchEvent
        mIsDisallowIntercept = disallowIntercept;
        super.requestDisallowInterceptTouchEvent(disallowIntercept);
    }
    @Override
    public boolean dispatchTouchEvent(MotionEvent ev) {
        // the incorrect array size will only happen in the multi-touch
        // scenario.
        if (ev.getPointerCount() > 1 && mIsDisallowIntercept) {
            requestDisallowInterceptTouchEvent(false);
            boolean handled = super.dispatchTouchEvent(ev);
            requestDisallowInterceptTouchEvent(true);
            return handled;
        } else {
            return super.dispatchTouchEvent(ev);
        }
    }

在测试问题解决,希望对你有帮助

深入理解Java中的final关键字

Java中的final关键字非常重要,它可以应用于类、方法以及变量。这篇文章中我将带你看看什么是final关键字?将变量,方法和类声明为final代表了什么?使用final的好处是什么?最后也有一些使用final关键字的实例。final经常和static一起使用来声明常量,你也会看到final是如何改善应用性能的。

final关键字的含义?

final在Java中是一个保留的关键字,可以声明成员变量、方法、类以及本地变量。一旦你将引用声明作final,你将不能改变这个引用了,编译器会检查代码,如果你试图将变量再次初始化的话,编译器会报编译错误。

什么是final变量?

凡是对成员变量或者本地变量(在方法中的或者代码块中的变量称为本地变量)声明为final的都叫作final变量。final变量经常和static关键字一起使用,作为常量。下面是final变量的例子:

public static final String LOAN = "loan";
LOAN = new String("loan") //invalid compilation error

final变量是只读的。

什么是final方法?

final也可以声明方法。方法前面加上final关键字,代表这个方法不可以被子类的方法重写。如果你认为一个方法的功能已经足够完整了,子类中不需要改变的话,你可以声明此方法为final。final方法比非final方法要快,因为在编译的时候已经静态绑定了,不需要在运行时再动态绑定。下面是final方法的例子:

class PersonalLoan{
    public final String getName(){
        return "personal loan";
    }
}
class CheapPersonalLoan extends PersonalLoan{
    @Override
    public final String getName(){
        return "cheap personal loan"; //compilation error: overridden method is final
    }
}

什么是final类?

使用final来修饰的类叫作final类。final类通常功能是完整的,它们不能被继承。Java中有许多类是final的,譬如String, Interger以及其他包装类。下面是final类的实例:

final class PersonalLoan{
 
    }
 
    class CheapPersonalLoan extends PersonalLoan{  //compilation error: cannot inherit from final class
 
}

final关键字的好处

下面总结了一些使用final关键字的好处

final关键字提高了性能。JVM和Java应用都会缓存final变量。 final变量可以安全的在多线程环境下进行共享,而不需要额外的同步开销。 使用final关键字,JVM会对方法、变量及类进行优化。 不可变类

创建不可变类要使用final关键字。不可变类是指它的对象一旦被创建了就不能被更改了。String是不可变类的代表。不可变类有很多好处,譬如它们的对象是只读的,可以在多线程环境下安全的共享,不用额外的同步开销等等。

相关阅读:为什么String是不可变的以及如何写一个不可变类。

关于final的重要知识点

final关键字可以用于成员变量、本地变量、方法以及类。 final成员变量必须在声明的时候初始化或者在构造器中初始化,否则就会报编译错误。 你不能够对final变量再次赋值。 本地变量必须在声明时赋值。 在匿名类中所有变量都必须是final变量。 final方法不能被重写。 final类不能被继承。 final关键字不同于finally关键字,后者用于异常处理。 final关键字容易与finalize()方法搞混,后者是在Object类中定义的方法,是在垃圾回收之前被JVM调用的方法。 接口中声明的所有变量本身是final的。 final和abstract这两个关键字是反相关的,final类就不可能是abstract的。 final方法在编译阶段绑定,称为静态绑定(static binding)。 没有在声明时初始化final变量的称为空白final变量(blank final variable),它们必须在构造器中初始化,或者调用this()初始化。不这么做的话,编译器会报错“final变量(变量名)需要进行初始化”。 将类、方法、变量声明为final能够提高性能,这样JVM就有机会进行估计,然后优化。 按照Java代码惯例,final变量就是常量,而且通常常量名要大写: 1 private final int COUNT = 10; 对于集合对象声明为final指的是引用不能被更改,但是你可以向其中增加,删除或者改变内容。譬如:

private final List Loans = new ArrayList();
list.add(“home loan”);  //valid
list.add("personal loan"); //valid
loans = new Vector();  //not valid

我们已经知道final变量、final方法以及final类是什么了。必要的时候使用final,能写出更快、更好的代码的。

原文链接: Javarevisited 翻译: ImportNew.com – 唐小娟 译文链接: http://www.importnew.com/7553.html