Guice之Servlet基础
如果读者对于Guice没有大体的了解,可以参考本人的另一篇Guice基础文章
Guice 提供了一个完整的体系使得我们在web应用中也可以使用它作为依赖注入的工具.
为什么使用 Guice :
使用Guice的好处:
- 构造函数注入
- 类型安全的, 方便的配置方式(只需要在web.xml中进行很少的配置)
- 模块化
- Guice AOP
同时, Guice并不会改变标准servlet的生命周期
如何配置呢?
在开始之前首先获取最新的 guice-servlet.jar.
小编用maven做,所以这块如果读者使用其他方式需要根据自己的情况进行配置.这里贴上小编的 maven 文件内容:
<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());
这个模块是用来设置请求和会话范围(scopes),同时提供一个配置你的过滤器和servlet的方法. 一个不错的建议是在一个ServletContextListener
中进行,当然你也可以在其他你需要该注入器(injector)的地方.
Guice Servlet提供了一个GuiceServletContextListener
,我们可以继承该类实现自己的ServletContextListener
:
public class MyGuiceServletConfig extends GuiceServletContextListener {@Overrideprotected Injector getInjector() {return Guice.createInjector(new ServletModule());}
}
然后在web.xml中配置该listener.然后当Servlet 容器启动Web 应用时,该监听器便会被执行.我们的ServletModule
被安装.
<listener><listener-class>com.up.MyGuiceServletConfig</listener-class>
</listener>
Binding Language
我们可以将ServletModule
看做一个代码形式的web.xml文件.过滤器和servlet可以通过简单的调用一些java api 实现.下面看一个简单的例子:
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) {...}}
请求和响应是当前http请求作用域。同样的http会话对象是当前用户会话作用域。除此之外你也可以使用绑定注释@RequestParameters注入当前ServletContext和请求参数如下:
@Inject @RequestParameters Map<String, String[]> params;
这里必须是Map<String, String[]>
,因为http允许多个value对应于同一个key.
Note: 如果你想给一个大作用域的对象注入一个请求作用域或者会话作用域的对象, 你应该使用Provider<T>
多对一映射
我们可以将多个 url 映射到相同的 servlet.
serve("*.html", "/my/*").with(MyServlet.class);
该方法对于过滤器也同样适用.
正则表达式映射
我们也可以使用正则表达式方式映射 url 到特定的 servlet 或 filter.
serveRegex("(.)*ajax(.)*").with(MyAjaxServlet.class)
上述实例会将所有包含 “ajax” 的 URI 映射到 MyAjaxServlet
.
初始化参数
在有 web.xml 时,我们可以通过配置<init-param>
给 servlet 或 filter 传入初始化参数. Guice Servlet 中完成该任务只需要在配置该 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
你也可以不绑定特定的实现类,取而代之的是绑定一个接口,然后通过 Guice 注入特定的实现类.
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 之旅了.
Guice之Servlet基础相关推荐
- 第三章 Java Servlet基础
第三章 Java Servlet基础 3.6.2 转发 1.获得RequestDispatcher对象 2.RequestDispatcher对象调用forward()方法实现转发 请求转发工作原理 ...
- JSP/Servlet基础语法
相关学习资料 http://my.oschina.net/chape/blog/170247 http://docs.oracle.com/cd/E13222_01/wls/docs81/webapp ...
- Servlet基础(三) Servlet的多线程同步问题
Servlet基础(三) Servlet的多线程同步问题 Servlet/JSP技术和ASP.PHP等相比,由于其多线程运行而具有很高的执行效率. 由于Servlet/JSP默认是以多线程模式执行的, ...
- Servlet基础(一) Servlet基础和关键的API介绍
转载:http://www.cnblogs.com/mengdd/p/3202550.html Servlet基础(一) Servlet简介 关键API介绍及结合源码讲解 Servlet基础(一) S ...
- servlet基础_Servlet基础
servlet基础 通过本教程,我将尝试使您更接近Java Servlet模型. 在检查servlet规范中定义的类之前,我将解释在开始开发Web应用程序之前需要了解的基本知识. 了解Java Ser ...
- Unit01: Servlet基础 、 HTTP协议
Unit01: Servlet基础 . HTTP协议 在页面上输出当前时间 package web;import java.io.IOException; import java.io.PrintWr ...
- Web阶段--Servlet基础知识点
Web阶段–Servlet基础知识点 一.静态页面与动态页面 1.静态页面 概念:在Web模型中,页面中的信息是在html文件中定义好的,数据不会改变,称为"静态页面",无法根据用 ...
- JAVA——J2EE之Servlet 基础篇(一)
一.开发Servlet Servlet 本身不能独立运行,需要在一个web应用中运行的 而一个web应用是部署在tomcat中的 所以开发一个servlet需要如下几个步骤 创建web应用项目 编写s ...
- ☀️苏州程序大白一文让你学会Java Servlet基础☀️《❤️记得收藏❤️》
☀️苏州程序大白一文让你学会Java Servlet基础☀️<❤️记得收藏❤️> 目录
最新文章
- ASP.NET页面之间传值的方式之QueryString(个人整理)
- 生物界地震,AlphaFold破解50年重大挑战,AI+X将迎来新时代
- 从零开始写一个武侠冒险游戏-6-用GPU提升性能(1)
- Android Studio 2.3 Canary 3 版本发布
- 网售鞋王Zappos的戏剧性成功:做到极致
- GB2312简体中文编码表(转)
- 【TensorFlow】【数字货币】【单词记忆】【微信运营】【DIY电脑】 | Chat · 预告
- UTC时间转成北京时间
- Python爬虫-爬取开心网主页(有登录界面-利用cookie)
- Parallel ScavengeGC收集器
- .net core 使用阿波罗配置中心
- VUE | key的内部原理、Vue监测数据的原理、Vue.set()和vm.$set()的使用
- JavaWeb - 软件开发的流程,综合案例
- win10如何自动切换壁纸
- 生产环境(基于docker)故障排除? 有感于博客园三番五次翻车
- 在Android系统中添加组合键快捷启动功能
- java进行文档类型转换PDF
- 【国际】交易所订单类型
- 中级Shader教程06 2D火焰粒子
- MySQL DQL语句基础(随堂博客)