phpstorm使用php7.0开发开启xdebug调试功能

1.去下载xdebug.dll,下载的时候需要注意一下版本的问题,可以使用phpinfo();进行查看php的版本.

下载地址:https://xdebug.org/download.php

接着需要修改php.ini文件,我们开发估计都是在Windows底下吧,反正我的php.ini是没有xdebug的配置文件的,需要自己加上去,

[XDebug]
xdebug.profiler_append = 0
xdebug.profiler_enable = 1
xdebug.profiler_enable_trigger = 0
xdebug.profiler_output_dir =”D:\phpStudy\tmp\xdebug”
xdebug.trace_output_dir =”D:\phpStudy\tmp\xdebug”
xdebug.profiler_output_name = “cache.out.%t-%s”
xdebug.remote_enable = 1
xdebug.remote_handler = “dbgp”
xdebug.remote_host = “127.0.0.1”
zend_extension=”D:\phpStudy\php70n\ext\php_xdebug-2.5.4-7.0-vc14-nts.dll”

 

接着….,其实不用配置phpstorm了,直接右键debug,就会有效果了.

android开发AngularJS & WebView 混合应用遇到的问题

混合应用,可以理解为html5 + app,我个人认为这种开发方式很适合小型企业,中大型的一般都有完整的开发团队,所以他们开发原生的根本不是问题,但是为了给企业节约维护成本,比如公司的一个官网、门户网站、网店等等,都可以使用混合应用去实现,app的WebView框架比较简单,一般开发出来只需要维护html5网站就可以了,更新基本不涉及到app的源代码,这样公司只需要2个程序员基本可以搞定。

创建简单的混合应用,首先需要一个WebView控件:

mWebView.loadUrl(uri);
mWebView.setWebViewClient(new WebViewClient());//WebViewClientServer类可以拦截webview的一些错误,可以在这里面拦截后进行显示;

可能你需要对应用进行简单的配置:
WebSettings webSettings =  mWebView.getSettings();
webSettings.setJavaScriptEnabled(true); //允许javascript代码
webSettings.setCacheMode(WebSettings.LOAD_NO_CACHE);//关闭缓存
webSettings.setAllowFileAccess(true);//允许读取文件
webSettings.setAllowContentAccess(true);
webSettings.setSupportZoom(false);//禁止缩放
webSettings.setDomStorageEnabled(true);//开启本地数据库储存
webSettings.setDatabaseEnabled(true);
webSettings.setAppCachePath(getApplicationContext().getCacheDir().getAbsolutePath());
webSettings.setAppCacheEnabled(true);

又或许,你需要:
mWebChromeClientServer = WebChromeClientServer.getInstance(mContext,mToolbar,mRefresh);
mWebView.setWebChromeClient(mWebChromeClientServer);
WebChromeClient我把它直接改写了一个类,因为太多方法需要在里面实现了。
最主要的可能是onShowFileChooser这个方法,就是input type=file的时候需要用到的,但是只支持4.4.2以上的系统,我测试过4.4.2以下无效,网上说<4.4.2系统的是调用
openFileChooser这个方法,但是别找了,也无效,最后不得不放弃,但是可以使用js调java的接口,然后通过app进行图片上传,传送完毕后用WebView.loadUrl(Javascript function);方法把服务器返回的数据传输给网页端。
@Override
public boolean onShowFileChooser(WebView webView, ValueCallback<Uri[]> filePathCallback, FileChooserParams fileChooserParams) {
 if (mFilePathCallback != null) {
 mFilePathCallback.onReceiveValue(null);
 }
 mFilePathCallback = filePathCallback;

 startOnResult(FILECHOOSER_RESULTCODE5);

 return true;
}

/**
 * 由于android < 5.0 以下均无法使用onShowFileChooser的方法,所以,这里直接使用js调用
 * @param uploadMsg
 */
public void openFileChooser(ValueCallback<Uri> uploadMsg) {
 if (mUploadMessage != null) {
//mUploadMessage.onReceiveValue这个方法我实现了,把数据传递给网页端,这里的代码保持跟onShowFileChooser一样,为了让其他人方便理解
 mUploadMessage.onReceiveValue(null);
 }

 mUploadMessage = uploadMsg;
 startOnResult(FILECHOOSER_RESULTCODE4);
}

再智能一点,加入javacript对象调java对象:

mWebView.addJavascriptInterface(new WebJavaScroptInterface(mContext,mWebChromeClientServer,mWebView),"JsObject");
WebJavaScroptInterface是我写的一个java类,所有的方法,只要使用public的方法并且注释@JavascriptInterface,网页端是可以直接调用的,JsObject就是调取的对象名字。

如果上传文件到最后都用不了,可以试试在proguard-rules.pro文件中增加几行代码:
-keep class android.webkit.JavascriptInterface {*;}
-keepclassmembers class * extends android.webkit.WebChromeClient {
   public void openFileChooser(...);
}

-keepclassmembers class com.suisuilam.app.interfaces.WebJavaScroptInterface {
   public *;
}

 

H5设计一个简单的在线编辑器

上面的代码,就是编辑器的代码,把对象直接绑定到window对象中,方便调用;

接下来,就是实现了,首先我们需要一个DOM对象来绑定编辑器:

\<\div class=\"contentEditable\"\>\<\/div\>
自己新建了一个div,这里最好使用ID,本人是测试,所以懒;

然后调用编辑器对象的init方法,初始化编辑器;

editorUtils.init(document.getElementsByClassName(\”contentEditable\”)[0]);
init的方法,主要是设置编辑器的高度宽度,已经class样式,继承绑定对象的属性,我只写了一个class绑定,之后就把绑定对象隐藏起来;

然后大功告成了,现在可以编辑内容了,我们来看一下截图:

Android 常用 mimeType 表

type有下面的形式。

Text:用于标准化地表示的文本信息,文本消息可以是多种字符集和或者多种格式的;
Multipart:用于连接消息体的多个部分构成一个消息,这些部分可以是不同类型的数据;
Application:用于传输应用程序数据或者二进制数据;
Message:用于包装一个E-mail消息;
Image:用于传输静态图片数据;
Audio:用于传输音频或者音声数据;
Video:用于传输动态影像数据,可以是与音频编辑在一起的视频数据格式。

http session解释

Web服务器跟踪客户状态通常有四种方法:

1,建立含有跟踪数据的隐藏字段  type=hidden

2,重写包含额外参数的URL

3,使用持续的Cookie

4,使用Servlet API中的Session(会话)机制

Session概念:

Session用于跟踪客户的状态,Session是指在一段时间内,单个客户与WEB服务器一连串相关的交互过程。在一个Session中,客户可能多次请求访问同一个网页,也有可能请求访问各种不同的服务器资源。

Session运行机制:

当一个Session开始时,Servlet容器将创建一个HttpSession对象,在HttpSession对象中可以存放客户的状态信息(例如购物车)。

Servlet容器为HttpSession分配一个唯一标志符,称为SessionID。Servlet容器将SessionID作为Cookie保存在客户的浏览器中。

每次客户发送Http请求时,Servlet容器可以从HttpServletRequest对象中读取SessionID,然后根据SessionID找到对应的HttpSession对象,从而获取客户的状态信息。

Session的接口HttpSession:

getId()   返回session的ID

Invalidate()  让当前session失效,Servlet容器会释放HttpSession对象占用的资源

getAttribut()     setAttribute()

isNew()  判断是否是新创建的session,如果是返回true 否则返回false

setMaxInactiveInterval()  设置session的最大有效时间 单位为秒 如果设置为负数,表示不限制session处于不活动状态的最大有效时间,默认的设置时间为30分钟

Session的生命周期:

当客户第一次访问WEB应用中支持Session的某个页面时,就会开始一个新的session

接下来客户访问这个WEB应用中不同的网页时,都处于同一个session中

默认情况下,JSP页面是支持Session的,如果想不支持Session,可使用标签<%@ page session=”false”%>

在下列情况下,Session将结束生命周期,Servlet容器将释放HttpSession占用的资源:

1,客户浏览器关闭?

2,Session过期

3,服务器端调用了HttpSession的Invalidate()方法

如何做到在浏览器关闭时删除Session?

严格的讲,做不到这一点。可以做的努力的办法是在所有的客户端页面里使用javascript的方法window.onclose来监视浏览器的关闭动作,然后向服务器发送一个请求来删除Session;

但是对于浏览器崩溃或强行杀死进程这种非常规手段仍然无能为力。

实际上我们在项目中也不会这么做,而是让服务器在Session过期时将其删除。

14849505152118
 
Copyright © 2008-2021 lanxinbase.com Rights Reserved. | 粤ICP备14086738号-3 |