日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Guice之Servlet基础

發(fā)布時間:2024/7/23 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Guice之Servlet基础 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

如果讀者對于Guice沒有大體的了解,可以參考本人的另一篇Guice基礎(chǔ)文章

Guice 提供了一個完整的體系使得我們在web應(yīng)用中也可以使用它作為依賴注入的工具.

為什么使用 Guice :

使用Guice的好處:

  • 構(gòu)造函數(shù)注入
  • 類型安全的, 方便的配置方式(只需要在web.xml中進(jìn)行很少的配置)
  • 模塊化
  • Guice AOP
    同時, Guice并不會改變標(biāo)準(zhǔn)servlet的生命周期
  • 如何配置呢?

    在開始之前首先獲取最新的 guice-servlet.jar.

     小編用maven做,所以這塊如果讀者使用其他方式需要根據(jù)自己的情況進(jìn)行配置.這里貼上小編的 maven 文件內(nèi)容:

    <dependency><groupId>com.google.inject</groupId><artifactId>guice</artifactId><version>4.0</version></dependency><dependency><groupId>com.google.inject.extensions</groupId><artifactId>guice-servlet</artifactId><version>4.0</version></dependency>

    在web.xml中配置GuiceFilter過濾器:

     在所有依賴包都配置好之后,我們需要做的第一件事是配置GuiceFilter. 這個過濾器重新路由所有的客戶端請求.
     

    <filter><filter-name>guiceFilter</filter-name><filter-class>com.google.inject.servlet.GuiceFilter</filter-class></filter><filter-mapping><filter-name>guiceFilter</filter-name><url-pattern>/*</url-pattern></filter-mapping>

    安裝ServletModule

    在完成上面的操作之后,接下來要做的事情是安裝ServletModule

    Guice.createInjector(new ServletModule());

    這個模塊是用來設(shè)置請求和會話范圍(scopes),同時提供一個配置你的過濾器和servlet的方法. 一個不錯的建議是在一個ServletContextListener 中進(jìn)行,當(dāng)然你也可以在其他你需要該注入器(injector)的地方.
    Guice Servlet提供了一個GuiceServletContextListener ,我們可以繼承該類實現(xiàn)自己的ServletContextListener:

    public class MyGuiceServletConfig extends GuiceServletContextListener {@Overrideprotected Injector getInjector() {return Guice.createInjector(new ServletModule());} }

    然后在web.xml中配置該listener.然后當(dāng)Servlet 容器啟動Web 應(yīng)用時,該監(jiān)聽器便會被執(zhí)行.我們的ServletModule 被安裝.

    <listener><listener-class>com.up.MyGuiceServletConfig</listener-class> </listener>

    Binding Language

    我們可以將ServletModule 看做一個代碼形式的web.xml文件.過濾器和servlet可以通過簡單的調(diào)用一些java api 實現(xiàn).下面看一個簡單的例子:

    Guice.createInjector(..., new ServletModule() {@Overrideprotected void configureServlets() {serve("/*").with(MyServlet.class);filter("/*").through(MyFilter.class);}}

    serve("/*").with(MyServlet.class); 等價于

    <servlet><servlet-name>MyFilter</servlet-name><servlet-class>com.up.servlet.MyServlet</servlet-class></servlet><servlet-mapping><servlet-name>MyFilter</servlet-name><url-pattern>/*</url-pattern></servlet-mapping>

    filter("/*").through(MyFilter.class); 等價于

    <filter><filter-name>MyFilter</filter-name><filter-class>com.up.filter.MyFilter</filter-class></filter><filter-mapping><filter-name>MyFilter</filter-name><url-pattern>/*</url-pattern></filter-mapping>

    Note: 每個 servlet 或者 filter 需要是單例的.如果你不能直接注解該類,那么你需要使用bind(..).in(Singleton.class). Guice servlet不支持SingleThreadModel

    可用的注入:

    安裝了ServletModule 之后我可方便的注入一些servlet體系中的類.

    @RequestScoped class SomeNonServletPojo {@InjectSomeNonServletPojo(HttpServletRequest request, HttpServletResponse response, HttpSession session) {...}}

    請求和響應(yīng)是當(dāng)前http請求作用域。同樣的http會話對象是當(dāng)前用戶會話作用域。除此之外你也可以使用綁定注釋@RequestParameters注入當(dāng)前ServletContext和請求參數(shù)如下:

    @Inject @RequestParameters Map<String, String[]> params;

    這里必須是Map<String, String[]> ,因為http允許多個value對應(yīng)于同一個key.
    Note: 如果你想給一個大作用域的對象注入一個請求作用域或者會話作用域的對象, 你應(yīng)該使用Provider<T>

    多對一映射

    我們可以將多個 url 映射到相同的 servlet.

    serve("*.html", "/my/*").with(MyServlet.class);

    該方法對于過濾器也同樣適用.

    正則表達(dá)式映射

    我們也可以使用正則表達(dá)式方式映射 url 到特定的 servlet 或 filter.

    serveRegex("(.)*ajax(.)*").with(MyAjaxServlet.class)

    上述實例會將所有包含 “ajax” 的 URI 映射到 MyAjaxServlet.

    初始化參數(shù)

    在有 web.xml 時,我們可以通過配置<init-param> 給 servlet 或 filter 傳入初始化參數(shù). Guice Servlet 中完成該任務(wù)只需要在配置該 servlet 或 filter 時傳入一個Map<String, String> 實例就ok了.

    Map<String, String> params = new HashMap<String, String>();params.put("coffee", "Espresso");params.put("site", "google.com");serve("/*").with(MyServlet.class, params)

    綁定Key

    你也可以不綁定特定的實現(xiàn)類,取而代之的是綁定一個接口,然后通過 Guice 注入特定的實現(xiàn)類.

    filter("/*").through(Key.get(Filter.class, Fave.class));

    這里的Filter.class 是 Servlet API javax.seervlet.Filter, Fave.class 是一個自定義的綁定注解.
    然后在你自己的模塊中將特定的filter綁定到該接口.

    bind(Filter.class).annotatedWith(Fave.class).to(MyFilterImpl.class);

    注入injector

    你可以在任何時刻取得injector對象,只需要像下面這樣一行代碼就可以了.

    @Singleton public class MyServlet extends HttpServlet {@Inject private Injector injector;... }// elsewhere in ServletModule serve("/myurl").with(MyServlet.class);

    恭喜你,到此你可以開始你自己的 Guice Servlet 之旅了.

    總結(jié)

    以上是生活随笔為你收集整理的Guice之Servlet基础的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。