Guice之Servlet基础

如果读者对于Guice没有大体的了解,可以参考本人的另一篇Guice基础文章

Guice 提供了一个完整的体系使得我们在web应用中也可以使用它作为依赖注入的工具.

为什么使用 Guice :

使用Guice的好处:

  1. 构造函数注入
  2. 类型安全的, 方便的配置方式(只需要在web.xml中进行很少的配置)
  3. 模块化
  4. 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 之旅了.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/499703.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

矩阵 I : 矩阵基础

学习机器学习, 基础的线性代数知识是必备的基础功, 对于线性代数的探索, 矩阵是线性代数的主要研究对象. 今天我们就开始学习一下矩阵的基础知识. 这是本人关于线性代数矩阵的第一篇分享. 章节目录 矩阵及其基本运算 1.1 矩阵定义 1.2 矩阵基本运算(,-,*) 1.3 转置矩阵 1…

矩阵 II : 线性组的线性相关性

学习机器学习, 基础的线性代数知识是必备的基础功, 对于线性代数的探索, 向量组也是线性代数的重要基础. 今天我们就开始学习一下线性代数中重要的向量组知识. 这是本人关于线性组的线性相关性的学习分享. 章节目录 相关性基本概念 1.1 相性相关和线性无关 1.2 相性相关性的…

汇编语言笔记(一):基础

章节目录 简单程序 使用段简单字符串处理程序使用 bx, si, di, bp 寄存器寻址寻址方法指明数据长度div指令 作者能力有限, 如果您在阅读过程中发现任何错误, 还请您务必联系本人,指出错误, 避免后来读者再学习错误的知识.谢谢! 本文中所有程序均在DOSBox下使用MASM, LINK编译运…

汇编学习笔记(二):转移指令

章节目录 转移指令原理 jmp 指令 jcxz 指令 loop 指令 ret 和 retf 指令 call 指令 callret 作者能力有限, 如果您在阅读过程中发现任何错误, 还请您务必联系本人,指出错误, 避免后来读者再学习错误的知识.谢谢! 本文中所有程序均在DOSBox下使用MASM, LINK编译运行 转移指令…

汇编语言笔记(三): 标志寄存器

章节目录 简介 ZF 标志寄存器PF 标志寄存器SF 标志寄存器CF 标志寄存器OF 标志寄存器几条相关指令DF 标志寄存器PUSHF and POPF 标志寄存器 作者能力有限, 如果您在阅读过程中发现任何错误, 还请您务必联系本人,指出错误, 避免后来读者再学习错误的知识.谢谢! 简介 8086 CPU…

汇编语言笔记(四):内中断

汇编语言笔记:内中断 章节目录 概念 中断过程示例: 0 号中断处理 作者能力有限, 如果您在阅读过程中发现任何错误, 还请您务必联系本人,指出错误, 避免后来读者再学习错误的知识.谢谢! 概念 中断信息: 任何一个通用 CPU 都具备一种能力, 可以在执行完当前正在执行的指令之…

sync.Map 源码学习

golang 线程安全的 Map 作者水平有限,而并发博大精深. 如文章中有任何错误, 希望读者不吝指出.谢谢! 章节目录 Map 基本类型定义StoreLoadDeleteRange Map 基本类型定义## Map 这里我们先看一下 Map 都涉及到那些类型. type Map struct {// 互斥锁. 用于互斥的读写 dirty.…

ASN.1 学习

ASN.1 章节目录 简介常用数据类型 2.1 常见的简单类型 2.2 结构类型Basic Encoding RulesDistinguished Encoding Rules编码示例 5.1 BIT STRING 5.2 IA5String 5.3 INTEGER 5.4 NULL 5.5 OCTET STRING 5.6 UTCTime 5.6 OBJECT IDENTIFIER编码 Name (X.501 type) 参考 http://…

证书体系: PFX 文件格式解析

原文同时发布于本人个人博客&#xff1a; https://kutank.com/blog/cert-pfx/ 章节目录 PFX 简介PFX 格式解析 2.1 最外层结构 2.2 AuthenticatedSafe 结构 参考 https://tools.ietf.org/html/rfc7292. PFX 简介## 以下引用自维基百科 在密码学中&#xff0c;PKCS #12 定义了…

C10K 非阻塞 Web 服务器

本文由作为 Going Concurrency in Go 的作者 Nathan Kozyra 撰写, 解决了互联网上最著名,最受尊敬的挑战之一, 并试图通过核心 Go 包来解决它. 原文地址: https://hub.packtpub.com/c10k-non-blocking-web-server-go/ 我们已经构建了一些可用的应用程序,并且可以在日常使用的真…

MD5 算法描述及实现

MD5 算法的原理及实现 章节目录 简介算法描述 实现 作者能力有限, 如果您在阅读过程中发现任何错误, 还请您务必联系本人,指出错误, 避免后来读者再学习错误的知识.谢谢! 简介## Wiki对其的描述: MD5消息摘要算法&#xff08;英语&#xff1a;MD5 Message-Digest Algorithm&…

SHA 算法描述与实现

SHA 算法的原理及实现 章节目录 简介算法描述 2.1 数据准备 2.1.1 数据填充 2.1.2 数据分块 2.1.3 设置初始 Hash 值 2.2 Hash 计算 2.2.1 SHA-1 2.2.2 SHA-256 2.2.3 SHA-512实现 作者能力有限, 如果您在阅读过程中发现任何错误, 还请您务必联系本人,指出错误, 避免后来读者…

SHA算法描述及实现

SHA 算法的原理及实现 章节目录 简介算法描述 2.1 数据准备 2.1.1 <数据填充 2.1.2 数据分块 2.1.3 设置初始 Hash 值 2.2 Hash 计算 2.2.1 SHA-1 2.2.2 SHA-256 2.2.3 SHA-512实现<b>作者能力有限, 如果您在阅读过程中发现任何错误, 还请您务必联系本人,指出错误, …

CNG 关于 Key 相关的操作

章节目录 简介创建 Key查看系统中的 Key从 Windows Store 导出 key导入 Key 到 Windows Store<b>作者能力有限, 如果您在阅读过程中发现任何错误, 还请您务必联系本人,指出错误, 避免后来读者再学习错误的知识.谢谢!</b> 简介 CNG 全称 Cryptography API: Next G…

Golang 词法分析器浅析

浅析 Go 语言的词法分析器 章节目录 简介TokenScanner例子 作者能力有限, 如果您在阅读过程中发现任何错误, 还请您务必联系本人,指出错误, 避免后来读者再学习错误的知识.谢谢! 简介## 在本文我们将简单的走读 Go 语言的词法分析器实现(go/scanner/scanner.go). 本文基于 G…

如何读懂 C 语言复杂的声明

如何读懂 C 语言复杂的声明 作者能力有限, 如果您在阅读过程中发现任何错误, 还请您务必联系本人,指出错误, 避免后来读者再学习错误的知识.谢谢! 参考<<C专家编程>> 废话 虽说 C 语言相比于其他更高级的语言来讲&#xff0c;有着非常精简的语法结构&#xff0c;对…

C 语言笔记: 链表节点实现技巧--struct的妙用

链表节点实现技巧–struct的妙用 作者能力有限, 如果您在阅读过程中发现任何错误, 还请您务必联系本人,指出错误, 避免后来读者再学习错误的知识.谢谢! 废话 C 语言虽然只提供了非常简单的语法&#xff0c;但是丝毫不影响 C 语言程序员使用 C 来实现很多让人叹为观止的高级功能…

协议簇: Media Access Control(MAC) Frame 解析

Media Access Control(MAC) Frame 解析 前言 千里之行&#xff0c;始于足下。 因为个人从事网络协议开发&#xff0c;一直想深入的学习一下协议族&#xff0c;从这篇开始&#xff0c;我将开始记录分享我学习到的网络协议相关的知识 简介 引用百度百科的描述&#xff1a; 数…

协议簇:Ethernet Address Resolution Protocol (ARP) 解析

简介 前面的文章中&#xff0c;我们介绍了 MAC Frame 的帧格式。我们知道&#xff0c;在每个 Ethernet Frame 中都分别包含一个 48 bit 的源物理地址和目的物理地址. 对于源地址很容易理解&#xff0c;该地址可以直接从硬件上读取. 但是对于一个网络节点&#xff0c;他怎么知道…

协议簇:IPv4 解析

简介 IP 是一种无连接的协议. 操作在使用分组交换的链路层&#xff08;如以太网&#xff09;上。此协议会尽最大努力交付数据包。 尽最大努力意味着&#xff1a; IP 协议不保证数据的可靠传输, 没有流量控制机制, 不保证传输序列(意味着 IP 数据包会在传输过程中乱序), 没有…