<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    瘋狂

    STANDING ON THE SHOULDERS OF GIANTS
    posts - 481, comments - 486, trackbacks - 0, articles - 1
      BlogJava :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

    Servlet3.0引入的新特性

    Posted on 2012-11-16 13:50 瘋狂 閱讀(13088) 評(píng)論(1)  編輯  收藏 所屬分類: web

    轉(zhuǎn)自:http://www.cnblogs.com/rongxh7/archive/2010/04/28/1723200.html
    Servlet3.0規(guī)范的新特性主要是為了3個(gè)目的:
    1.簡(jiǎn)化開發(fā)
    2.便于布署
    3.支持Web2.0原則
    為了簡(jiǎn)化開發(fā)流程,Servlet3.0引入了注解(annotation),這使得web布署描述符web.xml不在是必須的選擇。
    Pluggability可插入性
    當(dāng)使用任何第三方的框架,如Struts,JSF或Spring,我們都需要在web.xml中添加對(duì)應(yīng)的Servlet的入口。這使得web描述符笨重而難以維護(hù)。Servlet3.0的新的可插入特性使得web應(yīng)用程序模塊化而易于維護(hù)。通過(guò)web fragment實(shí)現(xiàn)的可插入性減輕了開發(fā)人員的負(fù)擔(dān),不需要再在web.xml中配置很多的Servlet入口。
    Asynchronous Processing 異步處理
    另外一個(gè)顯著的改變就是Servlet3.0支持異步處理,這對(duì)AJAX應(yīng)用程序非常有用。當(dāng)一個(gè)Servlet創(chuàng)建一個(gè)線程來(lái)創(chuàng)建某些請(qǐng)求的時(shí)候,如查詢數(shù)據(jù)庫(kù)或消息連接,這個(gè)線程要等待直到獲得所需要的資源才能夠執(zhí)行其他的操作。異步處理通過(guò)運(yùn)行線程執(zhí)行其他的操作來(lái)避免了這種阻塞。
    Apart from the features mentioned here, several other enhancements have been made to the existing API. The sections towards the end of the article will explore these features one by one in detail.
    除了這些新特性之外, Servlet3.0對(duì)已有的API也做了一些改進(jìn),在本文的最后我們會(huì)做介紹。
    Annotations in Servlet Servlet中使用注解
    Servlet3.0的一個(gè)主要的改變就是支持注解。使用注解來(lái)定義Servlet和filter使得我們不用在web.xml中定義相應(yīng)的入口。
    @WebServlet
    @WebServlet用來(lái)定義web應(yīng)用程序中的一個(gè)Servlet。這個(gè)注解可以應(yīng)用于繼承了HttpServlet。這個(gè)注解有多個(gè)屬性,例如name,urlPattern, initParams,我們可以使用者的屬性來(lái)定義Servlet的行為。urlPattern屬性是必須指定的。
    例如我們可以象下面的例子這樣定義:

    1. @WebServlet(name = "GetQuoteServlet",  urlPatterns = {"/getquote"} )

    2. public class GetQuoteServlet extends HttpServlet {

    3.     @Override

    4.     protected void doGet(HttpServletRequest request, HttpServletResponse response)

    5.             throws ServletException, IOException {

    6.         PrintWriter out = response.getWriter();

    7.         try {

    8.             String symbol = request.getParameter("symbol");

    9.             out.println("<h1>Stock Price is</h1>" + StockQuoteBean.getPrice(symbol);

    10.         } finally {

    11.             out.close();

    12.         }

    13.     }

    14. }

    15.

    16. public class StockQuoteBean {

    17. private StockQuoteServiceEntity serviceEntity = new StockQuoteServiceEntity();

    18.     public double getPrice(String symbol) {

    19.         if(symbol !=null )  {

    20. return serviceEntity.getPrice(symbol);

    21.          } else {

    22.             return 0.0;

    23.         }

    24.     }

    25. }

    復(fù)制代碼

    在上面的例子中,一個(gè)Servlet只對(duì)應(yīng)了一個(gè)urlPattern。實(shí)際上一個(gè)Servlet可以對(duì)應(yīng)多個(gè)urlPattern,我們可以這樣定義:

    1. @WebServlet(name = "GetQuoteServlet",  urlPatterns = {"/getquote",  "/stockquote"} )

    2. public class GetQuoteServlet extends HttpServlet {

    3.     @Override

    4.     protected void doGet(HttpServletRequest request, HttpServletResponse response)

    5.             throws ServletException, IOException {

    6.         PrintWriter out = response.getWriter();

    7.         try {

    8.             String symbol = request.getParameter("symbol");

    9.             out.println("<h1>Stock Price is</h1>" + StockQuoteBean.getPrice(symbol);

    10.         } finally {

    11.             out.close();

    12.         }

    13.     }

    14. }

    復(fù)制代碼

    @WebFilter
    我們可以使用@WebFilter注解來(lái)定義filter。這個(gè)注解可以被應(yīng)用在實(shí)現(xiàn)了javax.servlet.Filter接口的類上。同樣的,urlPattern屬性是必須指定的。下面就是一個(gè)例子。

    1. @WebFilter(filterName = "AuthenticateFilter", urlPatterns = {"/stock.jsp", "/getquote"})

    2. public class AuthenticateFilter implements Filter {

    3.

    4.     public void doFilter(ServletRequest request, ServletResponse response,

    5.             FilterChain chain)     throws IOException, ServletException {

    6.         String username = ((HttpServletRequest) request).getParameter("uname");

    7.         String password = ((HttpServletRequest) request).getParameter("password");

    8.           if (username == null || password == null) {

    9.                  ((HttpServletResponse) response).sendRedirect("index.jsp");            }

    10. if (username.equals("admin") && password.equals("admin")) {

    11.                 chain.doFilter(request, response);      }

    12. else {

    13.                 ((HttpServletResponse) response).sendRedirect("index.jsp");         }

    14.          }

    15.

    16.     public void destroy() {

    17.     }

    18.     public void init(FilterConfig filterConfig) {

    19.     }

    20. }

    復(fù)制代碼

    @WebInitParam
    可以使用@WebInitParam注解來(lái)制定Servlet或filter的初始參數(shù)。當(dāng)然我們也可以使用@WebServlet或@WebFileter的initParam屬性來(lái)指定初始參數(shù)。下面是使用@WebInitParam的例子:

    1. @WebServlet(name = "GetQuoteServlet", urlPatterns = {"/getquote"})

    2. @WebInitParam(name = "default_market", value = "NASDAQ")

    3. public class GetQuoteServlet extends HttpServlet {

    4.     @Override

    5.     protected void doGet(HttpServletRequest request, HttpServletResponse response)

    6.             throws ServletException, IOException {

    7.         response.setContentType("text/html;charset=UTF-8");

    8.         PrintWriter out = response.getWriter();

    9.         try {

    10.             String market = getInitParameter("default_market");

    11.             String symbol = request.getParameter("symbol");

    12.             out.println("<h1>Stock Price in " + market + " is</h1>" + StockQuoteBean.getPrice(symbol, market));

    13.         } finally {

    14.             out.close();

    15.         }

    16.     }

    17. }

    復(fù)制代碼

    下面是使用initParam屬性的例子:

    1. @WebServlet(name = "GetQuoteServlet",

    2.             urlPatterns = {"/getquote"},

    3.             initParams={@WebInitParam(name="default_market",  value="NASDAQ")}

    4.            )

    5. public class GetQuoteServlet extends HttpServlet {

    6.     @Override

    7.     protected void doGet(HttpServletRequest request, HttpServletResponse response)

    8.             throws ServletException, IOException {

    9.         response.setContentType("text/html;charset=UTF-8");

    10.         PrintWriter out = response.getWriter();

    11.         try {

    12.             String market = getInitParameter("default_market");

    13.             String symbol = request.getParameter("symbol");

    14.             out.println("<h1>Stock Price in " + market + " is</h1>" + StockQuoteBean.getPrice(symbol, market));

    15.         } finally {

    16.             out.close();

    17.         }

    18.     }

    19. }

    復(fù)制代碼

    @WebListener
    @WebListener注解被應(yīng)用在作為listener監(jiān)聽web應(yīng)用程序事件的類上,所以@WebListener能夠被應(yīng)用在實(shí)現(xiàn)了ServletContextListener,ServletContextAttributeListener,ServletRequestListener,ServletRequestAttributeListener,HttpSessionListener和HttpSessionAttributeListener接口的類上。在下面的例子中,該類實(shí)現(xiàn)了ServletContextListener接口。

    1. @WebListener

    2. public class QuoteServletContextListener implements ServletContextListener {

    3.    public void contextInitialized(ServletContextEvent sce) {

    4.    ServletContext context = sce.getServletContext();

    5. context.setInitParameter(“default_market”, “NASDAQ”);

    6. }

    7. public void contextDestroyed(ServletContextEvent sce) {

    8. }

    9. }

    復(fù)制代碼

    @MultipartConfig
    使用@MultipartConfig注解來(lái)指定Servlet要求的multipart MIME類型。這種類型的MIME附件將從request對(duì)象中讀取。
    The Metadata and Common Annotations元數(shù)據(jù)與通用的注解
    除了以上的Servlet特定的注解之外,Servlet3.0還支持JSR175(Java元數(shù)據(jù)規(guī)范)和JSR250(Java平臺(tái)通用注解)所規(guī)定的注解,包括:
        * 安全相關(guān)的注解,如 @DeclareRoles 和 @RolesAllowed
        * 使用EJB的注解,如 @EJB 和 @EJBs
        * 資源注入相關(guān)的注解,如 @Resource 和 @Resources
        * 使用JPA的注解,如 @PersistenceContext, @PersistenceContexts, @PersistenceUnit, 和 @PersistenceUnits
        * 生命周期的注解,如 @PostConstruct和 @PreDestroy
        * 提供WebService引用的注解,如 @WebServiceRef and @WebServiceRefs
    注解和web.xml哪個(gè)會(huì)生效
    注解的引入使得web.xml變成可選的了。但是,我們還是可以使用web.xml。容器會(huì)根據(jù)web.xml中的metadata-complete元素的值來(lái)決定使用web.xml還是使用注解。如果該元素的值是true,那么容器不處理注解,web.xml是所有信息的來(lái)源。如果該元素不存在或者其值不為true,容器才會(huì)處理注解。
    Web框架的可插入性
    我們前面說(shuō)過(guò)了Servlet3.0的改進(jìn)之一就是使得我們能夠?qū)⒖蚣芎蛶?kù)插入到web應(yīng)用程序中。這種可插入性減少了配置,并且提高了web應(yīng)用程序的模塊化。Servlet3.0是通過(guò)web模塊布署描述片段(簡(jiǎn)稱web片段)來(lái)實(shí)現(xiàn)插入性的。
    一個(gè)web片段就是web.xml文件的一部分,被包含在框架特定的Jar包的META-INF目錄中。Web片段使得該框架組件邏輯上就是web應(yīng)用程序的一部分,不需要編輯web布署描述文件。
    Web片段中使用的元素和布署文件中使用的元素基本相同,除了根元素不一樣。Web片段的根元素是<web-fragment>,而且文件名必須叫做web-fragment.xml。容器只會(huì)在放在WEB-INF\lib目錄下的Jar包中查找web-fragment.xml文件。如果這些Jar包含有web-fragment.xml文件,容器就會(huì)裝載需要的類來(lái)處理他們。
    在web.xml中,我們要求Servlet的name必須唯一。同樣的,在web.xml和所有的web片段中,Servlet的name也必須唯一。
    下面就是一個(gè)web-fragment的例子:
    web-fragment.xml

    1. <web-fragment>

    2. <servlet>

    3. <servlet-name>ControllerServlet</servlet-name>

    4. <servlet-class>com.app.control.ControllerServlet</servlet-class>

    5. </servlet>

    6. <listener>

    7. <listener-class>com.listener.AppServletContextListener</listener-class>

    8. </listener>

    9. </web-fragment>

    復(fù)制代碼

    框架的Jar包是放在WEB-INF\lib目錄下的,但是Servlet3.0提供兩種方法指定多個(gè)web片段之間的順序:
       1. 絕對(duì)順序
       2. 相對(duì)順序
    我們通過(guò)web.xml文件中的<absolute-ordering>元素來(lái)指定絕對(duì)順序。這個(gè)元素有之元素name,name的值是各個(gè)web片段的name元素的值。這樣就指定了web片段的順序。如果多個(gè)web片段有相同的名字,容器會(huì)忽略后出現(xiàn)的web片段。下面是一個(gè)指定絕對(duì)順序的例子:
    web.xml

    1. <web-app>

    2. <name>DemoApp</name>

    3. <absolute-ordering>

    4. <name>WebFragment1</name>

    5. <name>WebFragment2</name>

    6. </absolute-ordering>

    7. ...

    8. </web-app>

    復(fù)制代碼

    相對(duì)順序通過(guò)web-fragment.xml中的<ordering>元素來(lái)確定。Web片段的順序由<ordering>的子元素<before>,<after>和<others>來(lái)決定。當(dāng)前的web片段會(huì)放在所有的<before>元素中的片段之前。同樣的,會(huì)放在所有的<after>元素中的片段之后。<others>用來(lái)代替所有的其他片段。注意只有當(dāng)web.xml中沒有<absolute-ordering>時(shí),容器才會(huì)使用web片段中定義的相對(duì)順序。
    下面是一個(gè)幫助理解相對(duì)順序的例子:
    web-fragment.xml

    1. <web-fragment>

    2. <name>WebFragment1</name>

    3. <ordering><after>WebFragment2</after></ordering>

    4. ...

    5. </web-fragment>

    復(fù)制代碼

    web-fragment.xml

    1. <web-fragment>

    2. <name>WebFragment2</name>

    3. ..

    4. </web-fragment>

    復(fù)制代碼

    web-fragment.xml

    1. <web-fragment>

    2. <name>WebFragment3</name>

    3. <ordering><before><others/></before></ordering>

    復(fù)制代碼

    ..
    </web-fragment>
    這些文件將會(huì)按照下面的順序被處理:
       1. WebFragment3
       2. WebFragment2
       3. WebFragment1
    包含WebFragment3的Jar文件被最先處理,包含WebFragment2的文件被第二個(gè)處理,包含WebFragment1的文件被最后處理。
    如果既沒有定義絕對(duì)順序,也沒有定義相對(duì)順序,那么容器就認(rèn)為所有的web片段間沒有順序上的依賴關(guān)系。
    Servlet中的異步處理
    很多時(shí)候Servlet要和其他的資源進(jìn)行互動(dòng),例如訪問數(shù)據(jù)庫(kù),調(diào)用web service。在和這些資源互動(dòng)的時(shí)候,Servlet不得不等待數(shù)據(jù)返回,然后才能夠繼續(xù)執(zhí)行。這使得Servlet調(diào)用這些資源的時(shí)候阻塞。Servlet3.0通過(guò)引入異步處理解決了這個(gè)問題。異步處理允許線程調(diào)用資源的時(shí)候不被阻塞,而是直接返回。AsyncContext負(fù)責(zé)管理從資源來(lái)的回應(yīng)。AsyncContext決定該回應(yīng)是應(yīng)該被原來(lái)的線程處理還是應(yīng)該分發(fā)給容器中其他的資源。AsyncContext有一些方法如start,dispatch和complete來(lái)執(zhí)行異步處理。
    要想使用Servlet3.0的異步處理,我們需要設(shè)置@Webservlet和@WebFilter注解的asyncSupport屬性。這個(gè)屬性是布爾值,缺省值是false。
    Servlet3.0的異步處理可以很好的和AJAX配合。在Servlet的init方法中,我們能夠訪問數(shù)據(jù)庫(kù)或從JMS讀取消息。在doGet或doPost方法中,我們能夠啟動(dòng)異步處理,AsyncContext會(huì)通過(guò)AsyncEvent和AsyncListener來(lái)管理線程和數(shù)據(jù)庫(kù)操作/JMS操作自己的關(guān)系。
    已有API的改進(jìn)
    除了這些新特性之外,Servlet3.0還對(duì)以往已經(jīng)存在的API做了一些改進(jìn)。
    HttpServletRequest
    To support the multipart/form-data MIME type, the following methods have been added to the HttpServletRequest interface:
    為了支持multipart/form-data MIME類型,在HttpServletRequest接口中添加了項(xiàng)目的方法:
        * Iterable<Part> getParts()
        * Part getPart(String name)
    Cookies
    為了避免一些跨站點(diǎn)攻擊,Servlet3.0支持HttpOnly的cookie。HttpOnly cookie不想客戶端暴露script代碼。Servlet3.0在Cookie類中添加了如下的方法來(lái)支持HttpOnly cookie:
        * void setHttpOnly(boolean isHttpOnly)
        * boolean isHttpOnly()
    ServletContext
    通過(guò)在ServletContext中添加下面的方法,Servlet3.0允許Servlet或filter被編程的加入到context中:
        * addServlet(String servletName, String className)
        * addServlet(String servletName, Servlet servlet)
        * addServlet(String servletName, Class<? extends Servlet> servletClass)
        * addFilter(String filterName, String className)
        * addFilter(String filterName, Filter filter)
        * addFilter(String filterName, Class<? extends Filter>filterClass)
        * setInitParameter (String name, String Value)

    Servlet3.0新功能: 異步處理

    J2EE 6和Glassfish 3V正式發(fā)布了,J2EE 6正式發(fā)布了Servlet3.0, 為了能更好的對(duì)WEB2.0提供支持, 3.0添加了異步處理的機(jī)制.

     

    HTTP1.1相對(duì)于HTTP1.0的影響.

     

    HTTP1.1最大的一個(gè)改變就是提供了長(zhǎng)連接,這樣HTTP不再是一次請(qǐng)求,一次連接的協(xié)議了,只要HTTP的connection不關(guān)閉,一次HTTP連接可以支持任意多次request/reponse處理. 當(dāng)WEB Client與WEB Server建立連接時(shí),客戶端可以采用長(zhǎng)連接,也就是說(shuō)Client會(huì)一直保持對(duì)WEB Server的連接(例如:Browser對(duì)一個(gè)網(wǎng)站保持當(dāng)連接,知道Browser關(guān)閉或最終退出該網(wǎng)站). 舊的WEB Server會(huì)為每一個(gè)Http連接分配一個(gè)active的Thread,這樣當(dāng)Client的數(shù)量增大時(shí),Server端Thread Pool的最大容量也需要相應(yīng)增大,但Thread是相當(dāng)耗內(nèi)存的,一個(gè)不小心就會(huì)導(dǎo)致Server端NotEnoughMemory...

     

    基于HTTP1.1,大部分支持Servlet2.X的WEB容器都采用的NIO去接收和處理請(qǐng)求. 當(dāng)Client和Server端建立連接時(shí),Server端并不分配一個(gè)Thread給HTTP連接.直到Server端收到Client端發(fā)送的Request時(shí), Server才開始為該Request分配Thread(注意:這里不是為HTTP連接分配Thread).

     

    這樣當(dāng)大量的Client建立長(zhǎng)連接與Server進(jìn)行交互時(shí),Server無(wú)需維持一個(gè)Thread給inactive的HTTP長(zhǎng)連接, 每個(gè)Servlet在doReceived()時(shí)其實(shí)對(duì)應(yīng)的是一個(gè)active Request,而不是HTTPConnection本身. 這樣Server端所需的最大Thread數(shù)大大地減少了.

     

    AJAX的影響

     

    1. Request的數(shù)量爆炸性增加增加

     

    過(guò)去WEB Browser打開一個(gè)Web page,只需要和Web Server端建立一個(gè)HTTP連接.但AJAX技術(shù)出現(xiàn)以后,一個(gè)Web page上可能有多個(gè)與Web Server的連接,而且Ajax request通常是十分頻繁的,Server接收到的Request數(shù)量大大增長(zhǎng)了, 這樣原先NIO的技術(shù)已經(jīng)不能很好的支持基于Ajax的服務(wù)了.

     

    Servlet 3.0的異步處理就能夠解決上面的問題.

     

    Servlet3.0的solution:

    當(dāng)request發(fā)送到Server端時(shí),servlet的doReceived()將request放進(jìn)一個(gè)queue里,然后doReceived結(jié)束.這個(gè)時(shí)候server并沒有關(guān)閉response,Client端一直在等server端response的內(nèi)容. Server端維護(hù)自己的ThreadPool,當(dāng)ThreadPool里有idle的Thread,就從queue里取出一個(gè)request,分配idle的Thread給request,并進(jìn)行處理.

     

    Java代碼
    1.    @WebServlet("/test" asyncSupported=true)  
    2.    public class MyServlet extends HttpServlet {  
    3.        ScheduledThreadPoolExecutor executor = null;  
    4.   
    5.         public void init(ServletConfig arg0) throws ServletException {  
    6.                    executor = new ThreadPoolExecutor(10);//獨(dú)立的線程池處理請(qǐng)求  
    7.         }  
    8.         public void doGet(HttpServletRequest req, HttpServletResponse res) {  
    9.             ...  
    10.             AsyncContext aCtx = request.startAsync(req, res);  
    11.             executor.execute(new AsyncWebService(aCtx));//異步處理  
    12.         }  
    13.    }  
    14.   
    15.    public class AsyncWebService implements Runnable {  
    16.         AsyncContext ctx;  
    17.         public AsyncWebService(AsyncContext ctx) {  
    18.             this.ctx = ctx;  
    19.         }  
    20.         public void run() {//處理請(qǐng)求  
    21.             //Do something here ...  
    22.   
    23.             // Dispatch the request to render the result to a JSP.  
    24.             ctx.dispatch("/render.jsp");  
    25.    }  
    26. }  
       @WebServlet("/test" asyncSupported=true)   public class MyServlet extends HttpServlet {       ScheduledThreadPoolExecutor executor = null;        public void init(ServletConfig arg0) throws ServletException {                   executor = new ThreadPoolExecutor(10);//獨(dú)立的線程池處理請(qǐng)求        }        public void doGet(HttpServletRequest req, HttpServletResponse res) {            ...            AsyncContext aCtx = request.startAsync(req, res);            executor.execute(new AsyncWebService(aCtx));//異步處理        }   }   public class AsyncWebService implements Runnable {        AsyncContext ctx;        public AsyncWebService(AsyncContext ctx) {            this.ctx = ctx;        }        public void run() {//處理請(qǐng)求            //Do something here ...            // Dispatch the request to render the result to a JSP.            ctx.dispatch("/render.jsp");   }}

     以上的例子可以用于處理對(duì)Ajax的請(qǐng)求,因?yàn)橥ǔjax的請(qǐng)求多,但對(duì)響應(yīng)速度的要求并不太高. 對(duì)于正常的頁(yè)面請(qǐng)求,要求一定的響應(yīng)速度,可以沿用以前Servlet同步的實(shí)現(xiàn).

     

    2. Server端推送信息

    在Web2.0的應(yīng)用中, Ajax可用通過(guò)不斷的發(fā)送Request來(lái)獲取Server端某種信息的變化,但這種實(shí)現(xiàn)會(huì)產(chǎn)生大量的Client請(qǐng)求. 當(dāng)前推薦的方法是,讓Server端自己推送信息變化給Client.

     

    因?yàn)镾ervlet3.0提供了異步處理的方式, Request提交給Server以后, Server可以為Request注冊(cè)一個(gè)Listener,由Listener去monitor信息的變化,當(dāng)信息發(fā)生變化時(shí),由Listener負(fù)責(zé)把信息變化發(fā)送給Cient(Listener關(guān)閉HTTP response).

     


    評(píng)論

    # re: Servlet3.0引入的新特性   回復(fù)  更多評(píng)論   

    2015-04-14 11:00 by 讓他如果
    對(duì)方提供統(tǒng)一uyj他 那你 體驗(yàn)體驗(yàn)他有一天一腳踢他用戶體驗(yàn)t發(fā)個(gè)發(fā)發(fā)個(gè)發(fā)個(gè)發(fā)個(gè)發(fā)個(gè)f'g'f
    主站蜘蛛池模板: 亚洲无砖砖区免费| 老外毛片免费视频播放| 亚洲AV日韩AV永久无码下载| 亚洲第一页综合图片自拍| 国产成人免费片在线观看| 国产猛烈高潮尖叫视频免费| 免费无码又爽又刺激高潮| 四虎成人免费网站在线| 免费看的黄色大片| 国产又大又粗又硬又长免费| 四虎影视永久免费视频观看| 国产成人精品高清免费| 免费人成网站7777视频| 亚洲精品久久久www| 久久亚洲中文字幕精品一区四| 精品亚洲成α人无码成α在线观看| 亚洲精品无码你懂的网站| 在线日韩日本国产亚洲| 亚洲乱码国产乱码精品精| 亚洲国产精品福利片在线观看 | v片免费在线观看| 日韩一级片免费观看| 九九热久久免费视频| 黄网站免费在线观看| 91香蕉在线观看免费高清| 希望影院高清免费观看视频| 在线看片免费不卡人成视频| 色视频色露露永久免费观看| 免费国产不卡午夜福在线| 久久久久一级精品亚洲国产成人综合AV区| 亚洲综合av永久无码精品一区二区| 亚洲国产精品无码久久久蜜芽| 亚洲精品视频专区| 亚洲乱理伦片在线观看中字| 日日狠狠久久偷偷色综合免费 | 亚洲AV无码男人的天堂| 一级特黄a大片免费| 免费无码中文字幕A级毛片| 国产精品69白浆在线观看免费 | 午夜免费福利小电影| 我要看免费的毛片|