整合營銷服務商

          電腦端+手機端+微信端=數據同步管理

          免費咨詢熱線:

          JSP include指令

          nclude指令用于在JSP頁面引入其它內容,可以是JSP文件、html文件和文本文件等,相當于把文件的內容復制到JSP頁面。引入的文件和JSP頁面同時編譯運行。

          使用include指令有以下優點:

          增加代碼的可重用性

          使JSP頁面的代碼結構清晰易懂

          維護簡單

          include的語法如下:

          <%@ include file="URL" %>  1復制代碼類型:[java]

          其中,file指定需要引入文件的相對路徑。

          可以在頁面的任何位置編寫include指令。

          「鏈接」


          asmEdge 將 Rust 強大的性能和 JavaScript 的簡單易用完美結合在一起

          在我之前的文章中,我討論了如何在 WebAssembly 沙箱中運行 JavaScript 程序。 WasmEdge runtime 為云原生 JavaScript 應用程序提供了一個輕量級、高性能且符合 OCI 標準的“容器”。

          然而,JavaScript 是一種“慢”語言。使用 JavaScript 的原因主要是因為它用起來很容易,開發者生產力高,對初學者來說尤其如此。另一方面,WebAssembly 能夠運行用 Rust 等語言編寫的高性能應用程序。有沒有結合 JavaScript 和 Rust 的解決方案? WasmEdge 給出了兩全其美的答案。

          有了 WasmEdge 和 QuickJS,開發者就可以完美搭配這兩個最強大的語言來創造應用程序。就像下面這樣:

          • 該應用程序本身是用 Rust 寫的并被編譯成了 WebAssembly。它可以作為單個 wasm 字節碼文件進行編譯和部署。 它可以由符合 OCI 的容器工具管理,如 Docker Hub、CRI-O 和 k8s。
          • JavaScript 程序嵌入在 Rust 應用程序中。 Rust 程序可以在編譯時包含JavaScript 源代碼,也可以在 runtime 通過文件、STDIN、網絡請求甚至函數調用引入JS。 這樣一來 JavaScript 程序可以由與Rust 程序不同的開發者編寫。
          • Rust 程序可以處理應用程序中的計算密集型任務,而 JavaScript 程序可以處理“業務邏輯”。 例如,Rust 程序可以為 JavaScript 程序準備數據。

          接下來,讓我們看幾個示例。所有示例都在 wasmedge-quickjs repo 的 embed_in_rust 分支中。

          `$ git clone https://github.com/second-state/wasmedge-quickjs
          $ git checkout embed_in_rust`
          

          確保你已經安裝 Rust 和 WasmEdge,這樣才能構建和運行本文中的示例。

          Hello WasmEdge

          main.rs 中的以下 Rust 程序在編譯時嵌入了一個 JavaScript 程序。

          `pub mod quickjs_sys;
          
          ... ...
          
          fn main() {
              use quickjs_sys as q;
              let mut ctx = q::Context::new();
              // include js code
              let code = include_str!("../example_js/demo.js");
              // get args and set into quickjs
              let mut res_args = args_parse();
              res_args.insert(0, "<embedded_no_filename>".to_string());
              ctx.put_args(res_args);
              // run js code
              ctx.eval_str(code, "");
          }`
          

          example_js/demo.js 代碼如下。

          `import * as std from 'std';
          
          print('hello')
          print('args:',...args)
          
          //write fs
          let wf = std.open('demo.txt','w')
          wf.puts('hello quickjs')
          wf.close()
          
          //read fs
          let rf = std.open('demo.txt','r')
          let r = rf.getline()
          print(r)
          rf.close()`
          

          你可以將 Rust + JavaScript 應用程序構建到單個 WebAssembly 字節碼程序中。

          `$ cargo build --target wasm32-wasi --release`
          

          運行它,就看到打印到控制臺的結果了。

          `$ cd example_js
          $ wasmedge --dir .:. ../target/wasm32-wasi/release/quickjs-rs-wasi.wasm`
          

          就是這樣。 Rust 代碼可以通過傳遞參數甚至直接修改包含的 JavaScript 源代碼,將數據傳遞到 JavaScript 代碼中。 JavaScript 代碼還可以通過寫入臨時文件來返回值。

          使用嵌入式 JavaScript 進行圖片識別

          你可以修改 main.rs 中的 Rust 程序以嵌入不同的 JavaScript 程序。 在下面的示例中,讓我們更改為

          `pub mod quickjs_sys;
          
          ... ...
          
          fn main() {
              ... ...
              let code = include_str!("../example_js/tensorflow_lite_demo/main.js");
              ... ...
              ctx.eval_str(code, "");
          }`
          

          main.js 代碼使用 WasmEdge Tensorflow 擴展的 JavaScript API 來調用 ImageNet 讀取和識別圖像模型。

          `import {TensorflowLiteSession} from 'tensorflow_lite'
          import {Image} from 'image'
          
          let img = new Image('./example_js/tensorflow_lite_demo/food.jpg')
          let img_rgb = img.to_rgb().resize(192,192)
          let rgb_pix = img_rgb.pixels()
          
          let session = new TensorflowLiteSession('./example_js/tensorflow_lite_demo/lite-model_aiy_vision_classifier_food_V1_1.tflite')
          session.add_input('input',rgb_pix)
          session.run()
          let output = session.get_output('MobilenetV1/Predictions/Softmax');
          let output_view = new Uint8Array(output)
          let max = 0;
          let max_idx = 0;
          for (var i in output_view){
              let v = output_view[i]
              if(v>max){
                  max = v;
                  max_idx = i;
              }
          }
          print('label index:',max_idx,'\nconfidence:',max/255)`
          

          你可以將 Rust + JavaScript 應用程序構建到單個 WebAssembly 字節碼程序中。 注意 --features=tensorflow 標志,它要求 Rust 編譯器使用 WasmEdge TensorFlow 擴展 API。

          `$ cargo build --target wasm32-wasi --release --features=tensorflow`
          

          運行并查看打印到控制臺的結果。

          `$ cd example_js/tensorflow_lite_demo
          $ wasmedge --dir .:. ../../target/wasm32-wasi/release/quickjs-rs-wasi.wasm`
          

          運行地更快

          運行上面的 Tensorflow 推理示例需要花費 1-2 秒。這在 Web 應用場景中是可以接受的,但還能改進。在上篇文章中,我們提過由于其 AOT(提前編譯器)優化,WasmEdge 是當前速度最快的 WebAssembly runtime。 WasmEdge 提供了一個 wasmedgec 實用程序來將 wasm 文件編譯為原生的 so 共享庫。你可以使用 wasmedge 來運行 so 文件而不是 wasm 文件以獲得更快的性能。

          下面的例子使用了 wasmedgewasmedgec 的擴展版本來支持 WasmEdge Tensorflow 擴展。

          `cd example_js/tensorflow_lite_demo
          $ wasmedgec-tensorflow ../../target/wasm32-wasi/release/quickjs-rs-wasi.wasm quickjs-rs-wasi.so
          $ wasmedge-tensorflow-lite --dir .:. quickjs-rs-wasi.so`
          

          你可以看到圖像分類任務可以在 0.1 秒內完成。這至少是 10 倍的改進!

          so* 共享庫不能跨機器和操作系統移植。你必須在你部署和運行應用程序的機器上運行 wasmedecwasmedec-tensorflow

          下一步

          在 Rust 中嵌入 JavaScript 是一種創建高性能云原生應用程序的強大方法。 下一篇文章中,我們將研究另一種技術方法:在 JavaScript 中嵌入原生庫。

          云原生 WebAssembly 中的 JavaScript 是下一代云和邊緣計算基礎設施中的新興領域。 我們也是剛剛起步! 如果你也感興趣,請加入我們的 WasmEdge 項目或通過提出 feature request issue 告訴我們,你需要的是什么。

          .編寫一個hello.txt文件,寫入下面的話(文件中隨便寫)

          Thank you for visiting me

          <BR>

          I hope you leave footprints

          2.編寫includeHello.jsp

          代碼:

          <%@ page contentType="text/html"%>

          <html>

          <body>

          <font size=4 color=blue>

          <%@ include file="hello.txt"%>//包含hello.txt

          </font>

          </body>

          </html>

          3.運行結果


          主站蜘蛛池模板: 精品国产一区二区三区麻豆| 中文字幕在线视频一区| 无码毛片一区二区三区视频免费播放| 精品视频在线观看一区二区| 四虎精品亚洲一区二区三区| 国产亚洲福利精品一区| 国产吧一区在线视频| 国产在线精品观看一区| 99国产精品一区二区| 亚洲国产成人精品无码一区二区 | 欧洲精品码一区二区三区免费看 | 国产丝袜视频一区二区三区| 精品国产福利一区二区| 精品一区二区三区视频在线观看| 99久久国产精品免费一区二区 | 人妻激情偷乱视频一区二区三区| 成人毛片无码一区二区| 色狠狠一区二区三区香蕉蜜桃| 国产福利一区二区三区在线视频 | 亚洲爆乳精品无码一区二区三区| 亚洲欧洲日韩国产一区二区三区| 一区二区三区精品高清视频免费在线播放| 中文字幕一区二区免费| 在线欧美精品一区二区三区| 国产福利一区二区在线视频| 亚洲福利一区二区精品秒拍| 一区二区精品视频| 国产精品一级香蕉一区| 国产一区三区三区| 国产精品熟女视频一区二区| 久久免费区一区二区三波多野| 国产成人免费一区二区三区| 日产精品久久久一区二区| 国产精品一区二区三区免费| 亚洲色精品三区二区一区| 精品乱人伦一区二区三区| 国产福利一区视频| 亚洲日本久久一区二区va| 中文字幕一区二区三区视频在线| 国产精品视频一区| 久久久久人妻一区精品色|