欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費電子書(shū)等14項超值服

開(kāi)通VIP
跨越邊界: 動(dòng)態(tài)類(lèi)型語(yǔ)言中的 Web 開(kāi)發(fā)策略

2006 年 7 月 28 日

過(guò)去十年的大部分時(shí)間里,Java? 社區一直在使用 JavaServer Pages (JSP) 技術(shù),但現在已開(kāi)始顯現出衰退的跡象。目前,長(cháng)期以來(lái)的慣例阻止了 Java 程序員在 Web 頁(yè)面中使用 Java 代碼,并且即便擴展簡(jiǎn)單的組件也很繁瑣。超越 JSP 編程的 Java Web 開(kāi)發(fā)框架已經(jīng)出現,但卻缺少動(dòng)態(tài)語(yǔ)言功能。本文將向您展示 Ruby 的 Web 頁(yè)面開(kāi)發(fā)策略并會(huì )提及有關(guān) Seaside 的基本方法。

在 Java Web 開(kāi)發(fā)的早些時(shí)候,Sun 和 Microsoft 曾經(jīng)爭奪過(guò)有關(guān)構建動(dòng)態(tài) Web 頁(yè)面的實(shí)際標準的控制權。Sun 公司引入了 Servlet API。通過(guò) servlet,您可以用 Java 語(yǔ)言的所有功能快速生成一個(gè) Web 頁(yè)面。具備編譯 servlet 能力的免費 servlet 容器實(shí)現 (Apache Tomcat) 的存在使得 servlet 變得非常流行。與之相對的,Microsoft 公司引入了稱(chēng)作 Active Server Pages (ASP) 的 API。該技術(shù)很容易:您可以快速掌握并創(chuàng )建更多的高級 Web 頁(yè)面,其中包括一些具有數據庫支持或其他動(dòng)態(tài)內容的頁(yè)面。

關(guān)于本系列

跨越邊界 系列中,作者 Bruce Tate 提出了這樣一個(gè)觀(guān)點(diǎn):如今的 Java 程序員可以通過(guò)學(xué)習其他方法和語(yǔ)言得到很好的其他思路。自從 Java 技術(shù)明顯成為所有開(kāi)發(fā)項目的最佳選擇以來(lái),編程前景已經(jīng)改變。其他框架正影響著(zhù)構建 Java 框架的方式,從其他語(yǔ)言中學(xué)到的概念也影響著(zhù) Java 編程。您編寫(xiě)的 Python(或 Ruby、或 Smalltalk 等) 代碼可以改變您處理 Java 編碼的方式。

本系列向您介紹與 Java 開(kāi)發(fā)截然不同但可直接應用于 Java 開(kāi)發(fā)的編程概念和技術(shù)。在一些情況下,需要集成該技術(shù)以對其進(jìn)行利用。而在另一些情況下,則可以直接應用這些概念。單獨的開(kāi)發(fā)工具并不重要,重要的是這種思想,即能夠影響 Java 社區中開(kāi)發(fā)人員、框架,甚至基本方法的其他語(yǔ)言和框架。

首先來(lái)說(shuō)說(shuō) JSP 技術(shù)。JSP 被設計來(lái)直接與 ASP 競爭(顧名思義)。使用 JSP 技術(shù),您可以使用標記構建一個(gè) Web 頁(yè)面并將 Java 代碼直接放入頁(yè)面中。JSP 容器將 JSP 文件編譯成 servlet 形式。然后 servlet 引擎像執行其他 servlet 一樣執行該頁(yè)面。JSP 和 ASP 一樣,都實(shí)現了一個(gè)基于模板的方式。模板可以像您想要在用戶(hù)瀏覽器中所呈現的那樣,幫助您構建一個(gè)簡(jiǎn)單的 Web 頁(yè)面。當模板引擎處理簡(jiǎn)單的占位符元素時(shí),您可以用值、組件或作為頁(yè)面一部分的結構來(lái)替換這些元素。盡管 Java 平臺擁有眾多具有通用目的的模板引擎,但 JSP 已經(jīng)占領(lǐng)了絕對的市場(chǎng)份額,部分原因在于大量 ASP 開(kāi)發(fā)人員轉換來(lái)使用 JSP。

比起 Java 語(yǔ)言或 ASP,一些其他的語(yǔ)言在處理 Web 開(kāi)發(fā)方面表現要強得多。了解一下動(dòng)態(tài)語(yǔ)言中相互競爭的方法,會(huì )讓您更加清楚在 Java 平臺上能夠使用哪些方法。在本文中,我討論了 Ruby 中代碼生成是如何工作的,并且深入講解了 Seaside 中一種更加根本的基于組件的方法。

Ruby 模板

Ruby 模板依賴(lài)此語(yǔ)言的簡(jiǎn)單功能來(lái)為 Web 開(kāi)發(fā)提供一種簡(jiǎn)單卻行之有效的方法。通過(guò)掌握一些層次化的概念即可快速理解 Ruby 模板,這些概念每一層要比其上一層更加強大。

Ruby 模板最基礎的部分是 String。Ruby 字符串是一級對象。當您在 Ruby 中創(chuàng )建一個(gè)字符串時(shí),您既能用單引號,也能用雙引號把它括起來(lái)。清單 1 展示了一些例子,即您可在 Ruby 解釋器中鍵入來(lái)創(chuàng )建字符串的三條不同命令:


清單 1. 創(chuàng )建一個(gè) Ruby 字符串
irb(main):001:0> "This is a string.".class                        => String                        irb(main):002:0> ‘This is also a string.‘.class                        => String                        irb(main):003:0> String.new(‘This is yet another string.‘).class                        => String                        

Ruby 不處理任何用單引號括起來(lái)的字符串信息。如果用雙引號括起來(lái),Ruby 會(huì )在運行代碼的時(shí)候進(jìn)行替換。清單 2 是一個(gè)使用換行符的示例。使用單引號時(shí),Ruby 保持換行符不變。使用雙引號時(shí),則會(huì )解釋換行符:


清單 2. 單引號與雙引號的比較
irb(main):004:0> puts ‘Use \n to specify a new line in Ruby.‘                        Use \n to specify a new line in Ruby.                        => nil                        irb(main):005:0> puts "A \\n causes a line break \n like this."                        A \n will cause a line break                        like this.                        => nil                        

在第二個(gè) puts 語(yǔ)句中(puts 代表 put string),Ruby 處理了兩次替換。單個(gè) \ 后跟一個(gè)字符表示不在鍵盤(pán)上的特殊字符,如 \n 代表?yè)Q行。正如反斜號本身有特殊的意義一樣,在一個(gè)字符前的 \ 也有著(zhù)特殊的意義,即轉義該字符,這同在 Java 語(yǔ)言中一致。清單 2 處理了 \\\n 兩個(gè)替換。

#{any_expression} 是一個(gè)更有趣的替換命令。如果您使用雙引號將含有此命令的 String 括起來(lái),Ruby 將返回此字符串,用 any_expression 的值取代 #{any_expression}。清單 3 給出了一個(gè)例子:


清單 3. 簡(jiǎn)單變量替換
irb(main):006:0> name = "Elvis"                        => "Elvis"                        irb(main):007:0> puts "Your name is #{name}"                        Your name is Elvis                        => nil                        

您已經(jīng)做好了創(chuàng )建一個(gè)基本的模板所需的絕大部分準備。只差一步即可完成簡(jiǎn)單的模板處理。您可以通過(guò)在具有單引號的字符串中使用 #{} 替換來(lái)推遲賦值。稍后,通過(guò)給模板加雙引號并調用 eval() 方法,您可以隨時(shí)將模板與變量綁定,如清單 4 所示:


清單 4.推遲賦值
irb(main):008:0> template = ‘Your name is #{name}‘                        => "Your name is \#{name}"                        irb(main):009:0> name = gets                        Elvis                        => "Elvis\n"                        irb(main):011:0> puts eval(‘"‘ + template + ‘"‘)                        Your name is Elvis                        => nil                        

注意,template 在初始化 name 前就已經(jīng)存在了。您可以使用這個(gè)簡(jiǎn)單的模板策略來(lái)處理非常簡(jiǎn)單的 Web 頁(yè)面,但通常您還需要用到更多知識。包含簡(jiǎn)單編碼結構(如含有動(dòng)態(tài)數據的表循環(huán))的能力形成了大多數動(dòng)態(tài) Web 頁(yè)面的主干。

用 eRuby 嵌入代碼

在 HTML 頁(yè)面中嵌入 Ruby 代碼的典型方法(包括在 Rails 中使用的方法)是一個(gè)被稱(chēng)作 eRuby 的過(guò)濾器?,F有的幾個(gè)實(shí)現中包括了一個(gè)被稱(chēng)作 ERb 的基于 Ruby 的實(shí)現,和一個(gè)被稱(chēng)作 eruby(參見(jiàn) 參考資料)的速度更快且基于 C 語(yǔ)言的實(shí)現。它們每一個(gè)都能作為 Web 服務(wù)器的插件運行,但在便利地處理本地文件時(shí),您通常會(huì )使用 ERb,而當需要更快的速度時(shí),例如對于生產(chǎn)用的 Web 服務(wù)器,您會(huì )使用 eruby。eRuby 過(guò)濾器處理文本文件時(shí),除了下列三種情況以外都會(huì )完整地保持原文本:

  • <% 和 %> 之間的文本是 Ruby 代碼,eRuby 將如實(shí)執行該代碼。
  • <%= 和 %> 之間的文本是 Ruby 表達式。eRuby 執行該表達式并用其返回的值替換整個(gè)表達式。
  • 一行中以單個(gè) % 開(kāi)頭的內容,將被作為 Ruby 代碼執行。

例如在清單 5 中名為 test.rhtml 的文件(按照慣例,.rhtml 是針對 eRuby 標記的、包含有 HTML 的文件的擴展名)。清單 5 使用了 Ruby 代碼和表達式。請注意 do 循環(huán)體中的文本:


清單 5.一個(gè)簡(jiǎn)單的 rhtml 文件
<% 4.times do |i|%>                        <h1>This code is inside the loop.</h1>                        <p>This line is pass number <%= i %> through the loop.</p>                        <% end %>                        

您可以簡(jiǎn)單地通過(guò) ERb 運行此代碼,如清單 6 所示:


清單 6.用 ERb 處理文件
  > erb test.rhtml                        <h1>This code is inside the loop.</h1>                        <p>This line is pass number 0 through the loop.</p>                        <h1>This code is inside the loop.</h1>                        <p>This line is pass number 1 through the loop.</p>                        <h1>This code is inside the loop.</h1>                        <p>This line is pass number 2 through the loop.</p>                        <h1>This code is inside the loop.</h1>                        <p>This line is pass number 3 through the loop.</p>                        





回頁(yè)首


調用模板

Ruby 是一系列處理基于 LAMP 的 Web 開(kāi)發(fā)的語(yǔ)言之一。LAMP 代表:

  • Linux
  • Apache
  • MySQL
  • 一種開(kāi)放源碼的 P-語(yǔ)言:Python、Perl 或 PHP。(如果不考慮基礎的話(huà),Ruby 是一種名義上的 P-語(yǔ)言。)

在 LAMP 中,通常您可以通過(guò)簡(jiǎn)單的操作系統腳本,使用諸如公共網(wǎng)關(guān)接口 (CGI) 之類(lèi)的框架來(lái)提供 Web 應用程序。

eRuby 有效地提升了典型的基于 CGI 編程的水平。正如您所預料的那樣,您可以直接將 ERb (或是基于 C 語(yǔ)言的 eruby 的等價(jià)物)插入 Apache HTTP 服務(wù)器并調用 Web 頁(yè)面。隨后您可以將 Ruby 視為 Java servlet 等價(jià)物了。但新的框架常將 ERb 作為一個(gè) Ruby 庫來(lái)調用。如果想要從 API 中創(chuàng )建一個(gè) Ruby 模板,您應該使用清單 5 的修正版本,如清單 7 所示:


清單 7. 在 Ruby 應用程序中運行 ERb 模板
require ‘erb‘                        template = ERB.new <<-EOF                        <% 4.times do |i|%>                        <h1>This code is inside the loop.</h1>                        <p>This line is pass number <%= i %> through the loop.</p>                        <% end %>                        EOF                        puts template.result                        

通過(guò)這種方式執行這些模板,您將 Ruby 編程語(yǔ)言下的所有能力賦予了您的模板。隨后您可以在模板中的代碼和應用程序其余部分的代碼之間實(shí)現無(wú)縫重構。例如,您可以創(chuàng )建一個(gè)幫助器來(lái)基于散列映射的內容構建簡(jiǎn)單的表,如清單 8 所示:


清單 8. 創(chuàng )建幫助器
require ‘erb‘                        def table_helper(map)                        body = map.collect do |item|                        "<tr><td>#{item[0]}</td>                        <td>$#{item[1]}</td></tr>\n"                        end                        return("<table>\n#{body}</table>")                        end                        map = {                        "Peaches" => "1.95",                        "Apples" => ".95"                        }                        template = ERB.new <<-EOF                        <p>Here‘s our price list</p>                        <%= table_helper(map) %>                        EOF                        puts template.result                        

給定一個(gè)散列映射,清單 8 顯示了一個(gè)用于創(chuàng )建表的幫助器。本例中先聲明一個(gè)散列映射和一個(gè)模板,然后把它們放在一起使用(通常您可以將這個(gè)模板放到一個(gè)單獨的文件中;而為了保持清單的簡(jiǎn)單,我將其寫(xiě)作一行)。注意,您會(huì )很自然地在 Ruby 編程語(yǔ)言的功能的基礎上擴展模板系統的功能。本例將 ERb 方式的替換與提供簡(jiǎn)單字符串的基本 Ruby 字符串替換結合了起來(lái)。Ruby on Rails 用以下幾種強制的方法將這些替換方式組合在一起:

  • Rails 的 partials 使小的子表單能夠更好地被重用和組織。
  • Rails 的 layouts 使包含標題、菜單欄和版權信息在內的公共元素能夠在所有頁(yè)面中重用。
  • Rails 的 helpers,類(lèi)似于清單 8 中的幫助器,使簡(jiǎn)化和重用視圖結構變得簡(jiǎn)單。

事實(shí)上,Rails 的設計為用戶(hù)貢獻庫提供了簡(jiǎn)單的方式,這些庫使用 JavaScript 來(lái)呈現諸如 Ajax 元素、樹(shù)控制或彈出式菜單之類(lèi)的復雜特性。Rails 社區提供了功能遠遠強大于 Rails 基本功能的幫助器。





回頁(yè)首


Seaside 策略

Seaside 是一個(gè)不使用傳統模板的 HTML 呈現策略的例子,是針對使用 Smalltalk 開(kāi)發(fā) Web 應用程序的框架。如今,Web 開(kāi)發(fā)人員通過(guò)一個(gè)名為層疊樣式表 (CSS)(參見(jiàn) 參考資料)的策略將樣式放到了一個(gè)更加重要的位置。在 CSS 中,您可以使用模板友好的語(yǔ)言來(lái)構建包括呈現位置、顏色、背景以及字體在內的所有的樣式信息。Seaside 在樣式上非常依賴(lài) CSS,但卻從不用模板來(lái)呈現基本組件。

在 Seaside 中,每一個(gè)組件都能夠自我呈現。最基本的情況是,一個(gè)組件僅僅顯示基本的 HTML 標記和必要的動(dòng)態(tài)內容以呈現此組件。例如,清單 9 定義了 renderContentOn 方法來(lái)創(chuàng )建一個(gè)簡(jiǎn)單 Seaside 計數器:


清單 9.一個(gè)簡(jiǎn)單的 Seaside 組件
renderContentOn: t1                        t1 heading: count.                        t1                        anchorWithAction: [self increase]                        text: ‘++‘.                        t1 space.                        t1                        anchorWithAction: [self decrease]                        text: ‘--‘                        

在清單 9 中,t1 heading: count. 使用實(shí)例變量 count 中的內容呈現了一個(gè)標題,該變量包含了一個(gè)簡(jiǎn)單計數器的值。然后,代碼呈現了一個(gè)在 Seaside 術(shù)語(yǔ)中稱(chēng)作的鏈接,該鏈接包含了 ‘++‘ 文本并調用 increase 方法。最后,代碼中針對 decrease 方法呈現了一個(gè)相似的鏈接。圖 1 展示了含有一個(gè)在清單 9 中呈現的計數器的 Web 頁(yè)面:


圖 1. 一個(gè)簡(jiǎn)單的 Seaside 組件

更加復雜的組件能夠使其子組件自我呈現。用這種方法,Seaside 能夠用最小的努力產(chǎn)生相當復雜的組件。例如,表能夠呈現一系列行,而這些行又能夠依次呈現一系列單元格。清單 10 是一個(gè)復雜組件的例子:


清單 10. 一個(gè)更加復雜的 Seaside 組件
renderContentOn: t1                        counters                        do: [:t2 | t1 render: t2]                        separatedBy: [t1 horizontalRule]                        

清單 10 中的代碼呈現了一組計數器,遍歷一個(gè)容器集合,為每一個(gè)容器調用 render 方法,并用水平線(xiàn)將每個(gè)容器分隔。您可以在圖 2 中看到結果:


圖 2. 一組 Seaside 計數器

Seaside 模型不使用模板,卻可以依靠每個(gè)個(gè)體對象的自我呈現來(lái)構建異常強大的具有復雜交互功能的 Web 頁(yè)面。Seaside 依靠樣式表來(lái)維持設計人員與編程人員間的良好關(guān)系。分層、布局、回溯和樣式在 Seaside 中是家常便飯。





回頁(yè)首


超越 JSP

在 Jason Hunter 六年前撰寫(xiě)的一篇出色的文章中,他列舉了 JSP 的缺點(diǎn)(參見(jiàn) 參考資料)。我解釋為:

  • JSP 比它需要的要難。
  • 循環(huán)很困難。
  • 錯誤消息不友好。
  • 在編程人員和設計人員之間保持平衡太難了。

多年來(lái),Java 開(kāi)發(fā)人員已經(jīng)提出了改變這些不足的實(shí)踐和框架。JavaServer 頁(yè)面標準標記庫 (JSTL)(JSP編程的自定義標記系統)試圖簡(jiǎn)化從 JSP 文件中分解出代碼以及將代碼放入共享庫。但那個(gè)標記系統遠比其需要的復雜。它深具誘惑,卻不能直接將 Java 代碼插入 Web 頁(yè)面,因而 Java Web 頁(yè)面開(kāi)發(fā)人員通過(guò)避免所有的代碼來(lái)抵制這種誘惑,這像避免瘟疫一樣。幾個(gè)建立在 JSP 技術(shù)上的框架試圖簡(jiǎn)化此問(wèn)題。更新的框架則試圖改善 Java Web 開(kāi)發(fā)體驗。例如,JavaServer Faces (JSF) 試圖重新發(fā)明 Struts —— 但其最初卻使用了 JSP(這違背了一些專(zhuān)家的意見(jiàn))。

在最近的幾年,一些不依賴(lài)于 JSP 的創(chuàng )新性框架已經(jīng)開(kāi)始出現。通過(guò)依靠更簡(jiǎn)單的模板哲學(xué)(一種更接近于純 HTML 語(yǔ)言的思想),RIFE、Wicket、Spring Web MVC、Tapestry 以及其他一些框架都聲稱(chēng)為組件的集成提供了更簡(jiǎn)單的策略(參見(jiàn) 參考資料)。它們都可以讓 Web 開(kāi)發(fā)人員使用本機設計工具而非為 JSP 編程專(zhuān)門(mén)定制的工具。這對 Java 語(yǔ)言來(lái)說(shuō)是個(gè)健康的方向。然而,其他語(yǔ)言,如 Ruby 在處理 Web 開(kāi)發(fā)上比 Java 技術(shù)要好得多。

能將 Java 豐富的企業(yè)功能同簡(jiǎn)易的動(dòng)態(tài)語(yǔ)言結合起來(lái)的可行性策略是使用嵌入式虛擬機。依據 JRuby 的領(lǐng)袖 Thomas E. Enebo 的說(shuō)法,開(kāi)發(fā)人員已經(jīng)在研究一種 servlet,這種 servlet 允許嵌入 Ruby 代碼來(lái)生成 Ruby 風(fēng)格的 Web 頁(yè)面。在很多方法中,這一種能夠讓您利用到這兩者的優(yōu)勢。

我希望您對其他語(yǔ)言呈現 Web 頁(yè)面的一些方法有了一些認識。下一次,我將會(huì )探討使用函數語(yǔ)言解決通用問(wèn)題的不同方法。



參考資料

學(xué)習
  • 您可以參閱本文在 developerWorks 全球站點(diǎn)上的 英文原文 。

  • Beyond Java (Bruce Tate, O‘Reilly, 2005年):本文作者所著(zhù)的書(shū),內容涉及 Java 語(yǔ)言的興起和興盛,以及能夠在某些領(lǐng)域挑戰 Java 平臺的技術(shù)。

  • The Problems with JSP”(Jason Hunter,Servlets.com,2000年 6 月):一篇歷史悠久的文章,講述有關(guān) JSP 技術(shù)的問(wèn)題。

  • Ruby:一種卓越的用于表示模板的語(yǔ)言。

  • Seaside:此框架使您能夠用 Smalltalk 開(kāi)發(fā)復雜的 Web 應用程序。

  • 層疊樣式表 (CSS):一項用于為 Web 文檔添加諸如字體、顏色及空格等樣式元素的機制,該機制由萬(wàn)維網(wǎng)聯(lián)盟開(kāi)發(fā)。

  • ERb:一個(gè)用于處理 CGI 腳本的 Ruby 類(lèi),也可以被用在 Ruby 應用程序中以轉化 Ruby 模板。

  • eruby:用 C 語(yǔ)言寫(xiě)成的一個(gè) eRuby 實(shí)現。

  • From Java To Ruby: Things Your Manager Should Know(Pragmatic Bookshelf,2006年):作者作著(zhù)的書(shū),講述了在何時(shí)何處將 Java 編程轉換成 Ruby on Rails 是有意義的,以及如何做出這種改變。

  • Programming Ruby(Pragmatic Bookshelf,2005年):Ruby 編程方面的暢銷(xiāo)書(shū)。

  • RIFE, Wicket, Spring Web MVC, Jakarta Tapestry:使用模板策略的 Java Web 開(kāi)發(fā)框架。

  • JRuby:JRuby 是用 100% 純 Java 語(yǔ)言寫(xiě)成的與 Ruby 1.8.2 版兼容的 Ruby 解釋器。

  • Java 技術(shù)專(zhuān)區:數百篇有關(guān) Java 編程各方面的文章。

獲得產(chǎn)品和技術(shù)
  • Ruby:從該項目的 Web 站點(diǎn)獲取 Ruby。

  • Ruby on Rails:下載開(kāi)放源碼的 Ruby on Rails Web 框架。

  • Seaside:下載截然不同的 Smalltalk Web 框架。



關(guān)于作者

Bruce Tate 居住在德克薩斯州的首府奧斯汀,他是一位父親,同時(shí)也是山地車(chē)手和皮艇手。他是三本 Java 暢銷(xiāo)書(shū)的作者,包括榮獲 Jolt 大獎的 Better, Faster, Lighter Java。他最近又出版了 Beyond Java 一書(shū)。他在 IBM 工作了 13 年,現在是 RapidRed 顧問(wèn)公司 的創(chuàng )始人,在這里他潛心研究基于 Java 技術(shù)和 Ruby on Rails 的輕量級開(kāi)發(fā)策略和架構。

本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請點(diǎn)擊舉報。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
rails新建工程默認是haml
rails入門(mén)書(shū)籍
幾種主流網(wǎng)頁(yè)開(kāi)發(fā)語(yǔ)言的思考
Ruby On Rails入門(mén)經(jīng)典 - 我的文章 - sislcb
Eclipse3.5 配置Aptana3.01 ruby on rails 開(kāi)發(fā)環(huán)境
三部曲 (評論: Programming Ruby中文版)
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導長(cháng)圖 關(guān)注 下載文章
綁定賬號成功
后續可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服

欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久