鸿蒙Harmony应用开发—ArkTS声明式开发(基础手势:Web)中篇

onBeforeUnload

onBeforeUnload(callback: (event?: { url: string; message: string; result: JsResult }) => boolean)

刷新或关闭场景下,在即将离开当前页面时触发此回调。刷新或关闭当前页面应先通过点击等方式获取焦点,才会触发此回调。

参数:

参数名参数类型参数描述
urlstring当前显示弹窗所在网页的URL。
messagestring弹窗中显示的信息。
resultJsResult通知Web组件用户操作行为。

返回值:

类型说明
boolean当回调返回true时,应用可以调用系统弹窗能力(包括确认和取消),并且需要根据用户的确认或取消操作调用JsResult通知Web组件最终是否离开当前页面。当回调返回false时,函数中绘制的自定义弹窗无效。

示例:

// xxx.ets
import web_webview from '@ohos.web.webview'@Entry
@Component
struct WebComponent {controller: web_webview.WebviewController = new web_webview.WebviewController()build() {Column() {Web({ src: $rawfile("index.html"), controller: this.controller }).onBeforeUnload((event) => {if (event) {console.log("event.url:" + event.url)console.log("event.message:" + event.message)AlertDialog.show({title: 'onBeforeUnload',message: 'text',primaryButton: {value: 'cancel',action: () => {event.result.handleCancel()}},secondaryButton: {value: 'ok',action: () => {event.result.handleConfirm()}},cancel: () => {event.result.handleCancel()}})}return true})}}
}

加载的html文件。

<!--index.html-->
<!DOCTYPE html>
<html>
<head><meta name="viewport" content="width=device-width, initial-scale=1.0" charset="utf-8">
</head>
<body onbeforeunload="return myFunction()"><h1>WebView onBeforeUnload Demo</h1><a href="https://www.example.com">Click here</a><script>function myFunction() {return "onBeforeUnload Event";}</script>
</body>
</html>

onConfirm

onConfirm(callback: (event?: { url: string; message: string; result: JsResult }) => boolean)

网页调用confirm()告警时触发此回调。

参数:

参数名参数类型参数描述
urlstring当前显示弹窗所在网页的URL。
messagestring弹窗中显示的信息。
resultJsResult通知Web组件用户操作行为。

返回值:

类型说明
boolean当回调返回true时,应用可以调用系统弹窗能力(包括确认和取消),并且需要根据用户的确认或取消操作调用JsResult通知Web组件。当回调返回false时,函数中绘制的自定义弹窗无效。

示例:

// xxx.ets
import web_webview from '@ohos.web.webview'@Entry
@Component
struct WebComponent {controller: web_webview.WebviewController = new web_webview.WebviewController()build() {Column() {Web({ src: $rawfile("index.html"), controller: this.controller }).onConfirm((event) => {if (event) {console.log("event.url:" + event.url)console.log("event.message:" + event.message)AlertDialog.show({title: 'onConfirm',message: 'text',primaryButton: {value: 'cancel',action: () => {event.result.handleCancel()}},secondaryButton: {value: 'ok',action: () => {event.result.handleConfirm()}},cancel: () => {event.result.handleCancel()}})}return true})}}
}

加载的html文件。

<!--index.html-->
<!DOCTYPE html>
<html>
<head><meta name="viewport" content="width=device-width, initial-scale=1.0" charset="utf-8">
</head><body><h1>WebView onConfirm Demo</h1><button onclick="myFunction()">Click here</button><p id="demo"></p><script>function myFunction() {let x;let r = confirm("click button!");if (r == true) {x = "ok";} else {x = "cancel";}document.getElementById("demo").innerHTML = x;}</script>
</body>
</html>

onPrompt9+

onPrompt(callback: (event?: { url: string; message: string; value: string; result: JsResult }) => boolean)

网页调用prompt()告警时触发此回调。

参数:

参数名参数类型参数描述
urlstring当前显示弹窗所在网页的URL。
messagestring弹窗中显示的信息。
resultJsResult通知Web组件用户操作行为。

返回值:

类型说明
boolean当回调返回true时,应用可以调用系统弹窗能力(包括确认和取消),并且需要根据用户的确认或取消操作调用JsResult通知Web组件。当回调返回false时,函数中绘制的自定义弹窗无效。

示例:

// xxx.ets
import web_webview from '@ohos.web.webview'@Entry
@Component
struct WebComponent {controller: web_webview.WebviewController = new web_webview.WebviewController()build() {Column() {Web({ src: $rawfile("index.html"), controller: this.controller }).onPrompt((event) => {if (event) {console.log("url:" + event.url)console.log("message:" + event.message)console.log("value:" + event.value)AlertDialog.show({title: 'onPrompt',message: 'text',primaryButton: {value: 'cancel',action: () => {event.result.handleCancel()}},secondaryButton: {value: 'ok',action: () => {event.result.handlePromptConfirm(event.value)}},cancel: () => {event.result.handleCancel()}})}return true})}}
}

加载的html文件。

<!--index.html-->
<!DOCTYPE html>
<html>
<head><meta name="viewport" content="width=device-width, initial-scale=1.0" charset="utf-8">
</head><body><h1>WebView onPrompt Demo</h1><button onclick="myFunction()">Click here</button><p id="demo"></p><script>function myFunction() {let message = prompt("Message info", "Hello World");if (message != null && message != "") {document.getElementById("demo").innerHTML = message;}}</script>
</body>
</html>

onConsole

onConsole(callback: (event?: { message: ConsoleMessage }) => boolean)

通知宿主应用JavaScript console消息。

参数:

参数名参数类型参数描述
messageConsoleMessage触发的控制台信息。

返回值:

类型说明
boolean当返回true时,该条消息将不会再打印至控制台,反之仍会打印至控制台。

示例:

// xxx.ets
import web_webview from '@ohos.web.webview'@Entry
@Component
struct WebComponent {controller: web_webview.WebviewController = new web_webview.WebviewController()build() {Column() {Web({ src: 'www.example.com', controller: this.controller }).onConsole((event) => {if (event) {console.log('getMessage:' + event.message.getMessage())console.log('getSourceId:' + event.message.getSourceId())console.log('getLineNumber:' + event.message.getLineNumber())console.log('getMessageLevel:' + event.message.getMessageLevel())}return false})}}
}

onDownloadStart

onDownloadStart(callback: (event?: { url: string, userAgent: string, contentDisposition: string, mimetype: string, contentLength: number }) => void)

通知主应用开始下载一个文件。

参数:

参数名参数类型参数描述
urlstring文件下载的URL。
userAgentstring用于下载的用户代理。
contentDispositionstring服务器返回的 Content-Disposition响应头,可能为空。
mimetypestring服务器返回内容媒体类型(MIME)信息。
contentLengthnumber服务器返回文件的长度。

示例:

// xxx.ets
import web_webview from '@ohos.web.webview'@Entry
@Component
struct WebComponent {controller: web_webview.WebviewController = new web_webview.WebviewController()build() {Column() {Web({ src: 'www.example.com', controller: this.controller }).onDownloadStart((event) => {if (event) {console.log('url:' + event.url)console.log('userAgent:' + event.userAgent)console.log('contentDisposition:' + event.contentDisposition)console.log('contentLength:' + event.contentLength)console.log('mimetype:' + event.mimetype)}})}}
}

onErrorReceive

onErrorReceive(callback: (event?: { request: WebResourceRequest, error: WebResourceError }) => void)

网页加载遇到错误时触发该回调。出于性能考虑,建议此回调中尽量执行简单逻辑。在无网络的情况下,触发此回调。

参数:

参数名参数类型参数描述
requestWebResourceRequest网页请求的封装信息。
errorWebResourceError网页加载资源错误的封装信息 。

示例:

// xxx.ets
import web_webview from '@ohos.web.webview'@Entry
@Component
struct WebComponent {controller: web_webview.WebviewController = new web_webview.WebviewController()build() {Column() {Web({ src: 'www.example.com', controller: this.controller }).onErrorReceive((event) => {if (event) {console.log('getErrorInfo:' + event.error.getErrorInfo())console.log('getErrorCode:' + event.error.getErrorCode())console.log('url:' + event.request.getRequestUrl())console.log('isMainFrame:' + event.request.isMainFrame())console.log('isRedirect:' + event.request.isRedirect())console.log('isRequestGesture:' + event.request.isRequestGesture())console.log('getRequestHeader_headerKey:' + event.request.getRequestHeader().toString())let result = event.request.getRequestHeader()console.log('The request header result size is ' + result.length)for (let i of result) {console.log('The request header key is : ' + i.headerKey + ', value is : ' + i.headerValue)}}})}}
}

onHttpErrorReceive

onHttpErrorReceive(callback: (event?: { request: WebResourceRequest, response: WebResourceResponse }) => void)

网页加载资源遇到的HTTP错误(响应码>=400)时触发该回调。

参数:

参数名参数类型参数描述
requestWebResourceRequest网页请求的封装信息。
responseWebResourceResponse资源响应的封装信息。

示例:

// xxx.ets
import web_webview from '@ohos.web.webview'@Entry
@Component
struct WebComponent {controller: web_webview.WebviewController = new web_webview.WebviewController()build() {Column() {Web({ src: 'www.example.com', controller: this.controller }).onHttpErrorReceive((event) => {if (event) {console.log('url:' + event.request.getRequestUrl())console.log('isMainFrame:' + event.request.isMainFrame())console.log('isRedirect:' + event.request.isRedirect())console.log('isRequestGesture:' + event.request.isRequestGesture())console.log('getResponseData:' + event.response.getResponseData())console.log('getResponseEncoding:' + event.response.getResponseEncoding())console.log('getResponseMimeType:' + event.response.getResponseMimeType())console.log('getResponseCode:' + event.response.getResponseCode())console.log('getReasonMessage:' + event.response.getReasonMessage())let result = event.request.getRequestHeader()console.log('The request header result size is ' + result.length)for (let i of result) {console.log('The request header key is : ' + i.headerKey + ' , value is : ' + i.headerValue)}let resph = event.response.getResponseHeader()console.log('The response header result size is ' + resph.length)for (let i of resph) {console.log('The response header key is : ' + i.headerKey + ' , value is : ' + i.headerValue)}}})}}
}

onPageBegin

onPageBegin(callback: (event?: { url: string }) => void)

网页开始加载时触发该回调,且只在主frame触发,iframe或者frameset的内容加载时不会触发此回调。

参数:

参数名参数类型参数描述
urlstring页面的URL地址。

示例:

// xxx.ets
import web_webview from '@ohos.web.webview'@Entry
@Component
struct WebComponent {controller: web_webview.WebviewController = new web_webview.WebviewController()build() {Column() {Web({ src: 'www.example.com', controller: this.controller }).onPageBegin((event) => {if (event) {console.log('url:' + event.url)}})}}
}

onPageEnd

onPageEnd(callback: (event?: { url: string }) => void)

网页加载完成时触发该回调,且只在主frame触发。

参数:

参数名参数类型参数描述
urlstring页面的URL地址。

示例:

// xxx.ets
import web_webview from '@ohos.web.webview'@Entry
@Component
struct WebComponent {controller: web_webview.WebviewController = new web_webview.WebviewController()build() {Column() {Web({ src: 'www.example.com', controller: this.controller }).onPageEnd((event) => {if (event) {console.log('url:' + event.url)}})}}
}

onProgressChange

onProgressChange(callback: (event?: { newProgress: number }) => void)

网页加载进度变化时触发该回调。

参数:

参数名参数类型参数描述
newProgressnumber新的加载进度,取值范围为0到100的整数。

示例:

// xxx.ets
import web_webview from '@ohos.web.webview'@Entry
@Component
struct WebComponent {controller: web_webview.WebviewController = new web_webview.WebviewController()build() {Column() {Web({ src: 'www.example.com', controller: this.controller }).onProgressChange((event) => {if (event) {console.log('newProgress:' + event.newProgress)}})}}
}

onTitleReceive

onTitleReceive(callback: (event?: { title: string }) => void)

网页document标题更改时触发该回调。

参数:

参数名参数类型参数描述
titlestringdocument标题内容。

示例:

// xxx.ets
import web_webview from '@ohos.web.webview'@Entry
@Component
struct WebComponent {controller: web_webview.WebviewController = new web_webview.WebviewController()build() {Column() {Web({ src: 'www.example.com', controller: this.controller }).onTitleReceive((event) => {if (event) {console.log('title:' + event.title)}})}}
}

onRefreshAccessedHistory

onRefreshAccessedHistory(callback: (event?: { url: string, isRefreshed: boolean }) => void)

加载网页页面完成时触发该回调,用于应用更新其访问的历史链接。

参数:

参数名参数类型参数描述
urlstring访问的url。
isRefreshedbooleantrue表示该页面是被重新加载的(调用refresh9+接口),false表示该页面是新加载的。

示例:

// xxx.ets
import web_webview from '@ohos.web.webview'@Entry
@Component
struct WebComponent {controller: web_webview.WebviewController = new web_webview.WebviewController()build() {Column() {Web({ src: 'www.example.com', controller: this.controller }).onRefreshAccessedHistory((event) => {if (event) {console.log('url:' + event.url + ' isReload:' + event.isRefreshed)}})}}
}

onSslErrorReceive(deprecated)

onSslErrorReceive(callback: (event?: { handler: Function, error: object }) => void)

通知用户加载资源时发生SSL错误。

说明:

从API version 8开始支持,从API version 9开始废弃。建议使用onSslErrorEventReceive9+替代。

onFileSelectorShow(deprecated)

onFileSelectorShow(callback: (event?: { callback: Function, fileSelector: object }) => void)

调用此函数以处理具有“文件”输入类型的HTML表单,以响应用户按下的“选择文件”按钮。

说明:

从API version 8开始支持,从API version 9开始废弃。建议使用onShowFileSelector9+替代。

onRenderExited9+

onRenderExited(callback: (event?: { renderExitReason: RenderExitReason }) => void)

应用渲染进程异常退出时触发该回调。

参数:

参数名参数类型参数描述
renderExitReasonRenderExitReason渲染进程异常退出的具体原因。

示例:

// xxx.ets
import web_webview from '@ohos.web.webview'@Entry
@Component
struct WebComponent {controller: web_webview.WebviewController = new web_webview.WebviewController()build() {Column() {Web({ src: 'chrome://crash/', controller: this.controller }).onRenderExited((event) => {if (event) {console.log('reason:' + event.renderExitReason)}})}}
}

onShowFileSelector9+

onShowFileSelector(callback: (event?: { result: FileSelectorResult, fileSelector: FileSelectorParam }) => boolean)

调用此函数以处理具有“文件”输入类型的HTML表单,以响应用户按下的“选择文件”按钮。

参数:

参数名参数类型参数描述
resultFileSelectorResult用于通知Web组件文件选择的结果。
fileSelectorFileSelectorParam文件选择器的相关信息。

返回值:

类型说明
boolean当返回值为true时,用户可以调用系统提供的弹窗能力。当回调返回false时,函数中绘制的自定义弹窗无效。

示例:

// xxx.ets
import web_webview from '@ohos.web.webview';
import picker from '@ohos.file.picker';
import { BusinessError } from '@ohos.base';@Entry
@Component
struct WebComponent {controller: web_webview.WebviewController = new web_webview.WebviewController()build() {Column() {Web({ src: $rawfile('index.html'), controller: this.controller }).onShowFileSelector((event) => {console.log('MyFileUploader onShowFileSelector invoked')const documentSelectOptions = new picker.DocumentSelectOptions();let uri: string | null = null;const documentViewPicker = new picker.DocumentViewPicker();documentViewPicker.select(documentSelectOptions).then((documentSelectResult) => {uri = documentSelectResult[0];console.info('documentViewPicker.select to file succeed and uri is:' + uri);if (event) {event.result.handleFileList([uri]);}}).catch((err: BusinessError) => {console.error(`Invoke documentViewPicker.select failed, code is ${err.code}, message is ${err.message}`);})return true})}}
}

加载的html文件。

<!DOCTYPE html>
<html>
<head><meta name="viewport" content="width=device-width, initial-scale=1.0" charset="utf-8">
</head>
<body><form id="upload-form" enctype="multipart/form-data"><input type="file" id="upload" name="upload"/></form>
</body>
</html>

onResourceLoad9+

onResourceLoad(callback: (event: {url: string}) => void)

通知Web组件所加载的资源文件url信息。

参数:

参数名参数类型参数描述
urlstring所加载的资源文件url信息。

示例:

// xxx.ets
import web_webview from '@ohos.web.webview'@Entry
@Component
struct WebComponent {controller: web_webview.WebviewController = new web_webview.WebviewController()build() {Column() {Web({ src: 'www.example.com', controller: this.controller }).onResourceLoad((event) => {console.log('onResourceLoad: ' + event.url)})}}
}

onScaleChange9+

onScaleChange(callback: (event: {oldScale: number, newScale: number}) => void)

当前页面显示比例的变化时触发该回调。

参数:

参数名参数类型参数描述
oldScalenumber变化前的显示比例百分比。
newScalenumber变化后的显示比例百分比。

示例:

// xxx.ets
import web_webview from '@ohos.web.webview'@Entry
@Component
struct WebComponent {controller: web_webview.WebviewController = new web_webview.WebviewController()build() {Column() {Web({ src: 'www.example.com', controller: this.controller }).onScaleChange((event) => {console.log('onScaleChange changed from ' + event.oldScale + ' to ' + event.newScale)})}}
}

onUrlLoadIntercept(deprecated)

onUrlLoadIntercept(callback: (event?: { data:string | WebResourceRequest }) => boolean)

当Web组件加载url之前触发该回调,用于判断是否阻止此次访问。默认允许加载。 从API version 10开始不再维护,建议使用onLoadIntercept10+代替。

参数:

参数名参数类型参数描述
datastring | WebResourceRequesturl的相关信息。

返回值:

类型说明
boolean返回true表示阻止此次加载,否则允许此次加载。

示例:

// xxx.ets
import web_webview from '@ohos.web.webview'@Entry
@Component
struct WebComponent {controller: web_webview.WebviewController = new web_webview.WebviewController()build() {Column() {Web({ src: 'www.example.com', controller: this.controller }).onUrlLoadIntercept((event) => {if (event) {console.log('onUrlLoadIntercept ' + event.data.toString())}return true})}}
}

onInterceptRequest9+

onInterceptRequest(callback: (event?: { request: WebResourceRequest}) => WebResourceResponse)

当Web组件加载url之前触发该回调,用于拦截url并返回响应数据。

参数:

参数名参数类型参数描述
requestWebResourceRequesturl请求的相关信息。

返回值:

类型说明
WebResourceResponse返回响应数据则按照响应数据加载,无响应数据则返回null表示按照原来的方式加载。

示例:

// xxx.ets
import web_webview from '@ohos.web.webview'@Entry
@Component
struct WebComponent {controller: web_webview.WebviewController = new web_webview.WebviewController()responseweb: WebResourceResponse = new WebResourceResponse()heads:Header[] = new Array()@State webdata: string = "<!DOCTYPE html>\n" +"<html>\n"+"<head>\n"+"<title>intercept test</title>\n"+"</head>\n"+"<body>\n"+"<h1>intercept test</h1>\n"+"</body>\n"+"</html>"build() {Column() {Web({ src: 'www.example.com', controller: this.controller }).onInterceptRequest((event) => {if (event) {console.log('url:' + event.request.getRequestUrl())}let head1:Header = {headerKey:"Connection",headerValue:"keep-alive"}let head2:Header = {headerKey:"Cache-Control",headerValue:"no-cache"}let length = this.heads.push(head1)length = this.heads.push(head2)this.responseweb.setResponseHeader(this.heads)this.responseweb.setResponseData(this.webdata)this.responseweb.setResponseEncoding('utf-8')this.responseweb.setResponseMimeType('text/html')this.responseweb.setResponseCode(200)this.responseweb.setReasonMessage('OK')return this.responseweb})}}
}

onHttpAuthRequest9+

onHttpAuthRequest(callback: (event?: { handler: HttpAuthHandler, host: string, realm: string}) => boolean)

通知收到http auth认证请求。

参数:

参数名参数类型参数描述
handlerHttpAuthHandler通知Web组件用户操作行为。
hoststringHTTP身份验证凭据应用的主机。
realmstringHTTP身份验证凭据应用的域。

返回值:

类型说明
boolean返回false表示此次认证失败,否则成功。

示例:

// xxx.ets
import web_webview from '@ohos.web.webview'
@Entry
@Component
struct WebComponent {controller: web_webview.WebviewController = new web_webview.WebviewController()httpAuth: boolean = falsebuild() {Column() {Web({ src: 'www.example.com', controller: this.controller }).onHttpAuthRequest((event) => {if (event) {AlertDialog.show({title: 'onHttpAuthRequest',message: 'text',primaryButton: {value: 'cancel',action: () => {event.handler.cancel()}},secondaryButton: {value: 'ok',action: () => {this.httpAuth = event.handler.isHttpAuthInfoSaved()if (this.httpAuth == false) {web_webview.WebDataBase.saveHttpAuthCredentials(event.host,event.realm,"2222","2222")event.handler.cancel()}}},cancel: () => {event.handler.cancel()}})}return true})}}
}

onSslErrorEventReceive9+

onSslErrorEventReceive(callback: (event: { handler: SslErrorHandler, error: SslError }) => void)

通知用户加载资源时发生SSL错误。

参数:

参数名参数类型参数描述
handlerSslErrorHandler通知Web组件用户操作行为。
errorSslError错误码。

示例:

// xxx.ets
import web_webview from '@ohos.web.webview'
@Entry
@Component
struct WebComponent {controller: web_webview.WebviewController = new web_webview.WebviewController()httpAuth: boolean = falsebuild() {Column() {Web({ src: 'www.example.com', controller: this.controller }).onHttpAuthRequest((event) => {if (event) {AlertDialog.show({title: 'onHttpAuthRequest',message: 'text',primaryButton: {value: 'cancel',action: () => {event.handler.cancel()}},secondaryButton: {value: 'ok',action: () => {this.httpAuth = event.handler.isHttpAuthInfoSaved()if (this.httpAuth == false) {web_webview.WebDataBase.saveHttpAuthCredentials(event.host,event.realm,"2222","2222")event.handler.cancel()}}},cancel: () => {event.handler.cancel()}})}return true})}}
}

onClientAuthenticationRequest9+

onClientAuthenticationRequest(callback: (event: {handler : ClientAuthenticationHandler, host : string, port : number, keyTypes : Array<string>, issuers : Array<string>}) => void)

通知用户收到SSL客户端证书请求事件。

参数:

参数名参数类型参数描述
handlerClientAuthenticationHandler通知Web组件用户操作行为。
hoststring请求证书服务器的主机名。
portnumber请求证书服务器的端口号。
keyTypesArray<string>可接受的非对称秘钥类型。
issuersArray<string>与私钥匹配的证书可接受颁发者。

示例:

未对接证书管理的双向认证。

// xxx.ets API9
import web_webview from '@ohos.web.webview'
@Entry
@Component
struct WebComponent {controller: web_webview.WebviewController = new web_webview.WebviewController()build() {Column() {Web({ src: 'www.example.com', controller: this.controller }).onClientAuthenticationRequest((event) => {AlertDialog.show({title: 'onClientAuthenticationRequest',message: 'text',primaryButton: {value: 'confirm',action: () => {event.handler.confirm("/system/etc/user.pk8", "/system/etc/chain-user.pem")}},secondaryButton: {value: 'cancel',action: () => {event.handler.cancel()}},cancel: () => {event.handler.ignore()}})})}}
}

对接证书管理的双向认证。

  1. 构造单例对象GlobalContext。

    // GlobalContext.ts
    export class GlobalContext {private constructor() {}private static instance: GlobalContext;private _objects = new Map<string, Object>();public static getContext(): GlobalContext {if (!GlobalContext.instance) {GlobalContext.instance = new GlobalContext();}return GlobalContext.instance;}getObject(value: string): Object | undefined {return this._objects.get(value);}setObject(key: string, objectClass: Object): void {this._objects.set(key, objectClass);}
    }

  2. 实现双向认证。

    // xxx.ets API10
    import common from '@ohos.app.ability.common';
    import Want from '@ohos.app.ability.Want';
    import web_webview from '@ohos.web.webview'
    import { BusinessError } from '@ohos.base';
    import bundleManager from '@ohos.bundle.bundleManager'
    import { GlobalContext } from '../GlobalContext'let uri = "";export default class CertManagerService {private static sInstance: CertManagerService;private authUri = "";private appUid = "";public static getInstance(): CertManagerService {if (CertManagerService.sInstance == null) {CertManagerService.sInstance = new CertManagerService();}return CertManagerService.sInstance;}async grantAppPm(callback: (message: string) => void) {let message = '';let bundleFlags = bundleManager.BundleFlag.GET_BUNDLE_INFO_DEFAULT | bundleManager.BundleFlag.GET_BUNDLE_INFO_WITH_APPLICATION;//注:com.example.myapplication需要写实际应用名称try {bundleManager.getBundleInfoForSelf(bundleFlags).then((data) => {console.info('getBundleInfoForSelf successfully. Data: %{public}s', JSON.stringify(data));this.appUid = data.appInfo.uid.toString();}).catch((err: BusinessError) => {console.error('getBundleInfoForSelf failed. Cause: %{public}s', err.message);});} catch (err) {let message = (err as BusinessError).message;console.error('getBundleInfoForSelf failed: %{public}s', message);}//注:需要在MainAbility.ts文件的onCreate函数里添加GlobalContext.getContext().setObject("AbilityContext", this.context)let abilityContext = GlobalContext.getContext().getObject("AbilityContext") as common.UIAbilityContextawait abilityContext.startAbilityForResult({bundleName: "com.ohos.certmanager",abilityName: "MainAbility",uri: "requestAuthorize",parameters: {appUid: this.appUid, //传入申请应用的appUid}} as Want).then((data: common.AbilityResult) => {if (!data.resultCode && data.want) {if (data.want.parameters) {this.authUri = data.want.parameters.authUri as string; //授权成功后获取返回的authUri}}})message += "after grantAppPm authUri: " + this.authUri;uri = this.authUri;callback(message)}}@Entry@Componentstruct WebComponent {controller: web_webview.WebviewController = new web_webview.WebviewController();@State message: string = 'Hello World' //message主要是调试观察使用certManager = CertManagerService.getInstance();build() {Row() {Column() {Row() {//第一步:需要先进行授权,获取到uriButton('GrantApp').onClick(() => {this.certManager.grantAppPm((data) => {this.message = data;});})//第二步:授权后,双向认证会通过onClientAuthenticationRequest回调将uri传给web进行认证Button("ClientCertAuth").onClick(() => {this.controller.loadUrl('https://www.example2.com'); //支持双向认证的服务器网站})}Web({ src: 'https://www.example1.com', controller: this.controller }).fileAccess(true).javaScriptAccess(true).domStorageAccess(true).onlineImageAccess(true).onClientAuthenticationRequest((event) => {AlertDialog.show({title: 'ClientAuth',message: 'Text',confirm: {value: 'Confirm',action: () => {event.handler.confirm(uri);}},cancel: () => {event.handler.cancel();}})})}}.width('100%').height('100%')}}

onPermissionRequest9+

onPermissionRequest(callback: (event?: { request: PermissionRequest }) => void)

通知收到获取权限请求。

参数:

参数名参数类型参数描述
requestPermissionRequest通知Web组件用户操作行为。

示例:

// xxx.ets
import web_webview from '@ohos.web.webview'@Entry
@Component
struct WebComponent {controller: web_webview.WebviewController = new web_webview.WebviewController()build() {Column() {Web({ src: $rawfile('index.html'), controller: this.controller }).onPermissionRequest((event) => {if (event) {AlertDialog.show({title: 'title',message: 'text',primaryButton: {value: 'deny',action: () => {event.request.deny()}},secondaryButton: {value: 'onConfirm',action: () => {event.request.grant(event.request.getAccessibleResource())}},cancel: () => {event.request.deny()}})}})}}
}

加载的html文件。

 <!-- index.html --><!DOCTYPE html><html><head><meta charset="UTF-8"></head><body><video id="video" width="500px" height="500px" autoplay="autoplay"></video><canvas id="canvas" width="500px" height="500px"></canvas><br><input type="button" title="HTML5摄像头" value="开启摄像头" onclick="getMedia()"/><script>function getMedia(){let constraints = {video: {width: 500, height: 500},audio: true};//获取video摄像头区域let video = document.getElementByld("video");//返回的Promise对象let promise = navigator.mediaDevices.getUserMedia(constraints);//then()异步,调用MediaStream对象作为参数promise.then(function (MediaStream) {video.srcObject = MediaStream;video.play();});}</script></body></html>

onContextMenuShow9+

onContextMenuShow(callback: (event?: { param: WebContextMenuParam, result: WebContextMenuResult }) => boolean)

长按特定元素(例如图片,链接)或鼠标右键,跳出菜单。

参数:

参数名参数类型参数描述
paramWebContextMenuParam菜单相关参数。
resultWebContextMenuResult菜单相应事件传入内核。

返回值:

类型说明
boolean自定义菜单返回true,触发的自定义菜单无效返回false。

示例:

// xxx.ets
import web_webview from '@ohos.web.webview'
import pasteboard from '@ohos.pasteboard'
const TAG = 'ContextMenu';@Entry
@Component
struct WebComponent {controller: web_webview.WebviewController = new web_webview.WebviewController()private result: WebContextMenuResult | undefined = undefined;@State linkUrl: string = '';@State offsetX: number = 0;@State offsetY: number = 0;@State showMenu: boolean = false;@Builder//构建自定义菜单及触发功能接口MenuBuilder(){//以垂直列表形式显示的菜单。Menu(){//展示菜单Menu中具体的item菜单项。MenuItem({content: '复制图片',}).width(100).height(50).onClick(() => {this.result?.copyImage();this.showMenu = false;})MenuItem({content: '剪切',}).width(100).height(50).onClick(() => {this.result?.cut();this.showMenu = false;})MenuItem({content: '复制',}).width(100).height(50).onClick(() => {this.result?.copy();this.showMenu = false;})MenuItem({content: '粘贴',}).width(100).height(50).onClick(() => {this.result?.paste();this.showMenu = false;})MenuItem({content: '复制链接',}).width(100).height(50).onClick(() => {let pasteData = pasteboard.createData('text/plain', this.linkUrl);pasteboard.getSystemPasteboard().setData(pasteData, (error)=>{if(error){return;}})this.showMenu = false;})MenuItem({content: '全选',}).width(100).height(50).onClick(() => {this.result?.selectAll();this.showMenu = false;})}.width(150).height(300)}build() {Column() {Web({ src: $rawfile("index.html"), controller: this.controller })//触发自定义弹窗.onContextMenuShow((event) => {if (event) {this.result = event.resultconsole.info("x coord = " + event.param.x())console.info("link url = " + event.param.getLinkUrl())this.linkUrl = event.param.getLinkUrl()}console.info(TAG, `x: ${this.offsetX}, y: ${this.offsetY}`);this.showMenu = true;this.offsetX = 250;this.offsetY = Math.max(px2vp(event?.param.y() ?? 0) - 0, 0);return true}).bindPopup(this.showMenu,{builder: this.MenuBuilder(),enableArrow: false,placement: Placement.LeftTop,offset: { x: this.offsetX, y: this.offsetY},mask: false,onStateChange: (e) => {if(!e.isVisible){this.showMenu = false;this.result!.closeContextMenu();}}})}}
}

加载的html文件。

<!-- index.html -->
<!DOCTYPE html>
<html lang="en">
<body><h1>onContextMenuShow</h1><a href="http://www.example.com" style="font-size:27px">链接www.example.com</a>//rawfile下放任意一张图片命名为example.png<div><img src="example.png"></div><p>选中文字鼠标右键弹出菜单</p>
</body>
</html>

onContextMenuHide11+

onContextMenuHide(callback: OnContextMenuHideCallback)

长按特定元素(例如图片,链接)或鼠标右键,隐藏菜单。

参数:

参数名参数类型参数描述
callbackOnContextMenuHideCallback菜单相关参数。

示例:

// xxx.ets
import web_webview from '@ohos.web.webview'@Entry
@Component
struct WebComponent {controller: web_webview.WebviewController = new web_webview.WebviewController()build() {Column() {Web({ src: 'www.example.com', controller: this.controller }).onContextMenuHide(() => {console.log("onContextMenuHide callback")})}}
}

onScroll9+

onScroll(callback: (event: {xOffset: number, yOffset: number}) => void)

通知网页滚动条滚动位置。

参数:

参数名参数类型参数描述
xOffsetnumber以网页最左端为基准,水平滚动条滚动所在位置。
yOffsetnumber以网页最上端为基准,竖直滚动条滚动所在位置。

示例:

// xxx.ets
import web_webview from '@ohos.web.webview'@Entry
@Component
struct WebComponent {controller: web_webview.WebviewController = new web_webview.WebviewController()build() {Column() {Web({ src: 'www.example.com', controller: this.controller }).onScroll((event) => {console.info("x = " + event.xOffset)console.info("y = " + event.yOffset)})}}
}

onGeolocationShow

onGeolocationShow(callback: (event?: { origin: string, geolocation: JsGeolocation }) => void)

通知用户收到地理位置信息获取请求。

参数:

参数名参数类型参数描述
originstring指定源的字符串索引。
geolocationJsGeolocation通知Web组件用户操作行为。

示例:

// xxx.ets
import web_webview from '@ohos.web.webview'@Entry
@Component
struct WebComponent {controller: web_webview.WebviewController = new web_webview.WebviewController()build() {Column() {Web({ src:$rawfile('index.html'), controller:this.controller }).geolocationAccess(true).onGeolocationShow((event) => {if (event) {AlertDialog.show({title: 'title',message: 'text',confirm: {value: 'onConfirm',action: () => {event.geolocation.invoke(event.origin, true, true)}},cancel: () => {event.geolocation.invoke(event.origin, false, true)}})}})}}
}

加载的html文件。

<!DOCTYPE html>
<html>
<body>
<p id="locationInfo">位置信息</p>
<button onclick="getLocation()">获取位置</button>
<script>
var locationInfo=document.getElementById("locationInfo");
function getLocation(){if (navigator.geolocation) {<!-- 前端页面访问设备地理位置 -->navigator.geolocation.getCurrentPosition(showPosition);}
}
function showPosition(position){locationInfo.innerHTML="Latitude: " + position.coords.latitude + "<br />Longitude: " + position.coords.longitude;
}
</script>
</body>
</html>

onGeolocationHide

onGeolocationHide(callback: () => void)

通知用户先前被调用onGeolocationShow时收到地理位置信息获取请求已被取消。

参数:

参数名参数类型参数描述
callback() => void地理位置信息获取请求已被取消的回调函数。

示例:

// xxx.ets
import web_webview from '@ohos.web.webview'@Entry
@Component
struct WebComponent {controller: web_webview.WebviewController = new web_webview.WebviewController()build() {Column() {Web({ src:'www.example.com', controller:this.controller }).geolocationAccess(true).onGeolocationHide(() => {console.log("onGeolocationHide...")})}}
}

onFullScreenEnter9+

onFullScreenEnter(callback: (event: { handler: FullScreenExitHandler }) => void)

通知开发者web组件进入全屏模式。

参数:

参数名参数类型参数描述
handlerFullScreenExitHandler用于退出全屏模式的函数句柄。

示例:

// xxx.ets
import web_webview from '@ohos.web.webview'@Entry
@Component
struct WebComponent {controller: web_webview.WebviewController = new web_webview.WebviewController()handler: FullScreenExitHandler | null = nullbuild() {Column() {Web({ src:'www.example.com', controller:this.controller }).onFullScreenEnter((event) => {console.log("onFullScreenEnter...")this.handler = event.handler})}}
}

onFullScreenExit9+

onFullScreenExit(callback: () => void)

通知开发者web组件退出全屏模式。

参数:

参数名参数类型参数描述
callback() => void退出全屏模式时的回调函数。

示例:

// xxx.ets
import web_webview from '@ohos.web.webview'@Entry
@Component
struct WebComponent {controller: web_webview.WebviewController = new web_webview.WebviewController()handler: FullScreenExitHandler | null = nullbuild() {Column() {Web({ src:'www.example.com', controller:this.controller }).onFullScreenExit(() => {console.log("onFullScreenExit...")if (this.handler) {this.handler.exitFullScreen()}}).onFullScreenEnter((event) => {this.handler = event.handler})}}
}

onWindowNew9+

onWindowNew(callback: (event: {isAlert: boolean, isUserTrigger: boolean, targetUrl: string, handler: ControllerHandler}) => void)

使能multiWindowAccess情况下,通知用户新建窗口请求。 若不调用event.handler.setWebController接口,会造成render进程阻塞。 如果不需要打开新窗口,在调用event.handler.setWebController接口时须设置成null。

参数:

参数名参数类型参数描述
isAlertbooleantrue代表请求创建对话框,false代表新标签页。
isUserTriggerbooleantrue代表用户触发,false代表非用户触发。
targetUrlstring目标url。
handlerControllerHandler用于设置新建窗口的WebviewController实例。

示例:

// xxx.ets
import web_webview from '@ohos.web.webview'//在同一page页有两个web组件。在WebComponent新开窗口时,会跳转到NewWebViewComp。
@CustomDialog
struct NewWebViewComp {
controller?: CustomDialogController
webviewController1: web_webview.WebviewController = new web_webview.WebviewController()
build() {Column() {Web({ src: "", controller: this.webviewController1 }).javaScriptAccess(true).multiWindowAccess(false).onWindowExit(()=> {console.info("NewWebViewComp onWindowExit")if (this.controller) {this.controller.close()}})}}
}@Entry
@Component
struct WebComponent {controller: web_webview.WebviewController = new web_webview.WebviewController()dialogController: CustomDialogController | null = nullbuild() {Column() {Web({ src: 'www.example.com', controller: this.controller }).javaScriptAccess(true)//需要使能multiWindowAccess.multiWindowAccess(true).allowWindowOpenMethod(true).onWindowNew((event) => {if (this.dialogController) {this.dialogController.close()}let popController:web_webview.WebviewController = new web_webview.WebviewController()this.dialogController = new CustomDialogController({builder: NewWebViewComp({webviewController1: popController})})this.dialogController.open()//将新窗口对应WebviewController返回给Web内核。//如果不需要打开新窗口请调用event.handler.setWebController接口设置成null。//若不调用event.handler.setWebController接口,会造成render进程阻塞。event.handler.setWebController(popController)})}}
}

onWindowExit9+

onWindowExit(callback: () => void)

通知用户窗口关闭请求。

参数:

参数名参数类型参数描述
callback() => void窗口请求关闭的回调函数。

示例:

// xxx.ets
import web_webview from '@ohos.web.webview'@Entry
@Component
struct WebComponent {controller: web_webview.WebviewController = new web_webview.WebviewController()build() {Column() {Web({ src:'www.example.com', controller: this.controller }).onWindowExit(() => {console.log("onWindowExit...")})}}
}

onSearchResultReceive9+

onSearchResultReceive(callback: (event?: {activeMatchOrdinal: number, numberOfMatches: number, isDoneCounting: boolean}) => void): WebAttribute

回调通知调用方网页页内查找的结果。

参数:

参数名参数类型参数描述
activeMatchOrdinalnumber当前匹配的查找项的序号(从0开始)。
numberOfMatchesnumber所有匹配到的关键词的个数。
isDoneCountingboolean当次页内查找操作是否结束。该方法可能会回调多次,直到isDoneCounting为true为止。

示例:

// xxx.ets
import web_webview from '@ohos.web.webview'@Entry
@Component
struct WebComponent {controller: web_webview.WebviewController = new web_webview.WebviewController()build() {Column() {Web({ src: 'www.example.com', controller: this.controller }).onSearchResultReceive(ret => {if (ret) {console.log("on search result receive:" + "[cur]" + ret.activeMatchOrdinal +"[total]" + ret.numberOfMatches + "[isDone]"+ ret.isDoneCounting)}})}}
}

onDataResubmitted9+

onDataResubmitted(callback: (event: {handler: DataResubmissionHandler}) => void)

设置网页表单可以重新提交时触发的回调函数。

参数:

参数名参数类型参数描述
handlerDataResubmissionHandler表单数据重新提交句柄。

示例:

// xxx.ets
import web_webview from '@ohos.web.webview'
import business_error from '@ohos.base';
@Entry
@Component
struct WebComponent {controller: web_webview.WebviewController = new web_webview.WebviewController()build() {Column() {//在网页中点击提交之后,点击refresh按钮可以重新提交时的触发函数。Button('refresh').onClick(() => {try {this.controller.refresh();} catch (error) {let e: business_error.BusinessError = error as business_error.BusinessError;console.error(`ErrorCode: ${e.code},  Message: ${e.message}`);}})Web({ src:$rawfile('index.html'), controller: this.controller }).onDataResubmitted((event) => {console.log('onDataResubmitted')event.handler.resend();})}}
}

加载的html文件。

 <!-- index.html --><!DOCTYPE html><html><head><meta charset="utf-8"></head><body><form action="http://httpbin.org/post" method="post"><input type="text" name="username"><input type="submit" name="提交"></form></body></html>

onPageVisible9+

onPageVisible(callback: (event: {url: string}) => void)

设置旧页面不再呈现,新页面即将可见时触发的回调函数。

参数:

参数名参数类型参数描述
urlstring旧页面不再呈现,新页面即将可见时新页面的url地址。

示例:

// xxx.ets
import web_webview from '@ohos.web.webview'
@Entry
@Component
struct WebComponent {controller: web_webview.WebviewController = new web_webview.WebviewController()build() {Column() {Web({ src:'www.example.com', controller: this.controller }).onPageVisible((event) => {console.log('onPageVisible url:' + event.url)})}}
}

onInterceptKeyEvent9+

onInterceptKeyEvent(callback: (event: KeyEvent) => boolean)

设置键盘事件的回调函数,该回调在被Webview使用前触发。

参数:

参数名参数类型参数描述
eventKeyEvent触发的KeyEvent事件。

返回值:

类型说明
boolean回调函数通过返回boolean类型值来决定是否继续将该KeyEvent传入Webview内核。

示例:

// xxx.ets
import web_webview from '@ohos.web.webview'
@Entry
@Component
struct WebComponent {controller: web_webview.WebviewController = new web_webview.WebviewController()build() {Column() {Web({ src:'www.example.com', controller: this.controller }).onInterceptKeyEvent((event) => {if (event.keyCode == 2017 || event.keyCode == 2018) {console.info(`onInterceptKeyEvent get event.keyCode ${event.keyCode}`)return true;}return false;})}}
}

onTouchIconUrlReceived9+

onTouchIconUrlReceived(callback: (event: {url: string, precomposed: boolean}) => void)

设置接收到apple-touch-icon url地址时的回调函数。

参数:

参数名参数类型参数描述
urlstring接收到的apple-touch-icon url地址。
precomposedboolean对应apple-touch-icon是否为预合成。

示例:

// xxx.ets
import web_webview from '@ohos.web.webview'
@Entry
@Component
struct WebComponent {controller: web_webview.WebviewController = new web_webview.WebviewController()build() {Column() {Web({ src:'www.baidu.com', controller: this.controller }).onTouchIconUrlReceived((event) => {console.log('onTouchIconUrlReceived:' + JSON.stringify(event))})}}
}

onFaviconReceived9+

onFaviconReceived(callback: (event: { favicon: PixelMap }) => void)

设置应用为当前页面接收到新的favicon时的回调函数。

参数:

参数名参数类型参数描述
faviconPixelMap接收到的favicon图标的PixelMap对象。

示例:

// xxx.ets
import web_webview from '@ohos.web.webview'
import image from "@ohos.multimedia.image"
@Entry
@Component
struct WebComponent {controller: web_webview.WebviewController = new web_webview.WebviewController()@State icon: image.PixelMap | undefined = undefined;build() {Column() {Web({ src:'www.example.com', controller: this.controller }).onFaviconReceived((event) => {console.log('onFaviconReceived');this.icon = event.favicon;})}}
}

onAudioStateChanged10+

onAudioStateChanged(callback: (event: { playing: boolean }) => void)

设置网页上的音频播放状态发生改变时的回调函数。

参数:

参数名参数类型参数描述
playingboolean当前页面的音频播放状态,true表示正在播放,false表示未播放。

示例:

// xxx.ets
import web_webview from '@ohos.web.webview'
@Entry
@Component
struct WebComponent {controller: web_webview.WebviewController = new web_webview.WebviewController()@State playing: boolean = falsebuild() {Column() {Web({ src:'www.example.com', controller: this.controller }).onAudioStateChanged(event => {this.playing = event.playingconsole.debug('onAudioStateChanged playing: ' + this.playing)})}}
}

onFirstContentfulPaint10+

onFirstContentfulPaint(callback: (event?: { navigationStartTick: number, firstContentfulPaintMs: number }) => void)

设置网页首次内容绘制回调函数。

参数:

参数名参数类型参数描述
navigationStartTicknumbernavigation开始的时间,单位以微秒表示。
firstContentfulPaintMsnumber从navigation开始第一次绘制内容的时间,单位是以毫秒表示。

示例:

// xxx.ets
import web_webview from '@ohos.web.webview'
@Entry
@Component
struct WebComponent {controller: web_webview.WebviewController = new web_webview.WebviewController()build() {Column() {Web({ src:'www.example.com', controller: this.controller }).onFirstContentfulPaint(event => {if (event) {console.log("onFirstContentfulPaint:" + "[navigationStartTick]:" +event.navigationStartTick + ", [firstContentfulPaintMs]:" +event.firstContentfulPaintMs)}})}}
}

onLoadIntercept10+

onLoadIntercept(callback: (event: { data: WebResourceRequest }) => boolean)

当Web组件加载url之前触发该回调,用于判断是否阻止此次访问。默认允许加载。

参数:

参数名参数类型参数描述
dataWebResourceRequesturl请求的相关信息。

返回值:

类型说明
boolean返回true表示阻止此次加载,否则允许此次加载。

示例:

// xxx.ets
import web_webview from '@ohos.web.webview'@Entry
@Component
struct WebComponent {controller: web_webview.WebviewController = new web_webview.WebviewController()build() {Column() {Web({ src: 'www.example.com', controller: this.controller }).onLoadIntercept((event) => {console.log('url:' + event.data.getRequestUrl())console.log('isMainFrame:' + event.data.isMainFrame())console.log('isRedirect:' + event.data.isRedirect())console.log('isRequestGesture:' + event.data.isRequestGesture())return true})}}
}

最后,有很多小伙伴不知道学习哪些鸿蒙开发技术?不知道需要重点掌握哪些鸿蒙应用开发知识点?而且学习时频繁踩坑,最终浪费大量时间。所以有一份实用的鸿蒙(Harmony NEXT)资料用来跟着学习是非常有必要的。 

这份鸿蒙(Harmony NEXT)资料包含了鸿蒙开发必掌握的核心知识要点,内容包含了ArkTS、ArkUI开发组件、Stage模型、多端部署、分布式应用开发、音频、视频、WebGL、OpenHarmony多媒体技术、Napi组件、OpenHarmony内核、Harmony南向开发、鸿蒙项目实战等等)鸿蒙(Harmony NEXT)技术知识点。

希望这一份鸿蒙学习资料能够给大家带来帮助,有需要的小伙伴自行领取,限时开源,先到先得~无套路领取!!

获取这份完整版高清学习路线,请点击→纯血版全套鸿蒙HarmonyOS学习资料

鸿蒙(Harmony NEXT)最新学习路线

  •  HarmonOS基础技能

  • HarmonOS就业必备技能 
  •  HarmonOS多媒体技术

  • 鸿蒙NaPi组件进阶

  • HarmonOS高级技能

  • 初识HarmonOS内核 
  • 实战就业级设备开发

有了路线图,怎么能没有学习资料呢,小编也准备了一份联合鸿蒙官方发布笔记整理收纳的一套系统性的鸿蒙(OpenHarmony )学习手册(共计1236页)鸿蒙(OpenHarmony )开发入门教学视频,内容包含:ArkTS、ArkUI、Web开发、应用模型、资源分类…等知识点。

获取以上完整版高清学习路线,请点击→纯血版全套鸿蒙HarmonyOS学习资料

《鸿蒙 (OpenHarmony)开发入门教学视频》

《鸿蒙生态应用开发V2.0白皮书》

图片

《鸿蒙 (OpenHarmony)开发基础到实战手册》

OpenHarmony北向、南向开发环境搭建

图片

 《鸿蒙开发基础》

  • ArkTS语言
  • 安装DevEco Studio
  • 运用你的第一个ArkTS应用
  • ArkUI声明式UI开发
  • .……

图片

 《鸿蒙开发进阶》

  • Stage模型入门
  • 网络管理
  • 数据管理
  • 电话服务
  • 分布式应用开发
  • 通知与窗口管理
  • 多媒体技术
  • 安全技能
  • 任务管理
  • WebGL
  • 国际化开发
  • 应用测试
  • DFX面向未来设计
  • 鸿蒙系统移植和裁剪定制
  • ……

图片

《鸿蒙进阶实战》

  • ArkTS实践
  • UIAbility应用
  • 网络案例
  • ……

图片

 获取以上完整鸿蒙HarmonyOS学习资料,请点击→纯血版全套鸿蒙HarmonyOS学习资料

总结

总的来说,华为鸿蒙不再兼容安卓,对中年程序员来说是一个挑战,也是一个机会。只有积极应对变化,不断学习和提升自己,他们才能在这个变革的时代中立于不败之地。 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/278428.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

开发验证一切正常,而测试人员在性能测试时偶发报错,如何解决?

在业务系统逻辑实现中&#xff0c;经常涉及异步执行、异步更新场景的开发和使用。但在性能测试中&#xff0c;经常会出现因为异步逻辑设计不合理引发的不可预知问题&#xff0c;比如在开发验证时一切正常&#xff0c;测试人员在性能测试时偶发报错。 本文从Spring事务、业务逻辑…

前端三件套 | 综合练习:模拟抽奖活动,实现一个简单的随机抽取并显示三名获胜者

随机运行结果如下&#xff1a; 参考代码如下&#xff1a; <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><tit…

P2934 [USACO09JAN] Safe Travel G 题解

题意 给定一张 n n n 个点 m m m 条边的无向图&#xff0c;对于每个除 1 1 1 以外的点 u u u&#xff0c;求在不允许经过原来从 1 1 1 到 u u u 的最短路径的最后一条边时&#xff0c; 1 1 1 到 u u u 的最短路。 保证 1 1 1 到其他点的最短路唯一&#xff0c;无解输出…

git撤回代码提交commit或者修改commit提交注释

执行commit后&#xff0c;还没执行push时&#xff0c;想要撤销之前的提交commit 撤销提交 使用命令&#xff1a; git reset --soft HEAD^命令详解&#xff1a; HEAD^ 表示上一个版本&#xff0c;即上一次的commit&#xff0c;也可以写成HEAD~1 如果进行两次的commit&#xf…

鸿蒙Socket通信示例(TCP通信)

前言 DevEco Studio版本&#xff1a;4.0.0.600 参考链接&#xff1a;OpenHarmony Socket 效果 TCPSocket 1、bind绑定本地IP地址 private bindTcpSocket() {let localAddress resolveIP(wifi.getIpInfo().ipAddress)console.info("111111111 localAddress: " …

配置阿里云加速器

国内镜像中心常用阿里云或者网易云。在本地docker中指定要使用国内加速器的地址后&#xff0c;就可以直接从阿里云镜像中心下载镜像。 2024阿里云-上云采购季-阿里云 根据操作系统来选择。

RequestResponse使用

文章目录 一、Request&Response介绍二、Request 继承体系三、Request 获取请求数据1、获取请求数据方法&#xff08;1&#xff09;、请求行&#xff08;2&#xff09;、请求头&#xff08;3&#xff09;、请求体 2、通过方式获取请求参数3、IDEA模板创建Servlet4、请求参数…

【AUTOSAR】【通信栈】Fls

AUTOSAR专栏——总目录-CSDN博客文章浏览阅读592次。本文主要汇总该专栏文章,以方便各位读者阅读。https://blog.csdn.net/qq_42357877/article/details/132072415?csdn_share_tail=%7B%22type%22%3A%22blog%22%2C%22rType%22%3A%22article%22%2C%22rId%22%3A%22132072415%22…

金融知识分享系列之:MACD指标精讲

金融知识分享系列之&#xff1a;MACD指标精讲 一、MACD指标二、指标原理三、MACD指标参考用法四、MACD计算步骤五、MACD分析要素六、根据快线DIF位置判断趋势七、金叉死叉作为多空信号八、快线位置交叉信号九、指标背离判断行情反转十、差离值的正负十一、差离值的变化十二、指…

C语言之数据在计算机内部的存储

文章目录 一、前言二、类型的基本归类1、整型家族2、浮点数家族3、构造类型4、指针类型 三、整型在内存中的存储1、原码、反码、补码1.1 概念1.2 原码与补码的转换形式1.3 计算机内部的存储编码 2、大小端介绍~~2.1 为什么要有大端和小端之分&#xff1f;2.2 大&#xff08;小&…

https代理相对socks5代理有什么优势?

随着互联网的快速发展&#xff0c;代理服务已成为许多人在访问敏感或地理位置受限的网站时所依赖的工具。其中&#xff0c;HTTPS代理和SOCKS5代理是两种最常用的代理服务类型。本文将探讨HTTPS代理相对SOCKS5代理的优势。 1、安全性 HTTPS代理使用SSL/TLS协议对客户端和代理服…

力扣刷题Days20-151. 反转字符串中的单词(js)

目录 1,题目 2&#xff0c;代码 1&#xff0c;利用js函数 2&#xff0c;双指针 3&#xff0c;双指针加队列 3&#xff0c;学习与总结 1&#xff0c;正则表达式 / \s /&#xff1a; 2&#xff0c;结合使用 split 和正则表达式&#xff1a; 1,题目 给你一个字符串 s &am…

[HNCTF 2022 WEEK2]e@sy_flower

获取基本信息 获取关键字符串 进来“开门红” 上一篇博客才发现这个 按u转换为二进制 有个无效db&#xff0c;最简单的花指令 nop掉 重新u一下p一下 就正常了 然后编译完main函数 int __cdecl __noreturn main(int argc, const char **argv, const char **envp) {signed in…

二、python基础

一、关键字&#xff08;保留字&#xff09; 指在python中赋予特定意义的一类单词&#xff0c;不能将关键字作为函数、变量、类、模块的名称 import keyword#利用内存模块keyword print(keyword.kwlist)#输出所有关键 print(len(keyword.kwlist))#利用内置函数len()输出关键字的…

idea项目mapper.xml中的SQL语句黄色下划线去除

问题描述 当我们使用idea开发java项目时&#xff0c;经常会与数据库打交道&#xff0c;一般在使用mybatis的时候需要写一大堆的mapper.xml以及SQL语句&#xff0c;每当写完SQL语句的时候总是有黄色下划线&#xff0c;看着很不舒服。 解决方案&#xff1a; 修改idea的配置 Edi…

视觉问答(Visual_Question_Answering, VQA)介绍

1.背景 VQA&#xff08;Visual Question Answering&#xff09;指的是&#xff0c;给机器一张图片和一个开放式的的自然语言问题&#xff0c;要求机器输出自然语言答案。答案可以是以下任何形式&#xff1a;短语、单词、 (yes/no)、从几个可能的答案中选择正确答案。VQA是一个…

21-分支和循环语句_while语句(中)(初阶)

21-2 代码准备 getchar()&#xff1a;获取字符 int ch getchar(); //把获取的字符的ASCII码值放在ch中 int main() {int ch getchar();printf("%c\n", ch); //ch存的是该字符的ASCII码值&#xff0c;此处以字符形式打印ASCII码值对应的字符putchar(ch); } 运…

java IO 04 对象处理流,序列化

01.序列化和反序列化的作用 重点&#xff1a; 图&#xff1a; 02.对象流ObjectOutputStream和ObjectInputStream ObjectInputStream&#xff1a; ObjectOutputStream&#xff1a; 例子&#xff1a; 例子&#xff1a; 修改要序列化类的话&#xff0c;会出现不同的uid…

sentinel熔断降级

熔断降级 Slot 责任链上的最后一环&#xff1a;熔断降级 DegradeSlot,熔断降级作为保护系统的一种强大手段,可以根据慢调用、异常比例和异常数进行熔断,并自定义持续时间以实现系统保护 规则配置 规则类中属性解析 与控制面板对应 // 其中资源名称在 AbstractRule 里。 pu…

章节2:单词本该这样记

为什么我们记不住单词&#xff1f; 单词不是被胡编乱造出来的&#xff0c;单词是有规律的&#xff0c;单词是符合人类的逻辑的。 单词实际意思结构意义历史文化 我们要怎么记单词&#xff1f; 掌握单词的结构规律了解与单词有关的历史文化灵活巧计&#xff0c;不要太拘泥于…