java研究网 http://uijava.com 请用一段语句通顺的话来描述您的网站定位,字数不超过200字。 Thu, 24 Aug 2017 09:53:01 +0000 zh-CN hourly 1 https://wordpress.org/?v=4.7.5 联系我们 Wed,20 Jun 2018 05:45:17 +0800 uijava.com

新疆乌鲁木齐市

bilim8@126.com

]]>
关于我们 Wed,20 Jun 2018 05:45:17 +0800

uijava 软件开发平台:

web

软件

移动应用 等资料



]]>
最易懂的Webview使用详解 Wed,20 Jun 2018 05:45:17 +0800 前言 现在很多App里都内置了Web网页(Hyprid App),比如说很多电商平台,淘宝、京东、聚划算等等,如下图 京东首页 那么这种该如何实现呢?其实这是Android里一个叫WebView的组件实现的。今天我将全面介绍WebView的常用用法。 目录 文章目录 1. 简介 WebView是一个基于webkit引擎、展现web页面的控件。 Android的Webview在低版本和高版本采用了不同的webkit版本内核,4.4后直接使用了Chrome。 2. 作用 显示和渲染Web页面 直接使用html文件(网络上或本地assets中)作布局 可和JavaScript交互调用 WebView控件功能强大,除了具有一般View的属性和设置外,还可以对url请求、页面加载、渲染、页面交互进行强大的处理。 3. 使用介绍 一般来说Webview可单独使用,可联合其子类一起使用,所以接下来,我会介绍: Webview自身的常见方法; Webview的最常用的子类 (WebSettings类、WebViewClient类、WebChromeClient类) Android和Js的交互 3.1 Webview常用方法 3.1.1 加载url 加载方式根据资源分为三种 //方式1. 加载一个网页: webView.loadUrl("http://www.google.com/"); //方式2:加载apk包中的html页面 webView.loadUrl("file:///android_asset/test.html"); //方式3:加载手机本地的html页面 webView.loadUrl("content://com.android.htmlfileprovider/sdcard/test.html"); // 方式4: 加载 HTML 页面的一小段内容 WebView.loadData(String data, String mimeType, String encoding) // 参数说明: // 参数1:需要截取展示的内容 // 内容里不能出现 ’#’, ‘%’, ‘\’ , ‘?’ 这四个字符,若出现了需用 %23, %25, %27, %3f 对应来替代,否则会出现异常 // 参数2:展示内容的类型 // 参数3:字节码 3.1.1 WebView的状态 //激活WebView为活跃状态,能正常执行网页的响应 webView.onResume() ; //当页面被失去焦点被切换到后台不可见状态,需要执行onPause //通过onPause动作通知内核暂停所有的动作,比如DOM的解析、plugin的执行、JavaScript执行。 webView.onPause(); //当应用程序(存在webview)被切换到后台时,这个方法不仅仅针对当前的webview而是全局的全应用程序的webview //它会暂停所有webview的layout,parsing,javascripttimer。降低CPU功耗。 webView.pauseTimers() //恢复pauseTimers状态 webView.resumeTimers(); //销毁Webview //在关闭了Activity时,如果Webview的音乐或视频,还在播放。就必须销毁Webview //但是注意:webview调用destory时,webview仍绑定在Activity上 //这是由于自定义webview构建时传入了该Activity的context对象 //因此需要先从父容器中移除webview,然后再销毁webview: rootLayout.removeView(webView); webView.destroy(); 3.1.2 关于前进 / 后退网页 //是否可以后退 Webview.canGoBack() //后退网页 Webview.goBack() //是否可以前进 Webview.canGoForward() //前进网页 Webview.goForward() //以当前的index为起始点前进或者后退到历史记录中指定的steps //如果steps为负数则为后退,正数则为前进 Webview.goBackOrForward(intsteps) 常见用法:Back键控制网页后退 问题:在不做任何处理前提下 ,浏览网页时点击系统的“Back”键,整个 Browser 会调用 finish()而结束自身 目标:点击返回后,是网页回退而不是推出浏览器 解决方案:在当前Activity中处理并消费掉该 Back 事件 public boolean onKeyDown(int keyCode, KeyEvent event) { if ((keyCode == KEYCODE_BACK) && mWebView.canGoBack()) { mWebView.goBack(); return true; } return super.onKeyDown(keyCode, event); } 3.1.3 清除缓存数据 //清除网页访问留下的缓存 //由于内核缓存是全局的因此这个方法不仅仅针对webview而是针对整个应用程序. Webview.clearCache(true); //清除当前webview访问的历史记录 //只会webview访问历史记录里的所有记录除了当前访问记录 Webview.clearHistory(); //这个api仅仅清除自动完成填充的表单数据,并不会清除WebView存储到本地的数据 Webview.clearFormData(); 3.2 常用类 3.2.1 WebSettings类 作用:对WebView进行配置和管理 配置步骤 & 常见方法: 配置步骤1:添加访问网络权限(AndroidManifest.xml) 这是前提!这是前提!这是前提! <uses-permission android:name="android.permission.INTERNET"/> 配置步骤2:生成一个WebView组件(有两种方式) //方式1:直接在在Activity中生成 WebView webView = new WebView(this) //方法2:在Activity的layout文件里添加webview控件: WebView webview = (WebView) findViewById(R.id.webView1); 配置步骤3:进行配置-利用WebSettings子类(常见方法) //声明WebSettings子类 WebSettings webSettings = webView.getSettings(); //如果访问的页面中要与Javascript交互,则webview必须设置支持Javascript webSettings.setJavaScriptEnabled(true); // 若加载的 html 里有JS 在执行动画等操作,会造成资源浪费(CPU、电量) // 在 onStop 和 onResume 里分别把 setJavaScriptEnabled() 给设置成 false 和 true 即可 //支持插件 webSettings.setPluginsEnabled(true); //设置自适应屏幕,两者合用 webSettings.setUseWideViewPort(true); //将图片调整到适合webview的大小 webSettings.setLoadWithOverviewMode(true); // 缩放至屏幕的大小 //缩放操作 webSettings.setSupportZoom(true); //支持缩放,默认为true。是下面那个的前提。 webSettings.setBuiltInZoomControls(true); //设置内置的缩放控件。若为false,则该WebView不可缩放 webSettings.setDisplayZoomControls(false); //隐藏原生的缩放控件 //其他细节操作 webSettings.setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK); //关闭webview中缓存 webSettings.setAllowFileAccess(true); //设置可以访问文件 webSettings.setJavaScriptCanOpenWindowsAutomatically(true); //支持通过JS打开新窗口 webSettings.setLoadsImagesAutomatically(true); //支持自动加载图片 webSettings.setDefaultTextEncodingName("utf-8");//设置编码格式 常见用法:设置WebView缓存 当加载 html 页面时,WebView会在/data/data/包名目录下生成 database 与 cache 两个文件夹 请求的 URL记录保存在 WebViewCache.db,而 URL的内容是保存在 WebViewCache 文件夹下 是否启用缓存: //优先使用缓存: WebView.getSettings().setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK); //缓存模式如下: //LOAD_CACHE_ONLY: 不使用网络,只读取本地缓存数据 //LOAD_DEFAULT: (默认)根据cache-control决定是否从网络上取数据。 //LOAD_NO_CACHE: 不使用缓存,只从网络获取数据. //LOAD_CACHE_ELSE_NETWORK,只要本地有,无论是否过期,或者no-cache,都使用缓存中的数据。 //不使用缓存: WebView.getSettings().setCacheMode(WebSettings.LOAD_NO_CACHE); 结合使用(离线加载) if (NetStatusUtil.isConnected(getApplicationContext())) { webSettings.setCacheMode(WebSettings.LOAD_DEFAULT);//根据cache-control决定是否从网络上取数据。 } else { webSettings.setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK);//没网,则从本地获取,即离线加载 } webSettings.setDomStorageEnabled(true); // 开启 DOM storage API 功能 webSettings.setDatabaseEnabled(true); //开启 database storage API 功能 webSettings.setAppCacheEnabled(true);//开启 Application Caches 功能 String cacheDirPath = getFilesDir().getAbsolutePath() + APP_CACAHE_DIRNAME; webSettings.setAppCachePath(cacheDirPath); //设置 Application Caches 缓存目录 注意: 每个 Application 只调用一次 WebSettings.setAppCachePath(),WebSettings.setAppCacheMaxSize() 3.2.2 WebViewClient类 作用:处理各种通知 & 请求事件 常见方法: 常见方法1:shouldOverrideUrlLoading() 作用:打开网页时不调用系统浏览器, 而是在本WebView中显示;在网页上的所有加载都经过这个方法,这个函数我们可以做很多操作。 //步骤1. 定义Webview组件 Webview webview = (WebView) findViewById(R.id.webView1); //步骤2. 选择加载方式 //方式1. 加载一个网页: webView.loadUrl("http://www.google.com/"); //方式2:加载apk包中的html页面 webView.loadUrl("file:///android_asset/test.html"); //方式3:加载手机本地的html页面 webView.loadUrl("content://com.android.htmlfileprovider/sdcard/test.html"); //步骤3. 复写shouldOverrideUrlLoading()方法,使得打开网页时不调用系统浏览器, 而是在本WebView中显示 webView.setWebViewClient(new WebViewClient(){ @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { view.loadUrl(url); return true; } }); 常见方法2:onPageStarted() 作用:开始载入页面调用的,我们可以设定一个loading的页面,告诉用户程序在等待网络响应。 webView.setWebViewClient(new WebViewClient(){ @Override public void onPageStarted(WebView view, String url, Bitmap favicon) { //设定加载开始的操作 } }); 常见方法3:onPageFinished() 作用:在页面加载结束时调用。我们可以关闭loading 条,切换程序动作。 webView.setWebViewClient(new WebViewClient(){ @Override public void onPageFinished(WebView view, String url) { //设定加载结束的操作 } }); 常见方法4:onLoadResource() 作用:在加载页面资源时会调用,每一个资源(比如图片)的加载都会调用一次。 webView.setWebViewClient(new WebViewClient(){ @Override public boolean onLoadResource(WebView view, String url) { //设定加载资源的操作 } }); 常见方法5:onReceivedError() 作用:加载页面的服务器出现错误时(如404)调用。 App里面使用webview控件的时候遇到了诸如404这类的错误的时候,若也显示浏览器里面的那种错误提示页面就显得很丑陋了,那么这个时候我们的app就需要加载一个本地的错误提示页面,即webview如何加载一个本地的页面 //步骤1:写一个html文件(error_handle.html),用于出错时展示给用户看的提示页面 //步骤2:将该html文件放置到代码根目录的assets文件夹下 //步骤3:复写WebViewClient的onRecievedError方法 //该方法传回了错误码,根据错误类型可以进行不同的错误分类处理 webView.setWebViewClient(new WebViewClient(){ @Override public void onReceivedError(WebView view, int errorCode, String description, String failingUrl){ switch(errorCode) { case HttpStatus.SC_NOT_FOUND: view.loadUrl("file:///android_assets/error_handle.html"); break; } } }); 常见方法6:onReceivedSslError() 作用:处理https请求 webView默认是不处理https请求的,页面显示空白,需要进行如下设置: webView.setWebViewClient(new WebViewClient() { @Override public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) { handler.proceed(); //表示等待证书响应 // handler.cancel(); //表示挂起连接,为默认方式 // handler.handleMessage(null); //可做其他处理 } }); 3.2.3 WebChromeClient类 作用:辅助 WebView 处理 Javascript 的对话框,网站图标,网站标题等等。 常见使用: 常见方法1: onProgressChanged() 作用:获得网页的加载进度并显示 webview.setWebChromeClient(new WebChromeClient(){ @Override public void onProgressChanged(WebView view, int newProgress) { if (newProgress < 100) { String progress = newProgress + "%"; progress.setText(progress); } else { } }); 常见方法2: onReceivedTitle() 作用:获取Web页中的标题 每个网页的页面都有一个标题,比如www.baidu.com这个页面的标题即“百度一下,你就知道”,那么如何知道当前webview正在加载的页面的title并进行设置呢? webview.setWebChromeClient(new WebChromeClient(){ @Override public void onReceivedTitle(WebView view, String title) { titleview.setText(title); } 常见方法3: onJsAlert() 作用:支持javascript的警告框 一般情况下在 Android 中为 Toast,在文本里面加入\n就可以换行 webview.setWebChromeClient(new WebChromeClient() { @Override public boolean onJsAlert(WebView view, String url, String message, final JsResult result) { new AlertDialog.Builder(MainActivity.this) .setTitle("JsAlert") .setMessage(message) .setPositiveButton("OK", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { result.confirm(); } }) .setCancelable(false) .show(); return true; } 常见方法4: onJsConfirm() 作用:支持javascript的确认框 webview.setWebChromeClient(new WebChromeClient() { @Override public boolean onJsConfirm(WebView view, String url, String message, final JsResult result) { new AlertDialog.Builder(MainActivity.this) .setTitle("JsConfirm") .setMessage(message) .setPositiveButton("OK", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { result.confirm(); } }) .setNegativeButton("Cancel", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { result.cancel(); } }) .setCancelable(false) .show(); // 返回布尔值:判断点击时确认还是取消 // true表示点击了确认;false表示点击了取消; return true; } 常见方法5: onJsPrompt() 作用:支持javascript输入框 点击确认返回输入框中的值,点击取消返回 null。 webview.setWebChromeClient(new WebChromeClient() { @Override public boolean onJsPrompt(WebView view, String url, String message, String defaultValue, final JsPromptResult result) { final EditText et = new EditText(MainActivity.this); et.setText(defaultValue); new AlertDialog.Builder(MainActivity.this) .setTitle(message) .setView(et) .setPositiveButton("OK", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { result.confirm(et.getText().toString()); } }) .setNegativeButton("Cancel", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { result.cancel(); } }) .setCancelable(false) .show(); return true; } 3.3 WebView与JavaScript的交互 具体请看我写的文章:最全面 & 最详细的 Android WebView与JS的交互方式 汇总 3.4 注意事项:如何避免WebView内存泄露? 3.4.1 不在xml中定义 Webview ,而是在需要的时候在Activity中创建,并且Context使用 getApplicationgContext() LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT); mWebView = new WebView(getApplicationContext()); mWebView.setLayoutParams(params); mLayout.addView(mWebView); 3.4.2 在 Activity 销毁( WebView )的时候,先让 WebView 加载null内容,然后移除 WebView,再销毁 WebView,最后置空。 @Override protected void onDestroy() { if (mWebView != null) { mWebView.loadDataWithBaseURL(null, "", "text/html", "utf-8", null); mWebView.clearHistory(); ((ViewGroup) mWebView.getParent()).removeView(mWebView); mWebView.destroy(); mWebView = null; } super.onDestroy(); } 4. 实例 目标:实现显示“www.baidu.com”、获取其标题、提示加载开始 & 结束和获取加载进度 具体实现: 步骤1:添加访问网络权限 这是前提!这是前提!这是前提! AndroidManifest.xml <uses-permission android:name="android.permission.INTERNET"/> 步骤2:主布局 activity_main.xml <?xml version="1.0" encoding="utf-8"?> <RelativeLayout 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:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context="com.example.carson_ho.webview_demo.MainActivity"> <!-- 获取网站的标题--> <TextView android:id="@+id/title" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text=""/> <!--开始加载提示--> <TextView android:id="@+id/text_beginLoading" android:layout_below="@+id/title" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text=""/> <!--获取加载进度--> <TextView android:layout_below="@+id/text_beginLoading" android:id="@+id/text_Loading" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text=""/> <!--结束加载提示--> <TextView android:layout_below="@+id/text_Loading" android:id="@+id/text_endLoading" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text=""/> <!--显示网页区域--> <WebView android:id="@+id/webView1" android:layout_below="@+id/text_endLoading" android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_marginTop="10dp" /> </RelativeLayout> 步骤3:根据需要实现的功能从而使用相应的子类及其方法(注释很清楚了) MainActivity.java package com.example.carson_ho.webview_demo; import android.graphics.Bitmap; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.view.KeyEvent; import android.view.ViewGroup; import android.webkit.WebChromeClient; import android.webkit.WebSettings; import android.webkit.WebView; import android.webkit.WebViewClient; import android.widget.TextView; public class MainActivity extends AppCompatActivity { WebView mWebview; WebSettings mWebSettings; TextView beginLoading,endLoading,loading,mtitle; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mWebview = (WebView) findViewById(R.id.webView1); beginLoading = (TextView) findViewById(R.id.text_beginLoading); endLoading = (TextView) findViewById(R.id.text_endLoading); loading = (TextView) findViewById(R.id.text_Loading); mtitle = (TextView) findViewById(R.id.title); mWebSettings = mWebview.getSettings(); mWebview.loadUrl("http://www.baidu.com/"); //设置不用系统浏览器打开,直接显示在当前Webview mWebview.setWebViewClient(new WebViewClient() { @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { view.loadUrl(url); return true; } }); //设置WebChromeClient类 mWebview.setWebChromeClient(new WebChromeClient() { //获取网站标题 @Override public void onReceivedTitle(WebView view, String title) { System.out.println("标题在这里"); mtitle.setText(title); } //获取加载进度 @Override public void onProgressChanged(WebView view, int newProgress) { if (newProgress < 100) { String progress = newProgress + "%"; loading.setText(progress); } else if (newProgress == 100) { String progress = newProgress + "%"; loading.setText(progress); } } }); //设置WebViewClient类 mWebview.setWebViewClient(new WebViewClient() { //设置加载前的函数 @Override public void onPageStarted(WebView view, String url, Bitmap favicon) { System.out.println("开始加载了"); beginLoading.setText("开始加载了"); } //设置结束加载函数 @Override public void onPageFinished(WebView view, String url) { endLoading.setText("结束加载了"); } }); } //点击返回上一页面而不是退出浏览器 @Override public boolean onKeyDown(int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_BACK && mWebview.canGoBack()) { mWebview.goBack(); return true; } return super.onKeyDown(keyCode, event); } //销毁Webview @Override protected void onDestroy() { if (mWebview != null) { mWebview.loadDataWithBaseURL(null, "", "text/html", "utf-8", null); mWebview.clearHistory(); ((ViewGroup) mWebview.getParent()).removeView(mWebview); mWebview.destroy(); mWebview = null; } super.onDestroy(); } } 作者:Carson_Ho 链接:https://www.jianshu.com/p/3c94ae673e2a 來源:简书 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。]]> android WebView全面总结 Wed,20 Jun 2018 05:45:17 +0800 编辑推荐:稀土掘金,这是一个针对技术开发者的一个应用,你可以在掘金上获取最新最优质的技术干货,不仅仅是Android知识、前端、后端以至于产品和设计都有涉猎,想成为全栈工程师的朋友不要错过!

WebView是安卓中用来显示html文本内容的的控件,对html5也有很好的支持,ios的控件UIWebView差不多。网上对WebView的解释很多,但都是零星的介绍,导致到现在为止webview给我的印象都是,貌似很强大,其实很鸡肋,于是决定总结一下webview的开发经验。

使用WebView并不需要开通网络权限

网上有文章说webview需要开通internet权限,否则会出Web page not available错误,这是不对的,出现Web page not available并不是因为使用了webview,而是webview访问了网络,如果webview只是加载本地html(比如assets目录中的文件),或者只是加载带有html文本的字符串,即使没有internet权限,也不会报错。

如何调用webview

xml中

  1. <WebView
  2. android:id="@+id/blog_detail_webview"
  3. android:layout_width="fill_parent"
  4. android:layout_height="wrap_content"
  5. android:background="#FFFFFF"/>

activity中

  1. mWebView = (WebView)findViewById(R.id.blog_detail_webview);
  2. mWebView.getSettings().setJavaScriptEnabled(false);
  3. mWebView.getSettings().setSupportZoom(false);
  4. mWebView.getSettings().setBuiltInZoomControls(false);
  5. mWebView.getSettings().setLayoutAlgorithm(LayoutAlgorithm.SINGLE_COLUMN);
  6. mWebView.getSettings().setDefaultFontSize(18);

基本设置

上面的java代码部分相信大家都懂,可以看到WebView 和其他控件不同的地方在于其属性设置是调用mWebView.getSettings()来完成的,不知道谷歌这样设计的用意,其中:

mWebView.getSettings().setJavaScriptEnabled(false);

表示不支持js,如果想让java和js交互或者本身希望js完成一定的功能请把false改为true。

mWebView.getSettings().setSupportZoom(false);

设置是否支持缩放,我这里为false,默认为true。

mWebView.getSettings().setBuiltInZoomControls(false);

设置是否显示缩放工具,默认为false。

mWebView.getSettings().setLayoutAlgorithm(LayoutAlgorithm.SINGLE_COLUMN);

一般很少会用到这个,用WebView组件显示普通网页时一般会出现横向滚动条,这样会导致页面查看起来非常不方便。LayoutAlgorithm是一个枚举,用来控制html的布局,总共有三种类型:
NORMAL:正常显示,没有渲染变化。
SINGLE_COLUMN:把所有内容放到WebView组件等宽的一列中。
NARROW_COLUMNS:可能的话,使所有列的宽度不超过屏幕宽度。

mWebView.getSettings().setDefaultFontSize(18);

设置默认的字体大小,默认为16,有效值区间在1-72之间。

加载内容

(1)加载assets目录下的本地网页

一般我们都是把html文件放在assets目录下, WebView调用assets目录下的本地网页和图片等资源非常方便,使用形如

	
  1. mWebView.loadUrl("file:///android_asset/html/test1.html");

的调用方法即可。

(2)加载远程网页

	
  1. mWebView.loadUrl("http://www.google.com");

(3)使用 LoadData 或者 loadDataWithBaseURL方法加载内容

有时候我们的webview可能只是html片段,而不是一个完整的网页,事实上绝大多数时候都是如此,完整的网页无需做成应用,而直接在浏览器访问。

这种情况我们使用 LoadData 或者 loadDataWithBaseURL方法,后者用的最多:

void loadDataWithBaseURL (String baseUrl, String data, String mimeType, String encoding, String historyUrl)

loadDataWithBaseURL()比loadData()多两个参数,可以指定HTML代码片段中相关资源的相对根路径,也可以指定历史Url,其余三个参数相同。

这里主要注意参数baseUrl,baseUrl指定了你的data参数中数据是以什么地址为基准的,因为data中的数据可能会有超链接或者是image元素,而很多网站的地址都是用的相对路径,如果没有baseUrl,webview将访问不到这些资源。

举个例子:

	
  1. String body ="示例:这里有个img标签,地址是相对路径<img src='/uploads/allimg/130923/1FP02V7-0.png' />";
  2. mWebView.loadDataWithBaseURL("http://www.jcodecraeer.com", body, "text/html", "utf-8",null);

如果baseUrl没有指定为http://www.jcodecraeer.com,那么这张图片将显示不出来。

上面的例子其实演示了loadDataWithBaseURL的用法,我们直接加载一个字符串里面的html内容,而有些时候这些内容是从assets目录下的本地网页文件中读取,下面我们将html/test1.html中的内容通过LoadData来加载:

	
  1. String data = "";
  2. try {
  3. // 读取assets目录下的文件需要用到AssetManager对象的Open方法打开文件
  4. InputStream is = getAssets().open("html/test2.html");
  5. // loadData()方法需要的是一个字符串数据所以我们需要把文件转成字符串
  6. ByteArrayBuffer baf = new ByteArrayBuffer(500);
  7. int count = 0;
  8. while ((count = is.read()) != -1) {
  9. baf.append(count);
  10. }
  11. data = EncodingUtils.getString(baf.toByteArray(), "utf-8");
  12. } catch (IOException e) {
  13. e.printStackTrace();
  14. }
  15. // 下面两种方法都可以加载成功
  16. mWebView.loadData(data, "text/html", "utf-8");
  17. // wv.loadDataWithBaseURL("", data, "text/html", "utf-8", "");

这种通过读取文件再用loadData加载其实和mWebView.loadUrl("file:///android_asset/html/test1.html")是一致的,只不过loadData方式因为没有指定地址的基准url,html/test1.html文件中一些资源文件或者链接地址会失效。

loadDataWithBaseURL和loadData两个方法加载的HTML代码片段的不同点在于,loadData()中的html data中不能包含'#', '%', '\', '?'四中特殊字符,在平时测试时,你的数据时,你的数据里含有这些字符,但不会出问题,当出问题时,你可以替换下。

      %,会报找不到页面错误,页面全是乱码。乱码样式见符件。

      #,会让你的goBack失效,但canGoBAck是可以使用的。于是就会产生返回按钮生效,但不能返回的情况。


WebView内容的处理


android 中webView控件 padding不起作用
在一个布局文件中有一个WebView,想使用padding属性让左右向内留出一些空白,但是padding属性不起左右,内容照样贴边显示,反而移动了右边滚动条的位置。android的bug,用一个外围的layout包含webview,可以有所改进,但不能完全解决。其实正确的做法是在webView的加载的css中增加padding,没必要为了padding而更改xml布局文件。


重写shouldOverrideUrlLoading时指定url

指定只有url里包含eoe.cn的时候才在webview里打开,否则还是启动浏览器打开.

  1. @Override
  2. public boolean shouldOverrideUrlLoading(WebView view, String url) {
  3. LogUtil.i(this, "url=" url);
  4. if ( url.contains("eoe.cn") == true){
  5. view.loadUrl(url);
  6. return true;
  7. }else{
  8. Intent in = new Intent (Intent.ACTION_VIEW , Uri.parse(url));
  9. startActivity(in);
  10. return true;
  11. }
  12. }


android:scrollbarStyle控制滚动条位置

WebView有一个设置滚动条位置的属性:android:scrollbarStyle 可以是insideOverlay可以是outsideOverlay,两个的区别是SCROLLBARS_INSIDE_OVERLAY的样式是滚动条在整个page里,类似css中的padding,看代码下的这个图吧,很清晰.

  1. mWebView.setScrollBarStyle(View.SCROLLBARS_OUTSIDE_OVERLAY);

mWebView.setScrollBarStyle(View.SCROLLBARS_INSIDE_OVERLAY);

]]>
macOS安装教程兼小米Pro安装过程记录 Wed,20 Jun 2018 05:45:17 +0800

引言
一直以来就想写个macOS的安装教程,可惜没有TransMac以及BIOS设置的截图,正好小米PRO黑苹果高级群的班长@原味菠萝最近一直在写小米Pro安装黑苹果的教程,由于他工作繁忙,一直也没有完稿,我就在他写作的基础上将这篇教程完善.

Windows下制作macOS安装盘

准备工具

  • U盘大于8G
  • U 盘大小不限做 PE 盘
  • TransMac
  • 小米PRO专用EFI文件
  • 系统镜像

在 Windows 下安装 TransMac

安装完成后,右键→管理员权限运行 TransMac

利用 TransMac 制作macOS安装USB盘

  1. 打开TransMac,选择欲制作的USB盘符
    TransMac1

  2. 右键选择Restore with Disk Image,选择下载好的dmg文件,会弹出窗口,提示将要格式化USB磁盘,点击OK按钮继续
    TransMac2

  3. 在此期间,您可以去给自己泡杯咖啡喝,耐心等待写盘的完成.
    TransMac3

  4. 写入完成,系统弹出将其格式化,点击取消
    TransMac4

macOS下制作USB安装盘

如果您已经有了macOS的使用环境,那么制作用于安装的macOS将会更加方便.

准备工具

  • 下载好的dmg镜像
  • 用于安装macOS的USB盘,容量8GB以上
  • 磁盘工具

制作过程

为便于截屏及加快制作时间,我没有使用USB制作,而是生成一个8GB的镜像做演示

  1. 打开欲制作的dmg镜像,两种方法:
    • 使用磁盘工具,选择File-Open Disk Image
    • 直接通过Finder双击dmg打开
      DiskUtility
  1. 打开磁盘工具,选择SANDISK 8GB USB
    DiskUtility2

  2. 点击恢复/Restore按钮,选择XiaoMiPro 10131,点击恢复/Restore
    DiskUtility3
    它会开始执行恢复镜像到USB的动作,恢复速度取决于你的USB盘
    DiskUtility4

  3. 镜像恢复完成后,它会显示如图所示
    DiskUtility5
    点击完成/Done按钮后,会显示完成后的USB磁盘信息
    DiskUtility6

安装镜像的制作到这里就完成了,下一步,我们需要将EFI复制进刚制作好的USB磁盘的EFI分区里

将镜像里的EFI复制到USB安装盘的EFI分区下

显示磁盘分区信息

打开终端,输入命令:diskutil list,它会显示类似的信息:

				
1
2
3
4
5
6
7
8
9
10
11
				
/dev/disk4 (disk image):
#: TYPE NAME SIZE IDENTIFIER
0: GUID_partition_scheme +8.0 GB disk4
1: EFI EFI 209.7 MB disk4s1
2: Apple_HFS XiaoMiPro 10131 7.7 GB disk4s2
/dev/disk5 (disk image):
#: TYPE NAME SIZE IDENTIFIER
0: GUID_partition_scheme +7.0 GB disk5
1: EFI EFI 209.7 MB disk5s1
2: Apple_HFS XiaoMiPro 10131 6.7 GB disk5s2

这里显示的8.0 GB的磁盘设备为:disk4,也就是我们刚才制作的安装磁盘,EFI分区的设备为:disk4s1;
7.0 GB的磁盘设备为:disk5,这个是我们刚才打开的磁盘镜像,它包含的EFI分区的设备为:disk5s1;

挂载EFI分区

我们使用diskutil命令分别挂载这两个EFI分区,命令如下:

				
1
2
3
4
5
				
diskutil mount disk4s1 # 挂载USB的EFI分区
Volume EFI on disk4s1 mounted
diskutil mount disk5s1 # 挂载安装镜像的EFI分区
Volume EFI on disk5s1 mounted
open . # 在当前位置打开Finder

复制/替换EFI

将EFI复制进USB的EFI分区下即可,至于你想替换EFI也可以参考此方法操作

小米BIOS设置

小米笔记本的BIOS默认开启了安全认证,UEFI引导需要关闭安全启动Secure Boot Mode方式,否则无法加载UEFI引导设备,比如刚制作好的macOS安装USB盘

操作方法:

  1. 开机按F2进入BIOS设置,光标移动到Security,点击Set Supervisor Password设置一个BIOS密码,输入两次相同的密码,点击YES保存
    XiaoMi-Bios1
    XiaoMi-Bios2
    Supervisor PasswordNot Installed变为Installed

  2. 关闭安全启动

XiaoMi-Bios3
点击Secure Boot Mode,设置为Disabled关闭安全启动
XiaoMi-Bios4

  1. F10保存设置


    安装macOS

开机按F12键进入Boot Manager引导管理,选择EFI USB Device,回车XiaoMi-Bios5

进入Clover主菜单
XiaoMiCloverboot

移动光标到Boot OS X Install from XiaoMiPro 10131回车
如果无法进入安装界面,需要打开啰嗦模式进行排错,具体的操作方法请参考Clover使用教程

11-26-2017 19:25更新

未完待续

安装第一阶段

开始引导macOS系统

ParallelsPicture

这个过程需要1-2分钟,耐心等待进入安装程序,出现语言选择界面

语言选择

选择简体中文
ParallelsPicture1

出现macOS实用工具界面,选择磁盘工具

磁盘工具

ParallelsPicture0
选择显示所有设备:
ParallelsPicture2
选择SSD Media,点击抹掉按钮,选择默认的Mac OS扩展(日志型),将名称修改为Macintosh HD,点击抹掉按钮

假设您的磁盘是空的且数据是已经备份过的,别怪我没提醒你!!!

ParallelsPicture6
抹盘成功后,它会自动生成一个200MB的EFI分区,这样做的好处是不会出现安装过程中的由于EFI分区尺寸小于200MB而引起的无法安装的错误.当然前提是你的磁盘中没有重要的数据,或者您的数据已经提前备份过了.
ParallelsPicture7
到这里,磁盘工具的动作就已经结束了.退出磁盘工具进入安装界面,进行系统的安装了.

安装macOS

ParallelsPicture8
进入安装界面
ParallelsPicture11
选择继续
ParallelsPicture12
ParallelsPicture13
点击同意,选择Macintosh HD
ParallelsPicture 14
选择安装
ParallelsPicture 15
期间,它会把USB安装盘上的安装文件预复制到要安装的系统分区里,这个过程在小米Pro的笔记本上它跑得飞快,数据复制完后,它会自动重启
ParallelsPicture16
然后进行第二阶段的安装

安装第二阶段

第二阶段的安装会有两种界面,一种是不进安装界面直接安装,另一种是先进入安装界面直接安装,需要注意的是,无论是哪一种界面下,安装的过程中全程是禁用鼠标和键盘的,需要你做的只是耐心等待它安装完成

ParallelsPicture 17

安装速度取决于你的磁盘速度,第二阶段的安装已经与USB安装盘没什么关系了.macOS 10.13的安装完全区别于10.12,它不能免二次安装,甚至还需要重启多次,这些都是正常现象,请不要大惊小怪的.
系统安装完成后,重启进入系统设置向导

设置向导

国家选择

Installer3
首先让你选择国家,这里我选择中国
Installer4
点击继续,设置键盘

设置键盘

Installer5
这里询问你是否传输信息到这台Mac

数据恢复

可以从Mac或者Time Machine备份恢复

Installer6
我选择现在不传输任何信息,点击继续

Apple ID登录

Installer7
选择是否使用您的Apple ID登录,如何想现在就登录到Apple ID,请输入Apple ID和密码登录,否则选择不登录,进入系统后也可以设置登录到iCloud,点击继续
Installer8
阅读条款与条件,选择同意继续
Installer9
出现创建电脑用户的窗口,输入用户名和密码,点击继续

创建电脑用户

Installer10
系统会创建初始用户
Installer11
用户创建成功后,弹出iCloud正在设置用户的窗口
Installer12
紧接着弹出设置iClound钥匙串的设置窗口,选择稍候设置,点击继续

设置iCloud钥匙串

Installer13
出现快捷设置,点击继续

快捷设置

自定义设置定位以及数据反馈,请根据自己的喜好进行设置

Installer14
出现iCloud中的所有文件,如果你需要将文稿和桌面上的文件储存在 iCloud Drive中,请勾选,否则取消勾选,点击继续

iCloud文件同步设置

Installer16
出现FileVault磁盘加密,如果你需要打开 Filevault 磁盘加密,请勾选,否则取消勾选,点击继续

FileVault磁盘加密设置

Installer17
出现正在设置您的Mac,请稍候完成设置向导

设置向导完成

Installer18
出现桌面后,整个的安装向导就完成了.
Installer19

更新于 11-27-2017 21:15
未完待续

安装后的系统设置

系统安装后,你可以先喝杯咖啡兴奋会儿,马上还有更艰巨的任务在等着你呢

教你将U盘上的EFI复制到磁盘的EFI分区,脱离USB运行[macOS篇]

新的系统安装成功后,EFI还位于U盘里,总不能一直挂着U盘使用系统吧。这个时候如果你想将U盘里的EFI复制到磁盘的EFI分区里,却苦于找不到看不见EFI分区,这个时候是该让diskutil登场了。

diskutil命令的基本用法:

查看磁盘分区表

				
1
				
diskutil list

/dev/disk0(internal, physical):

#: TYPE NAME SIZE IDENTIFIER
0: GUID_partition_scheme 256 GB disk0
1: EFI EFI 200 MB disk0s1
2: Apple_HFS MAC 128 GB disk0s2
3: Microsoft Basic Data WIN10 127.7 GB disk0s3

/dev/disk1(internal, physical):

#: TYPE NAME SIZE IDENTIFIER
0: GUID_partition_scheme 16 GB disk1
1: EFI EFI 200 MB disk1s1
2: Apple_HFS Install macOS Sierra 15.8 GB disk1s2

挂载磁盘EFI分区

				
1
				
diskutil mount disk0s1

挂载U盘EFI分区

				
1
				
diskutil mount disk1s1

打开Finder,注意后面有个.

				
1
				
open .

左侧会显示挂载了两个EFI分区,将U盘EFI目录全部复制到磁盘的EFI分区即可。

合并EFI分区

这里有一点需要注意:如果之前安装过Windows系统的话,会存在EFI的目录,只是EFI的目录下面只有BOOT和Microsoft这两个目录,如果希望添加macOS的Clover引导的话,可以将USB的EFI分区里面的EFI目录下面的CLOVER复制到磁盘里的EFI目录下,也就是执行的是**合并**的操作,让EFI同时支持WINDOWS和macOS的引导.千万不要全部复制,否则有可能造成EFI无法启动Windows.

复制EFI分区

如果磁盘上的EFI分区里为空的,可以直接将USB的EFI分区下面的EFI目录直接复制到磁盘上的EFI分区里.

教你将U盘上的EFI复制到磁盘的EFI分区,脱离USB运行[Windows篇]

挂载EFI分区

Windows操作系统下面,打开cmd窗口,输入命令:

				
1
2
3
4
5
6
				
diskpart
list disk # 磁盘列表
select disk n # 选择EFI分区所在的磁盘,n为磁盘号
list partition # 磁盘分区列表
select partition n # 选择EFI分区,n为EFI分区号
assign letter=X # x为EFI分区盘符

您可以重复输入命令同时挂载USB的EFI分区和磁盘的EFI分区
打开资源管理器,会出现一个盘符为X的磁盘,格式化为fat32格式,将USB的EFI分区下面的EFI目录复制到安装磁盘的EFI分区下

合并EFI分区

这里有一点需要注意:如果之前安装过Windows系统的话,会存在EFI的目录,只是EFI的目录下面只有BOOT和Microsoft这两个目录,如果希望添加macOS的Clover引导的话,可以将USB的EFI分区里面的EFI目录下面的CLOVER复制到磁盘里的EFI目录下,也就是执行的是**合并**的操作,让EFI同时支持WINDOWS和macOS的引导.千万不要全部复制,否则有可能造成EFI无法启动Windows.

复制EFI分区

如果磁盘上的EFI分区里为空的,可以直接将USB的EFI分区下面的EFI目录直接复制到磁盘上的EFI分区里.

添加UEFI引导选项

使用工具:BOOTICE

操作过程:

  1. 打开BOOTICE软件,选择物理磁盘,选择欲操作的目标磁盘,点击分区管理,弹出分区管理的窗口,点击分配盘符,为ESP分区分配一个盘符,点击确定
    BOOTICE1
  2. 选择UEFI,点击修改启动序列,点击添加按钮,菜单标题填写:CLOVER,选择启动文件,在打开的窗口里选择ESP分区下的目录\EFI\CLOVER\CLOVERX64.EFI,点击保存当前启动项设置
    BOOTICE2

完善驱动

小米Pro的专用镜像已经包括了笔记本本身的所有的驱动.由于众所周知的原因,小米板载的INTEL无线网卡是焊死在主板上的,扩展槽又无法添加WIFI无线网卡,所以选择一个外置的USB无线网卡是种无奈之举.

USB无线网卡及安装驱动程序

补充

最后更新:11-28-2017 AM11:30


原来地址: https://blog.daliansky.net/MacOS-installation-tutorial-XiaoMi-Pro-installation-process-records.html

]]>
黑果无痛升级10.13.1 正式版 Wed,20 Jun 2018 05:45:17 +0800


首先备份系统!!!首先备份系统!!首先备份系统!!!其次,单独备份一个EFI出来。

1.下载macos High Sierra,下载完成后不要安装,等进行完下面的工作再点安装

2.升级clover到4220最新版

3.Copy FakeSMC.kext  to /EFI/CLOVER/kexts/Other/

4.在clover/kexts下新建一个10.13目录,把10.12目录里的驱动copy到10.13

5.Copy apfs.efi to /EFI/CLOVER/drivers64UEFI/.
关于apfs.efi的提取,前往安装包,显示包内容:Contents -> Contents -> SharedSupport -> BaseSystem.dmg////BaseSystem.dmg -> usr -> standalone -> i386 -> apfs.efi


6.开始安装
7.重启后选择install macos high sierra选项,正常情况下可以升级完成,如果出现驱动问题,请前往远景爬贴,一般情况下只有靠自己!
二、关于HFS+文件系统升级如果你有机械转换APFS很简单,用磁盘工具右键转换为APFS即可。

下载:

Mac 0s 10.13.1 apfs


原来:http://bbs.feng.com/read-htm-tid-11456605.html

]]>
MacOS 开发 - 窗口的关闭、重启 Wed,20 Jun 2018 05:45:17 +0800

一、点击关闭时,同时移除Dock上的图标

运行成功点击关闭后,Dock上还会显示图标。使用下面方法可以彻底关闭和移除。

方法一:当关闭最后一个窗口时,退出app

实现appdelegate 的方法 applicationShouldTerminateAfterLastWindowClosed

- (BOOL)applicationShouldTerminateAfterLastWindowClosed:(NSApplication *)sender{ return YES;//YES-窗口程序两者都关闭,NO-只关闭窗口; } 
		
  • 1
  • 2
  • 3

方法二:关闭窗口时,退出程序

1、设置window的delegate.

NSWindowDelegate

2、实现代理方法 windowShouldClose

#pragma mark - NSWindowDelegate -(BOOL)windowShouldClose:(id)sender {
    [self.mainWindowC.window orderOut:nil];//窗口消失 exit(0); return NO;
} 
		
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

二、点击Dock栏重启

如果不想向上面一样,点击关闭就直接关闭全部。还想点击dock后能够重启App,可以使用下面方法:

1、最小化和关闭窗口

  • 如果在窗口的标题栏,点击最小化,那么点击dock上该程序的图标,程序会自动跳出来,并带有动画样式。

  • 如果在标题栏点击关闭,点击dock,程序不会自动跳出来,这时候,需要在delegate.m 中实现applicationShouldHandleReopen:hasVisibleWindows: 方法。


2、实现 applicationShouldHandleReopen: 方法

  • 在该方法中,返回 YES ,点击dock,就会显示主窗口。注意,要把你的主窗口作为delegate中的属性。
  • 点击最小化后,点击dock上该应用图标,hasVisibleWindows = 1;打开的效果,是带有动画的效果。
  • 点击关闭后,点击dock上该应用图标,hasVisibleWindows = 0;打开的效果,是重启的样式,没有动画
-(BOOL)applicationShouldHandleReopen:(NSApplication *)sender hasVisibleWindows:(BOOL)flag
{ NSLog(@"hasVisibleWindows:%d",flag);
    [NSApp activateIgnoringOtherApps:NO];//取消其他程序的响应 [self.mainWindowC.window makeKeyAndOrderFront:self];//主窗口显示自己方法一 //[_mainWindow orderFront:nil];           //主窗口显示自己方法二 return YES;
} 
		
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

三、只显示状态栏图标,不显示window

参考:http://www.jianshu.com/p/bd801d926314

1、移除delegate.m 中对window的调用; 
2、将 project - general - main interface 的入口清空; 
3、在 main.c 文件中 #import "AppDelegate.h"
4、修改 int main 方法 
5、在delegate.m 中添加状态栏 NSStatusItem 信息,可参考: 
- MacOS 开发 - 状态栏 NSStatusBar & NSStatusItem 
http://blog.csdn.net/lovechris00/article/details/78011718

int main(int argc, const char * argv[]) {

    NSApplication *app = [NSApplication sharedApplication];
    id delegate = [[AppDelegate alloc]init];
    app.delegate = delegate; return NSApplicationMain(argc, argv);
} 
		
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

四、使用terminate命令,关闭App

如果我们的APP 没有window,却有状态栏,可以在状态栏的菜单(menu)中设置关闭方法

- (void)load1{ NSLog(@"load1 ---- ");

    [[NSApplication sharedApplication] terminate:self];
} 
		
  • 1
  • 2
  • 3
  • 4
  • 5

状态栏及设置目录方法,可参考: 
- MacOS 开发 - 状态栏 NSStatusBar & NSStatusItem 
http://blog.csdn.net/lovechris00/article/details/78011718

状态栏中退出程序


五、隐藏dock 上的图标

参考:https://mikulove.com/2017/05/02/macOS-xue-xi-bi-ji-yin-cang-dock-lan-tu-biao/

在info.plist 最后一栏输入 LSUIElement,选择YES即可。key会自动生成。

LSUIElement

http://blog.csdn.net/lovechris00/article/details/78143104?locationNum=8&fps=1

]]>
Swift 点击事件的添加 Wed,20 Jun 2018 05:45:17 +0800

除UIButton外的UI组件,addGestureRecognizer的方法,代码如下:

//定义view

let view = UIView(frame:CGRect(x:100, y:50, width:200, height:50))

view.text = "按钮"

//定义一个UITapGestureRecognizer

let tap = UITapGestureRecognizer(target:self, action:Selector("tapClick:"))

//设置view可以点击

view.userInteractionEnabled=true

//给view添加事件

view.addGestureRecognizer(tap)

//事件的代码

func tapClick(sender:UIView){

  print("按钮被点击")

}


UIButton添加点击事件,代码如下:

//定义btn

let btn =UIButton(frame:CGRect(x:100, y:50, width:200, height:50))

btn.setTitle("按钮", forState: .Normal)

//btn添加点击事件

btn.addTarget(self, action:"btnClick:", forControlEvents:UIControlEvents.TouchUpInside)

//事件的代码

func btnClick(sender:UIButton){

  print("按钮被点击")

}

作者:Levelup 链接:http://www.jianshu.com/p/870ba0777eb3 來源:简书



]]>
Mac 下修改mysql初始密码 Wed,20 Jun 2018 05:45:17 +0800
修改mysql的密码有很多方式,这里是直接修改mysql 数据库里面的user表的user字段值为root对应的authentication_string字段的值
 
步骤:
1.Mac下安装好mysql后,启动mysql(系统便好设置里面启动mysql,然后Start MYSQL Server)
2.进入终端输入命令:PATH=”$PATH":/usr/local/mysql/bin
3.由于刚刚安装好的mysql密码为空,输入命令:mysql -u root -p  按回车即可登录
4.显示所有数据库,输入命令:show databases; 
5.进入到名为mysql的数据库
6.显示出mysql数据库里面的表, 有一个user表,里面就存储的是mysql用户名,密码
7.打印user表结构
8.更新authentication_string(相当于windows里面的password字段)字段,此处要用PASSWORD()函数修改
 
至此,mysql初始密码就修改完成了,之后就可以登录试试了
]]>
mac下安装 xampp 无法启动apache Wed,20 Jun 2018 05:45:17 +0800 mac下安装 xampp 无法启动apache 

1.查看端口是否被占用  
sudo lsof -i -n

2.用终端运行xampp,查看具体的错误 
sudo su 
/Applications/XAMPP/xamppfiles/xampp start

多半是这个问题: 
XAMPP: Starting Apache…fail. 
XAMPP: Another web server is already running.

解决办法: 
sudo apachectl stop 
// This command killed Apache server that was pre-installed on MAC OS X.

]]>
我学 java 001 Wed,20 Jun 2018 05:45:17 +0800 我学 java 001


]]>
JAVA基础教程第一课 基本变量类型 Wed,20 Jun 2018 05:45:17 +0800 ]]> 编程系列教程介绍 Wed,20 Jun 2018 05:45:17 +0800 ]]> 定时电脑关机 java 源码 Wed,20 Jun 2018 05:45:17 +0800  定时电脑关机  java 源码


5555

]]>
java web Wed,20 Jun 2018 05:45:17 +0800 java web

  • Java Web,是用Java技术来解决相关web互联网领域的技术总和。web包括:web服务器和web客户端两部分。Java在客户端的应用有java applet,不过使用得很少,Java在服务器端的应用非常的丰富,比如Servlet,JSP和第三方框架等等。Java技术对Web领域的发展注入了强大的动力。


主要框架


Java的Web框架虽然各不相同,但基本也都是遵循特定的路数的:使用Servlet或者Filter拦截请求,使用MVC的思想设计架构,使用约定,XML或 Annotation实现配置,运用Java面向对象的特点,面向对象实现请求和响应的流程,支持Jsp,Freemarker,Velocity等视图。

JSP优点:

Java EE标准,这意味着有很大的市场需求和更多的工作机会

上手快速并且相对容易

有大量可用的组件库

JSP缺点:

大量的JSP标签

对REST和安全支持不好

没有一个统一的实现。既有SUN的实现,又有Apache的实现——MyFaces。

Spring MVC优点:

对Spring MVC覆盖绑定(overriding binding)、验证(validation)等提供生命周期管理

与许多表示层技术/框架无缝集成:JSP/JSTL、Tiles、Velocity、FreeMarker、Excel、XSL、PDF 等

便于测试——归功于IoC

Spring MVC缺点:

大量的XML配置文件

太过灵活——没有公共的父控制器

没有内置的Ajax支持

Stripes优点:

不需要书写XML配置文件

良好的学习文档

社区成员很热心

Stripes缺点:

社区比较小

不如其他的项目活跃

ActionBean里面的URL是硬编码的

Struts 2优点:

架构简单——易于扩展

标记库很容易利用FreeMarker或者Velocity来定制

基于控制器或

者基于页面的导航

Struts 2缺点:

文档组织得很差

对新特征过分关注

Tapestry优点:

一旦学会它,将极大地提高生产率

HTML模板——对页面设计师非常有利

每出一个新版本,都会有大量的创新

Tapestry缺点:

文档过于概念性,不够实用

学习曲线陡峭

发行周期长——每年都有较大的升级

Wicket优点:

对Java开发者有利(不是Web开发者)

页面和显示绑定紧密

社区活跃——有来自创建者的支持

Wicket缺点:

HTML模板和Java代码紧挨着

需要对OO有较好的理解

Wicket逻辑——什么都用Java搞定


]]>
Java (计算机编程语言) Wed,20 Jun 2018 05:45:17 +0800

Java是一门面向对象编程语言,不仅吸收了C++语言的各种优点,还摒弃了C++里难以理解的多继承、指针等概念,因此Java语言具有功能强大和简单易用两个特征。Java语言作为静态面向对象编程语言的代表,极好地实现了面向对象理论,允许程序员以优雅的思维方式进行复杂的编程[1] 。

Java具有简单性、面向对象、分布式、健壮性、安全性、平台独立与可移植性、多线程、动态性等特点[2] 。Java可以编写桌面应用程序、Web应用程序、分布式系统和嵌入式系统应用程序等[3] 。




20世纪90年代,硬件领域出现了单片式计算机系统,这种价格低廉的系统一出现就立即引起了自动控制领域人员的注意,因为使用它可以大幅度提升消费类电子产品(如电视机顶盒、面包烤箱、移动电话等)的智能化程度。Sun公司为了抢占市场先机,在1991年成立了一个称为Green的项目小组,帕特里克、詹姆斯·高斯林、麦克·舍林丹和其他几个工程师一起组成的工作小组在加利福尼亚州门洛帕克市沙丘路的一个小工作室里面研究开发新技术,专攻计算机在家电产品上的嵌入式应用。

由于C++所具有的优势,该项目组的研究人员首先考虑采用C++来编写程序。但对于硬件资源极其匮乏的单片式系统来说,C++程序过于复杂和庞大。另外由于消费电子产品所采用的嵌入式处理器芯片的种类繁杂,如何让编写的程序跨平台运行也是个难题。为了解决困难,他们首先着眼于语言的开发,假设了一种结构简单、符合嵌入式应用需要的硬件平台体系结构并为其制定了相应的规范,其中就定义了这种硬件平台的二进制机器码指令系统(即后来成为“字节码”的指令系统),以待语言开发成功后,能有半导体芯片生产商开发和生产这种硬件平台。对于新语言的设计,Sun公司研发人员并没有开发一种全新的语言,而是根据嵌入式软件的要求,对C++进行了改造,去除了留在C++的一些不太实用及影响安全的成分,并结合嵌入式系统的实时性要求,开发了一种称为Oak的面向对象语言。

由于在开发Oak语言时,尚且不存在运行字节码的硬件平台,所以为了在开发时可以对这种语言进行实验研究,他们就在已有的硬件和软件平台基础上,按照自己所指定的规范,用软件建设了一个运行平台,整个系统除了比C++更加简单之外,没有什么大的区别。1992年的夏天,当Oak语言开发成功后,研究者们向硬件生产商进行演示了Green操作系统、Oak的程序设计语言、类库和其硬件,以说服他们使用Oak语言生产硬件芯片,但是,硬件生产商并未对此产生极大的热情。因为他们认为,在所有人对Oak语言还一无所知的情况下,就生产硬件产品的风险实在太大了,所以Oak语言也就因为缺乏硬件的支持而无法进入市场,从而被搁置了下来。

1994年6、7月间,在经历了一场历时三天的讨论之后,团队决定再一次改变了努力的目标,这次他们决定将该技术应用于万维网。他们认为随着Mosaic浏览器的到来,因特网正在向同样的高度互动的远景演变,而这一远景正是他们在有线电视网中看到的。作为原型,帕特里克·诺顿写了一个小型万维网浏览器WebRunner。[4]

1995年,互联网的蓬勃发展给了Oak机会。业界为了使死板、单调的静态网页能够“灵活”起来,急需一种软件技术来开发一种程序,这种程序可以通过网络传播并且能够跨平台运行。于是,世界各大IT企业为此纷纷投入了大量的人力、物力和财力。这个时候,Sun公司想起了那个被搁置起来很久的Oak,并且重新审视了那个用软件编写的试验平台,由于它是按照按照嵌入式系统硬件平台体系结构进行编写的,所以非常小,特色适用于网络上的传输系统,而Oak也是一种精简的语言,程序非常小,适合在网络上传输。Sun公司首先推出了可以嵌入网页并且可以随同网页在网络上传输的Applet(Applet是一种将小程序嵌入到网页中进行执行的技术),并将Oak更名为Java(在申请注册商标时,发现Oak已经被人使用了,再想了一系列名字之后,最终,使用了提议者在喝一杯Java咖啡时无意提到的Java词语)。5月23日,Sun公司在Sun world会议上正式发布Java和HotJava浏览器。IBM、Apple、DEC、Adobe、HP、Oracle、Netscape和微软等各大公司都纷纷停止了自己的相关开发项目,竞相购买了Java使用许可证,并为自己的产品开发了相应的Java平台。[5-6]

1996年1月,Sun公司发布了Java的第一个开发工具包(JDK 1.0),这是Java发展历程中的重要里程碑,标志着Java成为一种独立的开发工具。9月,约8.3万个网页应用了Java技术来制作。10月,Sun公司发布了Java平台的第一个即时(JIT)编译器。

1997年2月,JDK 1.1面世,在随后的3周时间里,达到了22万次的下载量。4月2日,Java One会议召开,参会者逾一万人,创当时全球同类会议规模之纪录。9月,Java Developer Connection社区成员超过10万。

1998年12月8日,第二代Java平台的企业版J2EE发布。1999年6月,Sun公司发布了第二代Java平台(简称为Java2)的3个版本:J2ME(Java2 Micro Edition,Java2平台的微型版),应用于移动、无线及有限资源的环境;J2SE(Java 2 Standard Edition,Java 2平台的标准版),应用于桌面环境;J2EE(Java 2Enterprise Edition,Java 2平台的企业版),应用于基于Java的应用服务器。Java 2平台的发布,是Java发展过程中最重要的一个里程碑,标志着Java的应用开始普及。

1999年4月27日,HotSpot虚拟机发布。HotSpot虚拟机发布时是作为JDK 1.2的附加程序提供的,后来它成为了JDK 1.3及之后所有版本的Sun JDK的默认虚拟机[7] 。

2000年5月,JDK1.3、JDK1.4和J2SE1.3相继发布,几周后其获得了Apple公司Mac OS X的工业标准的支持。2001年9月24日,J2EE1.3发布。2002年2月26日,J2SE1.4发布。自此Java的计算能力有了大幅提升,与J2SE1.3相比,其多了近62%的类和接口。在这些新特性当中,还提供了广泛的XML支持、安全套接字(Socket)支持(通过SSL与TLS协议)、全新的I/OAPI、正则表达式、日志与断言。2004年9月30日,J2SE1.5发布,成为Java语言发展史上的又一里程碑。为了表示该版本的重要性,J2SE 1.5更名为Java SE 5.0(内部版本号1.5.0),代号为“Tiger”,Tiger包含了从1996年发布1.0版本以来的最重大的更新,其中包括泛型支持、基本类型的自动装箱、改进的循环、枚举类型、格式化I/O及可变参数。

2005年6月,在Java One大会上,Sun公司发布了Java SE 6。此时,Java的各种版本已经更名,已取消其中的数字2,如J2EE更名为JavaEE,J2SE更名为JavaSE,J2ME更名为JavaME。[8]

2006年11月13日,Java技术的发明者Sun公司宣布,将Java技术作为免费软件对外发布。Sun公司正式发布的有关Java平台标准版的第一批源代码,以及Java迷你版的可执行源代码。从2007年3月起,全世界所有的开发人员均可对Java源代码进行修改[9] 。




]]>
android studio 远程安装服务 Wed,20 Jun 2018 05:45:17 +0800 5555555555555555

]]>
java环境搭建 Wed,20 Jun 2018 05:45:17 +0800

]]>
iis web 环境 Wed,20 Jun 2018 05:45:17 +0800 一对一服务 Wed,20 Jun 2018 05:45:17 +0800 测试支付商品 Wed,20 Jun 2018 05:45:17 +0800