热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Android开发WebView/WebViewClient/WebChromeClient简介API详述【一】

老早之前就想总结下Webview相关的知识点了,因为互联网大潮中,很多APP都会使用到Webview,像那些不计其数的电商APPÿ

老早之前就想总结下Webview相关的知识点了,因为互联网大潮中,很多APP都会使用到Webview,像那些不计其数的电商APP,无一例外的使用Webview;或者一些非电商APP中的像广告页面,注册协议页面都会用到;最后因为一些事情拖到现在才做,感觉事情真不能拖,越往后推越做不了,罪过罪过。

怎么总结Webview呢

1.简单介绍

2.WebView/WebViewClient/WebChromeClient api介绍

3.简单使用

4.JS调用Android本地

5.Android调用JS方法

6.缓存处理及性能优化

7.webview使用注意点

 

webview系列文章

Android之WebView/WebViewClient/WebChromeClient简介 API详述 【一】

Android之WebView/WebViewClient/WebChromeClient 使用样例 【二】

Android之WebView Android调用JS方法 JS调用Android方法 【三】

Android之WebView 缓存处理 性能优化【四】

Android之WebView 使用注意点 JS注入漏洞问题 内存优化【五】

 

1.WebView

这个类位于android.webkit包下面,继承android.widget.absolutelayout,首先说明这是一个控件;再看看官网怎么介绍它的

A View that displays web pages. This class is the basis upon which you can roll your own web browser or simply display some online content within your Activity. It uses the WebKit rendering engine to display web pages and includes methods to navigate forward and backward through a history, zoom in and out, perform text searches and more.

Note that, in order for your Activity to access the Internet and load web pages in a WebView, you must add the INTERNET permissions to your Android Manifest file.

还有好多介绍,大家可以去官网链接查看,很详细。

大概翻译下:

就是一个显示网页的视图,可以把这个类当作一个浏览器,或者在activity里简单的显示一些网页内容,Webview使用Webkit渲染引擎来显示网页,并支持前后历史导航,放大缩小,文本搜索等方法。

记住,在avtivity访问网络和使用webview加载网页一定要在Manifest里添加网络权限

 

2.api

    2.1 Webview内部方法

    2.2 Webview子类:WebSetting,WebViewClient,WebChromeClient

        2.1.1 方法

        addJavascriptInterface(Object object, String name)

        将Java对象映射到JS对象,第一个参数是java对象,第二个参数是对象名

        removeJavascriptInterface(String name)

        移除添加的js对象,下次加载或刷新时生效

        canGoBack() 

        webview是否能回退到上一页

        canGoBackOrForward(int steps)

        webview是否可以回退或者前进给定数量的步骤,大于0表示前进,小于0表示后退

        canGoForward()

        webview是否可以前进

        clearCache(boolean includeDiskFiles)

        清除网页缓存

        clearClientCertPreferences(Runnable onCleared)

        清除客户端证书偏好

        clearFormData()

        从当前获取焦点的表单域中移除自动填充弹出框

        clearHistory()

        清除webview访问记录

        clearSslPreferences()

        清除ssl偏好

        computeScroll()

        由父类调用,以请求子view在必要时更新mScrollX和mScrollY的值

        copyBackForwardList()

        获取webview的前进后退页面List

        documentHasImages(Message response)

        查询文档中是否有图片 response.arg为1表示包含,反之不包含

        evaluateJavascript(String script, ValueCallback<String> resultCallback)

        从JS中获取值&#xff0c;通过第二个参数返回&#xff0c;必须在UI线程调用&#xff0c;也必须在UI线程回调

        getProgress()

        获取页面加载进度

        getSettings()

        获取WebSettings类

        getTitle()

        获取当前页面title

        getUrl()

        获取当前页面URL

        getOriginalUrl()

        获取当前页面原始URL&#xff0c;可能重定向后URL不同

        goBack()

        回退

        goForward()

        前进

        goBackOrForward(int steps)

        大于0 前进指定步骤页数&#xff0c;小于0 后退指定步骤页数

        loadData(String data, String mimeType, String encoding)

        加载内容 &#xff0c;第一个参数是要加载的内容&#xff0c;比如一段html内容&#xff1b;第二个参数是数据类型&#xff0c;比如&#39;text/html&#39;

        第三个参数是内容的编码格式

        loadUrl(String url)

        加载url指定的网页

        loadUrl(String url, Map<StringString> additionalHttpHeaders)

        加载携带http headers的url指定的网页

        reload()

        重新加载网页

        postUrl(String url, byte[] postData)

        使用post方法加载指定网页

        pageDown(boolean bottom)

        将此Webview的内容向下滚动页面大小的一半

        pageUp(boolean top)

        将此Webview的内容向上滚动页面大小的一半

         setBackgroundColor(int color)

         设置背景色

         setDownloadListener(DownloadListener listener)

         当渲染引擎无法处理内容时&#xff0c;应当注册这个接口来处理

         setFindListener(WebView.FindListener listener)

         设置网页查找结果的回调

          findAllAsync(String find)

         移步执行查找网页内包含的字符串并高亮显示&#xff0c;查找结果会回调

        findNext(boolean forward)

        查找下一个字符串

        clearMatches()

         清除网页查找的高亮匹配字符串

         setInitialScale(int scaleInPercent)

         设置webview的缩放进度

         setOverScrollMode(int mode)

         设置视图的滑动模式

         OVER_SCROLL_ALWAYS (default) 

        OVER_SCROLL_IF_CONTENT_SCROLLS 只允许在视图内容大于屏幕时进行滚动

        OVER_SCROLL_NEVER 仅当视图能够滚动时才能设置视图滚动模式

        stopLoading()

         停止加载

        zoomIn()

        放大Webview

        zoomOut()

        缩小webview

        zoomBy(float zoomFactor)

        按给定值进行缩放

        setWebChromeClient(WebChromeClient client)

        设置chrome处理程序&#xff0c;用于处理JS对话框&#xff0c;网站图标&#xff0c;标题和进度

         setWebViewClient(WebViewClient client)

        设置处理各种通知和请求的类

        2.2.1 子类

            2.2.1.1 WebSettings

            这个类跟webview处于同一个包下&#xff0c;是一个抽象类&#xff0c;看看官网介绍

           Manages settings state for a WebView. When a WebView is first created, it obtains a set of  

           default settings. These default settings will be returned from any getter call. A WebSettings 

           object obtained from  WebView.getSettings() is tied to the life of the WebView. If a 

           WebView has been destroyed,any method call on WebSettings will throw an IllegalStateException.

            大概意思是

            管理webview的设置状态&#xff0c;当首次创建Webview时&#xff0c;会获取一个默认的设置&#xff0c;这个默认的设置可以通过

            任何getter调用返回&#xff0c;从Webview.getSettings()方法返回的WebSettings与Webview的生命周期一致

            &#xff0c;如果webview销毁了&#xff0c;任何通过webSettings调用的方法将会抛出异常。

            既然是管理设置的&#xff0c;那看看有哪些设置方法吧

            setAllowContentAccess(boolean allow)

            在webview中启用或禁用内容URL访问&#xff0c;默认启用&#xff0c;可以通过Content provider去访问资源

            setAllowFileAccess(boolean allow)

            在webview中禁用或启用文件访问&#xff0c;默认启用&#xff0c;这里针对的是手机内存的文件&#xff0c;assets和res目录下的不

            受影响

            setAllowFileAccessFromFileURLs(boolean flag)

            设置是否允许加载的js去访问本地文件&#xff0c;默认false

            setAllowUniversalAccessFromFileURLs(boolean flag)

            设置是否允许加载的js去访问其它的源&#xff08;包括http&#xff0c;https等&#xff09;&#xff0c;默认false

            setAppCacheEnabled(boolean flag)

            设置是否启用缓存&#xff0c;不过需要先设置好缓存路径&#xff0c;默认false

            setAppCachePath(String appCachePath)

            设置缓存路径

             setBlockNetworkImage(boolean flag)

            设置是否阻止加载网络图片&#xff0c;默认false

            setBlockNetworkLoads(boolean flag)

            设置是否阻止加载所有网络资源&#xff0c;默认false&#xff0c;当设置是的时候&#xff0c;也会让上面方法也是是

            setBuiltInZoomControls(boolean enabled)

            设置webview是否应使用其内置的缩放机制

            setCacheMode(int mode)

            设置缓存模式 

            LOAD_DEFAULT                          默认行为 根据cache-control决定是否从网路获取数据

            LOAD_CACHE_ELSE_NETWORK, 优先使用缓存&#xff0c;无论是否过期或者no-cache&#xff0c;都使用缓存

            LOAD_NO_CACHE                       不使用缓存&#xff0c;只加载网络

            LOAD_CACHE_ONLY                   不使用网络&#xff0c;只使用缓存

            setCursiveFontFamily(String font)

            设置Webview字体库草书字体&#xff0c;默认值 cursive

            setDefaultFontSize(int size)

            设置文字大小&#xff0c;默认16 范围是1-72

            setDefaultFixedFontSize(int size)

            设置默认等宽字体大小 默认16

            setDefaultTextEncodingName(String encoding)

            设置文本编码格式&#xff0c;默认"UTF-8"

            setDisplayZoomControls(boolean enabled)

            设置webview在使用内置缩放控件的时候是否显示屏幕缩放控件&#xff0c;默认显示

            setDomStorageEnabled(boolean flag)

            设置是否启用DOM存储 默认false

            setFantasyFontFamily(String font)

            设置webview字体库幻想体 默认fanstasy

            setFixedFontFamily(String font)

            设置webview字体库等宽字体 默认monspace

            setGeolocationEnabled(boolean flag)

            设置是否启用定位 默认true&#xff0c;

            请注意&#xff0c;为了WebView中的页面可以使用Geolocation API&#xff0c;必须满足以下要求&#xff1a;

             1.应用程序必须具有访问设备位置的权限&#xff0c;请参阅ACCESS_COARSE_LOCATION

             和ACCESS_FINE_LOCATION 

             2.应用程序必须提供

             onGeolocationPermissionsShowPrompt&#xff08;String&#xff0c;GeolocationPermissions.Callback&#xff09;

             回调的实现&#xff0c;以接收页面通过Javascript Geolocation API请求访问位置的通知。

            setJavascriptCanOpenWindowsAutomatically(boolean flag)

            设置js是否可以通过window.open方法打开窗口&#xff0c;默认false

            setJavascriptEnabled(boolean flag)

            设置是否支持JS&#xff0c;默认false

            setLoadWithOverviewMode(boolean overview)

            设置webview是否能以概貌模式加载页面&#xff0c;即当页面内容宽度大于webview控件的宽度时&#xff0c;默认false

            setLoadsImagesAutomatically(boolean flag)

            设置是否自动加载图片 默认true

            setMediaPlaybackRequiresUserGesture(boolean require)

            设置webview是否需要用户手势才能播放媒体&#xff0c;默认true

            setMinimumFontSize(int size)

            设置最小文字尺寸 默认8

            setMinimumLogicalFontSize(int size)

            设置文字最小逻辑尺寸 默认8

            setMixedContentMode(int mode)

            配置WebView在安全来源尝试从不安全来源加载资源时的行为。 默认情况下&#xff0c;

            定位到KITKAT或更低版本的应用默认为MIXED_CONTENT_ALWAYS_ALLOW。 

            定位LOLLIPOP的应用默认为MIXED_CONTENT_NEVER_ALLOW。 

            WebView的首选和最安全的操作模式是MIXED_CONTENT_NEVER_ALLOW&#xff0c;

            强烈建议不要使用MIXED_CONTENT_ALWAYS_ALLOW。

            setOffscreenPreRaster(boolean enabled)

            打开此功能可避免在屏幕上对屏幕外的webview进行动画操作时出现阴影&#xff0c;因为这种屏幕外webview

            会使用更多内存&#xff0c;默认false&#xff0c;平时开发中尽量注意webview大小不要大于屏幕大小。

            setSansSerifFontFamily(String font)

            设置webview字体库无衬线体&#xff0c;默认 sans-serif

            setSaveFormData(boolean save)

            设置webview是否保存表单数据 默认true

            setSerifFontFamily(String font)

            设置webview字体库无衬线体&#xff0c;默认 sans-serif

            setStandardFontFamily(String font)

            设置webview字体库标准字体&#xff0c;默认 sans-serif

            setSupportMultipleWindows(boolean support)

            设置是否支持多窗口 默认false

            setSupportZoom(boolean support)

            设置webview是否支持使用屏幕缩放控件和手势进行缩放&#xff0c;默认true&#xff0c;此设置不影响zoomin和zoomout

            方法的使用

            setTextZoom(int textZoom)

            设置页面的文本缩放百分比&#xff0c;默认100

            setUseWideViewPort(boolean use)

            WebView是否支持HTML的“viewport”标签或者使用wide viewport。设置值为true时&#xff0c;布局的宽度总是

            与WebView控件上的设备无关像素&#xff08;device-dependent pixels&#xff09;宽度一致。当值为true且页面包含

            viewport标记&#xff0c;将使用标签指定的宽度。如果页面不包含标签或者标签没有提供宽度&#xff0c;那就使用wide viewport

            setUserAgentString(String ua)

            设置WebView的用户代理字符串。如果字符串为null或者empty&#xff0c;将使用系统默认值。

            注意从KITKAT版本开始&#xff0c;加载网页时改变用户代理会让WebView再次初始化加载。

            supportMultipleWindows()

            获取webview是否支持多窗口

            supportZoom()

            获取webview是否支持缩放

            2.2.1.2 WebviewClient

            这个类也是跟webview属于同一个包下&#xff0c;主要用来处理各种通知和请求的&#xff0c;再看看它的api

            doUpdateVisitedHistory(WebView view, String url, boolean isReload)

            通知应用程序更新其 存储访问的url的数据库&#xff0c;该方法在网页加载过程中只会被调用一次

            网页前进后退不会回调这个方法

            onFormResubmission(WebView view, Message dontResend, Message resend)

            是否重新提交表单&#xff0c;默认不重发

            onLoadResource(WebView view, String url)

            通知webview将加载由给定的url指定的资源

            onPageCommitVisible(WebView view, String url)

            这个回调在23版本添加&#xff0c;仅用于主框架的导航

            通知应用程序导航到之前页面时&#xff0c;其遗留的webview内容不再被绘制

            这个回调可以用来决定哪些web视图可见内容能被安全地回收&#xff0c;以确保不显示陈旧的内容它最早被调用

            以此保证WebView.onDraw不会绘制任何之前页面的内容&#xff0c;随后绘制背景色或需要加载的新内容。

            onPageFinished(WebView view, String url)

            通知应用程序页面已完成加载&#xff0c;这种方法仅适用与主框架。

            调用该方法时&#xff0c;渲染图片可能尚未更新&#xff0c;要获取新图片的通知

            请使用onNewPicture方法

            onPageStarted(WebView view, String url, Bitmap favicon)

            通知应用程序页面开始绘制 &#xff0c;可以加loading动画

            onReceivedClientCertRequest(WebView view, ClientCertRequest request)

            此方法添加于API21&#xff0c;在UI线程被调用

            处理SSL客户端证书请求&#xff0c;必要的话可以显示一个UI来提供KEY。

            有三种响应方式&#xff1a;proceed&#xff08;&#xff09;/ cancel&#xff08;&#xff09;/ ignore&#xff08;&#xff09;&#xff0c;默认行为是取消请求

            如果调用proceed&#xff08;&#xff09;或cancel&#xff08;&#xff09;&#xff0c;Webview将在内存中保存响应结果并对相应的“host&#xff1a;port”

            不会再次调用onReceivedClientCertRequest

            多数情况下&#xff0c;可通过KeyChain.choosePrivateKeyAlias启动一个活动供用户选择合适的私钥

            onReceivedError(WebView view, int errorCode, String description, String failingUrl)

            通知应用程序加载资源报错&#xff0c;通常是无法链接到服务器

            onReceivedHttpAuthRequest(WebView view, HttpAuthHandler handler, String host, 

        String realm)

            通知应用程序webview接收到了一个HTTP认证请求&#xff0c;默认是取消请求

            onReceivedHttpError(WebView view, WebResourceRequest request, WebResourceResponse 

        errorResponse)

            通知应用程序在加载资源时从服务器收到HTTP错误&#xff0c;错误的状态码大于等于400&#xff0c;任何资源的错误

            都会回调这个方法。

            onReceivedLoginRequest(WebView view, String realm, String account, String args)

            通知应用程序已处理用户自动登陆的请求

            onReceivedSslError(WebView view, SslErrorHandler handler, SslError error)

            通知应用程序加载资源时发生SSL错误&#xff0c;必须调用handler.cancle或者handler.proceed方法

            来取消请求或者继续请求&#xff1b;该决定会用于以后来响应SSL错误&#xff0c;默认是取消请求

            onScaleChanged(WebView view, float oldScale, float newScale)

            通知应用程序页面缩放比例已更改

            onUnhandledKeyEvent(WebView view, KeyEvent event)

            处理未被webview消费的按键事件&#xff0c;除非是系统按键或者shouldoverridekeyevent返回true

            此方法在按键事件分发时被异步调用

            shouldOverrideKeyEvent(WebView view, KeyEvent event)

            给应用一个机会处理按键事件&#xff0c;如果返回true&#xff0c;webview不处理该事件&#xff0c;否则webview

            会一直处理&#xff0c;默认返回false

            shouldOverrideUrlLoading(WebView view, WebResourceRequest request)

            拦截页面加载&#xff0c;返回true表示app拦截并处理了该url&#xff0c;否则返回false由webview处理

            不处理post请求&#xff0c;在api24以后被添加&#xff0c;可拦截处理子frame的非http请求

            shouldOverrideUrlLoading(WebView view, String url)

             同上&#xff0c;不过api24以后被废弃

            2.2.1.3 WebChromeClient 

            它与webview处于同一个包下&#xff0c;辅助webview用于处理JS对话框&#xff0c; 网站图标&#xff0c;标题和进度

            getDefaultVideoPoster()

           

            如果没有指定poster属性&#xff0c;可以通过这个方法提供一个默认的海报图

            getVideoLoadingProgressView()

            当全屏的视频正在缓冲时&#xff0c;此方法返回一个占位图

            getVisitedHistory(ValueCallback<String[]> callback)

            获取所有访问过的历史项目的列表&#xff0c;用于链接着色

            onCloseWindow(WebView window)

            通知应用关闭窗口

            onConsoleMessage(ConsoleMessage consoleMessage)

            接收js控制台消息

            onCreateWindow(WebView view, boolean isDialog, 

        boolean isUserGesture, Message resultMsg)

            请求应用程序创建新窗口

            onGeolocationPermissionsHidePrompt()

            通知应用程序&#xff0c;用先前对onGeolocationPermissionsShowPrompt&#xff08;&#xff09;的调用进行的地理位置权限

            请求已被取消。

            onGeolocationPermissionsShowPrompt(String origin, GeolocationPermissions.Callback 

        callback)

            通知应用程序指定来源的web内容正在尝试使用Geolocation api&#xff0c;请求定位&#xff0c;

            但目前没有为该来源设置权限状态&#xff0c;非安全的http请求会被默认拒绝

            onHideCustomView()

            通知应用程序当前页面已退出全屏模式&#xff0c;但应用程序必须隐藏自定义view

            onShowCustomView(View view, WebChromeClient.CustomViewCallback callback)

            通知应用程序当前页面进入了全屏模式&#xff0c;此时应用必须显示一个包含网页内容的自定义view

            onJsAlert(WebView view, String url, String message, JsResult result)

            告诉客户端显示一个JS警告对话框

            onJsBeforeUnload(WebView view, String url, String message, JsResult result)

            显示一个对话框让用户选择是否离开当前页面

            onJsConfirm(WebView view, String url, String message, JsResult result)

            告诉客户端显示一个确认对话框

            onJsPrompt(WebView view, String url, String message, String defaultValue, 

        JsPromptResult result)

            显示一个prompt对话框

            onPermissionRequest(PermissionRequest request)

            通知应用程序web内容正在请求访问指定资源的权限&#xff0c;该权限未被授权或取消

            onPermissionRequestCanceled(PermissionRequest request)

            通知应用程序权限申请被取消&#xff0c;隐藏相关UI

            onProgressChanged(WebView view, int newProgress)

            接受当前页面的加载进度

            onReceivedIcon(WebView view, Bitmap icon)

            通知应用程序接受当前页面新图标

            onReceivedTitle(WebView view, String title)

            获取当前文档标题

           onShowFileChooser(WebView,ValueCallback<Uri[]> , WebChromeClient.FileChooserParams)

            为 显示文件选择器&#xff0c;返回false使用默认处理

 

 

静待更新

后续篇章请前往Android之WebView/WebViewClient/WebChromeClient使用解析及Android与JS相互调用 【二】

 


推荐阅读
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • Android开发实现的计时器功能示例
    本文分享了Android开发实现的计时器功能示例,包括效果图、布局和按钮的使用。通过使用Chronometer控件,可以实现计时器功能。该示例适用于Android平台,供开发者参考。 ... [详细]
  • Spring框架《一》简介
    Spring框架《一》1.Spring概述1.1简介1.2Spring模板二、IOC容器和Bean1.IOC和DI简介2.三种通过类型获取bean3.给bean的属性赋值3.1依赖 ... [详细]
  • Sleuth+zipkin链路追踪SpringCloud微服务的解决方案
    在庞大的微服务群中,随着业务扩展,微服务个数增多,系统调用链路复杂化。Sleuth+zipkin是解决SpringCloud微服务定位和追踪的方案。通过TraceId将不同服务调用的日志串联起来,实现请求链路跟踪。通过Feign调用和Request传递TraceId,将整个调用链路的服务日志归组合并,提供定位和追踪的功能。 ... [详细]
  • 详解Android  自定义UI模板设计_由浅入深
    学习安卓已有一些日子,前段时间整理了不少笔记,但是发现笔记不变分享与携带。今天开始整理博客,全当是与大家分享交流与自身学习理解的过程吧。结合最近在做的一个新闻类app及学习中的问题,一点一点整理一下, ... [详细]
  • 注:根据Qt小神童的视频教程改编概论:利用最新的Qt5.1.1在windows下开发的一个小的时钟程序,有指针与表盘。1.Qtforwindows开发环境最新的Qt已经集 ... [详细]
  • 第一步:PyQt4Designer设计程序界面该部分设计类同VisvalStudio内的设计,改下各部件的objectName!设计 ... [详细]
  • [翻译]PyCairo指南裁剪和masking
    裁剪和masking在PyCairo指南的这个部分,我么将讨论裁剪和masking操作。裁剪裁剪就是将图形的绘制限定在一定的区域内。这样做有一些效率的因素࿰ ... [详细]
  • 一、Struts2是一个基于MVC设计模式的Web应用框架在MVC设计模式中,Struts2作为控制器(Controller)来建立模型与视图的数据交互。Struts2优点1、实现 ... [详细]
  • 在一对一直播源码使用过程中,有时会出现软键盘切换闪屏问题,就是当切换表情的时候屏幕会跳动,因此要对一对一直播源码表情面板无缝切换进行优化。 ... [详细]
  • 使用Flutternewintegration_test进行示例集成测试?回答首先在dev下的p ... [详细]
  • fileuploadJS@sectionscripts{<scriptsrc~Contentjsfileuploadvendorjquery.ui.widget.js ... [详细]
  • 人脸检测 pyqt+opencv+dlib
    一、实验目标绘制PyQT界面,调用摄像头显示人脸信息。在界面中,用户通过点击不同的按键可以实现多种功能:打开和关闭摄像头, ... [详细]
  • 当我在doWork方法中运行代码时,通过单击button1,进度条按预期工作.但是,当我从其他方法(即btn2,btn3)将列表传递给doWork方法时,进度条在启动后会跳转到10 ... [详细]
  • java unhandled,Eclipse编辑java文件报Unhandled event loop exception错误的解
    本人Eclipse版本是”eclipse-jee-kepler-SR2-win32-x86_64“昨天因为换电脑,所以重装了一下软件,装好eclipse ... [详细]
author-avatar
baby小明君
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有