- 浏览: 172374 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (72)
- java (21)
- spring (3)
- struts2 (0)
- hibernate (0)
- sql (3)
- linux (20)
- java web (2)
- maven (1)
- cache (2)
- memcached api (1)
- 简化jdbc操作数据库 (2)
- JAVA 网络编程 (3)
- JAVA 多线程 (0)
- C&C++ (1)
- plsql (1)
- SVN常用命 (2)
- Hadoop2 (0)
- jvm (0)
- flex (0)
- html5 & css3 & ECMAscript (0)
- RFC 文档翻译 (0)
- http (0)
- Hadoop (1)
- android (0)
- BIG_DATA (2)
- v (0)
- linux php tomcat tengine (1)
最新评论
-
yuanliangding:
没整理。文章还有重复的部分。
Java虚拟机(JVM)中的内存设置详解 -
svsecomm:
...
转javassist用法 -
svsecomm:
[u][/u]
转javassist用法 -
hvang1988:
用惯了spirng,Guice的注解方式真有点不习惯反向的感 ...
Google Guice 5 web -
xaocaotanghui:
Java虚拟机(JVM)中的内存设置详解
3 Web 和 Servlet
3.1 快速开始
我们从一个例子开始Guice Web的开发。
首先准备我们的环境,由于是web开发,因此我们需要guice-servlet的jar包。log4j不是必须的,只是为了方便日志记录而已(Guice内部是使用jdk内部的logging包来完成日志记录的)。
必可避免的要在web.xml中都一些手脚,这里先配置一个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>
GuiceFilter中并没有帮我们完成Guice的初始化工作,因此我们必须手动完成Guice的模块注入。
2
3 @Override
4 protected Injector getInjector() {
5 return Guice.createInjector(new ServletModule());
6 }
7 }
8
继续在web.xml中添加东西。
<listener-class>cn.imxylz.study.guice.web.MyGuiceServletContextListener</listener-class>
</listener>
显然我们需要将某个PATH映射到一个Servlet上,于是需要在ServletModule上做点事情。
2
3 @Override
4 protected Injector getInjector() {
5 return Guice.createInjector(new ServletModule() {
6 protected void configureServlets() {
7 serve("/helloworld").with(HelloWorldServlet.class);
8 }
9 });
10 }
11 }
12
这里将/helloworld这个地址映射到HelloWorldServlet上。好吧,先写个 “HelloWorld”的Servlet吧。
2 public class HelloWorldServlet extends HttpServlet{
3 private static final long serialVersionUID = 1L;
4 @Override
5 protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException,
6 IOException {
7 resp.getWriter().append("Hello, guice! "+new Date());
8 }
9 }
注意,根据Guice的Servlet要求,每一个Servlet必须是单例的,因此这里强制加上@Singleton。
好了,我们来看看输出。
3.2 注入服务
当然了,既然是一个IOC的容器,那么在Guice中也是可以注入服务的。
首先定义一个服务。
2 public interface HelloWorld {
3
4 void execute() throws IOException;
5 }
6
接着是服务的实现,注意在我们的服务中需要request和response对象,并且我们的服务假定是与request绑定的,采用@RequestScoped标签来标识。
2 public class HelloWorldImpl implements HelloWorld {
3
4 private HttpServletRequest request;
5 private HttpServletResponse response;
6 @Inject
7 public HelloWorldImpl(HttpServletRequest request, HttpServletResponse response) {
8 super();
9 this.request = request;
10 this.response = response;
11 }
12
13 public void execute() throws IOException{
14 String name=request.getParameter("user");
15 if(name==null||name.length()<1)name="Guest";
16 response.getWriter().append(String.format("Hello, %s. %s -> sessionId=%s,hashCode=%d "n", name,new Date(),request.getSession().getId(),hashCode()));
17 }
18
19 }
20
然后在我们的Servlet中可以采用如下实现。
2 public class HelloWorldServlet extends HttpServlet{
3 private static final long serialVersionUID = 1L;
4 @Inject
5 private Injector inj;
6 @Override
7 protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException,
8 IOException {
9 inj.getInstance(HelloWorld.class).execute();
10 inj.getInstance(HelloWorld.class).execute();
11 }
12 }
这里我们自动注入Injector对象,然后通过Inject对象获取我们的服务,注意我们没有将HttpServletRequest和HttpServletResponse手动注入到我们的服务中。
好了,我们再来看看输出。可以看到我们的对象是与request绑定,同一个request使用的同一个HelloWorld服务,不同的request那么是同一个session获取的服务也是不一样的。
老实说,Guice关于WEB的东西其实大概就这么多。其它的关于多规则匹配顺序,正则表达式匹配等等其实不谈也罢,都很弱,用处不大。
3.3 整合Struts 2
Guice可以与Struts 2整合,当然了理论上可以与其它MVC框架整合,只是Guice官方提供了一个Struts 2的插件。
aopalliance-1.0.jar是guice-servlet依赖的,因此guice需要aopalliance/guice/guice-servlet/guice-struts2-plugin等包,struts2启动依赖commons-logging/freemarker/ognl/struts2-core/xwork等jar包。lo4j只是为了记录日志方便而已。
首先定义一个服务,服务很简单输出服务器的状态。
2
3 String getStatus();
4 }
5
2
3 public String getStatus() {
4 return "I'am running.";
5 }
6 }
7
然后写一个Module绑定服务及其实现,当然如果偷懒可以使用@ImplementedBy,这里为了说明如果在配置文件中配置Module,所以单写一个Module。
2 @Override
3 public void configure(Binder binder) {
4 binder.bind(Service.class).to(ServiceImpl.class);
5 }
6 }
然后写一个SessionScope级别的对象绑定访问次数。
2 public class AccessCounter {
3
4 private AtomicInteger count = new AtomicInteger(0);
5
6 public int visit() {
7 return count.incrementAndGet();
8 }
9
10 @Override
11 public String toString() {
12 return String.format("AccessCounter#%s:%d", this.hashCode(), count.get());
13 }
14 }
15
好了,我们的Servlet出场了。
2
3 import com.google.inject.Inject;
4
5 public class AccessStatusAction {
6
7 final AccessCounter counter;
8 final Service service;
9 String message;
10
11 @Inject
12 public AccessStatusAction(AccessCounter counter, Service service) {
13 this.counter = counter;
14 this.service = service;
15 }
16
17 public String execute() {
18 return "success";
19 }
20
21 public int getCount() {
22 return counter.visit();
23 }
24
25 public String getStatus() {
26 return service.getStatus();
27 }
28
29 public String getMessage() {
30 return message;
31 }
32
33 public void setMessage(String message) {
34 this.message = message;
35 }
36 }
37
可以看到我们很简单的服务又被Guice给入侵了,所以说Guice对我们业务逻辑的侵入是很大,估计这也是很多程序员不愿意推广Guice的一个原因吧。
要写的Java代码就这么多,剩下的就是一堆的配置了。
首先web.xml中配置struts2的filter,注意这里我们没必要再配置一个guice的listener了,因为在guice的struts2的插件中已经配置一个ServletModule了。
2 <web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
3 xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
4 version="2.5">
5
6 <display-name>guice</display-name>
7 <description>xylz study project - guice</description>
8
9 <filter>
10 <filter-name>guiceFilter</filter-name>
11 <filter-class>com.google.inject.servlet.GuiceFilter</filter-class>
12 </filter>
13 <filter-mapping>
14 <filter-name>guiceFilter</filter-name>
15 <url-pattern>/*</url-pattern>
16 </filter-mapping>
17 <filter>
18 <filter-name>struts2</filter-name>
19 <filter-class>org.apache.struts2.dispatcher.FilterDispatcher
20 </filter-class>
21 </filter>
22 <filter-mapping>
23 <filter-name>struts2</filter-name>
24 <url-pattern>/*</url-pattern>
25 </filter-mapping>
26 <!-- listener>
27 <listener-class>cn.imxylz.study.guice.web.MyGuiceServletContextListener</listener-class>
28 </listener -->
29 </web-app>
30
下面该配置struts.xml了。
2 "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
3 "http://struts.apache.org/dtds/struts-2.0.dtd">
4
5 <struts>
6
7 <constant name="guice.module" value="cn.imxylz.study.guice.web.struts2.ServiceModule"/>
8
9 <package name="default" extends="struts-default">
10 <action name="access-status"
11 class="cn.imxylz.study.guice.web.struts2.AccessStatusAction">
12 <result>access-status.jsp</result>
13 </action>
14 </package>
15
16 </struts>
17
在这里先配置我们的Module,我们的Module就是完成Guice的注入过程。在guice的Struts2插件中类com.google.inject.struts2.GuiceObjectFactory有以下逻辑:
void setModule(String moduleClassName) {
try {
// Instantiate user's module.
@SuppressWarnings({"unchecked"})
Class<? extends Module> moduleClass =
(Class<? extends Module>) Class.forName(moduleClassName);
this.module = moduleClass.newInstance();
} catch (Exception e) {
throw new RuntimeException(e);
}
}
这段逻辑就是完成我们Module的注入过程。
当然了我们需要配置一个Struts2的action类cn.imxylz.study.guice.web.struts2.AccessStatusAction,访问地址access-status.action正确的时候渲染access-status.jsp页面。
2
3 <html>
4 <body>
5 <h1>Access Status</h1>
6 <h3><b>Access in this session:</b>
7 <s:property value="count"/></h3>
8
9 <h3><b>Status:</b>
10 <s:property value="status"/></h3>
11
12 <h3><b>Message:</b>
13 <s:property value="message"/></h3>
14 <h4><%="sessionId="+session.getId()%></h4>
15 </body>
16 </html>
17
所有的工作就完成了,我们看看浏览器中的渲染结果。
即使如此,Guice整合Struts 2还是比较弱的。
发表评论
-
java annotation
2013-10-19 14:27 712元数据的作用 如果要对于元数据的作用进行分类,目前还没有明 ... -
sun directory server
2013-10-17 14:07 736Sun One Directory Server(LDAP) ... -
sun ldap
2013-10-16 16:07 412LDAP快速入门 1. LDAP简介 LDAP(轻 ... -
httpclient 上传文件客户端处理
2013-10-07 11:09 897/** * */package cn.vwall.playe ... -
httpclient 上传文件 服务端解析
2013-10-07 11:07 847//commons-fileupload.jar common ... -
ffmpeg 视频加水印
2013-09-02 14:22 8271ffmpeg为视频添加水印watermark【转加补充】 ... -
ffmpeg args
2013-08-25 02:17 936先从Mencoder这个开始,将所有格式转AVI, RM ... -
socket 2
2013-06-11 20:57 974二、用于获得和设置Socket选项的getter和sette ... -
StringUtils
2012-12-31 01:45 1741StringUtils详细介绍 public stat ... -
转javassist用法
2012-10-15 17:15 13371Javassist是一个执行字 ... -
转 Quartz Cron
2012-10-02 10:28 1119Cron表达式 Quartz使用类似于Linux下的Cr ... -
apache db
2012-05-23 16:15 936queryRunner 摘抄 查询 runner ... -
Excel 色表
2012-05-11 16:09 1212按颜色菜单的色块位置排列 第1列 第2列 ... -
Google Guice 5 aop
2012-05-02 23:06 15502 AOP 面向切面编程 2.1 AOP入门 在前面 ... -
Google Guice 4
2012-05-02 23:00 1893本章节继续讨论依赖注入的其他话题,包括作用域(scope ... -
Google Guice 3
2012-05-02 22:43 15491.3 更多话题 1.3.1 接口多实现 如果一个接 ... -
Google Guice 2
2012-05-02 22:30 11291.2 属性注入(Field Inject) 1.2. ... -
Google Guice 1
2012-05-02 22:23 15051. 依赖注入 1.1 类依赖注入 所谓的绑定就是将 ... -
Java虚拟机(JVM)中的内存设置详解
2012-04-13 17:03 32769Java虚拟机(JVM)中的内存设置详解 在一些 ... -
hashCode、hashCode()与HashSet集合
2011-09-09 14:02 1029hashCode、hashCode()与HashSet集合 ...
相关推荐
Google Guice 这个高效的与Spring类似的依赖注入框架; MyBatis配置和使用; Google Guice与MyBatis集成,支持注解事务,简单的无法想象; Mybatis与mysql集成;实现发送邮件轮询; 源码是个web项目,里面有数据库的...
* How you can build real world, Guice-powered web applications using popular frameworks like Wicket or Struts 2. * How to develop a full stack Guice / Struts 2 / Hibernate application. * What you ...
GWizard是一个模块化的,有根据的工具包,用于在Guice主干网上构建RESTful Web服务。 GWizard被实现为一组Guice模块(打包在单独的maven模块中),您可以对其进行混合和匹配,以启用日志记录,jaxrs服务,Hibernate...
shiro-guice-async-webapp 使用 Apache Shiro 1.2.3、JBoss RestEasy 3 和 Google Guice 3 和异步 HTTP 请求处理支持构建 RESTful Web 服务的示例项目。包含的依赖项Servlet 3.1.0 ( ) JBoss RestEasy 3.0.9.Final ...
warp-persist-2.0是最近刚刚发布的、基于Google Guice的轻量级Web开发框架。 Warp是一个相当棒的Java Web框架,而且前景非常看好。 Warp框架充分利用了JDK5.0的Annotation和泛型机制,并且基于Google Guice这个...
支持构建RESTful应用程序:控制器动作可以绑定到特定的HTTP方法和URI 开箱即用地支持JSP 小巧轻便具有很高的测试覆盖率,使框架易于更改Mojave MVC整合了Google Guice框架。 通过使用标准@Inje
Web bean 是由 JBoss 创造的,帮助填平Java EE5的裂隙。EE 5平台对用成熟的技术包括EJB3,JTA,JCA和JPA来访问事务资源提供了极大 支持。当然,此平台也以支持广泛的Web...组件模型受到Google Guice 和Seam的极大影响。
The Google Web Toolkit (GWT) is a nifty framework that Java programmers can use to create Ajax applications. The GWT allows you to create an Ajax application in your favorite IDE, such as IntelliJ ...
RESTful 服务是使用 Oracle Jersey(JAX-RS 实现)和 Google Guice 编写的。 构建后端需要 Gradle。 后端 Main 类启动嵌入式 Jetty 以提供 REST 资源。 构建 Web 前端需要 Grunt 和 Bower。 npm install、grunt ...
这是一个使用的示例 Web 应用程序。 详情请查看 。 使用 Maven 运行项目: $ mvn jetty:run 当 PermGen 空间出现 OutOfMemoryError 时,设置 MaxPermSize。 例如: $ export MAVEN_OPTS="-XX:MaxPermSize=128m...
khsSherpa 的 Google Guice 依赖注入集成。 此处链接到 khsSherpa 项目...[ ] 入门 要使其正常工作,请按照下列步骤操作: 添加 <listener>com.khs.guice.SherpaGuiceContextListener</listener> 在 Sherpa ...
带有 Jersey 1.18.1 和 Google Guice 3.0 的 RESTful Web 服务应用程序示例项目 包含的依赖项 小服务程序 2.5 泽西岛 1.18.1 吉斯 3.0 guice 持久化 3.0 gson 2.2.4 乔达时间 2.4 JUnit 4.10 要求 Java 7 ...
wro4j是一个免费的开源java项目,它汇集了几乎所有的现代web工具:jshint、csslint、jsmin、google closure compressor、yui compressor、uglifyjs、dojo shrinksafe、css变量支持、json压缩、less、sass、...
), Jetty 9 推荐) ##特征符合 Java 8 Servlet 3.x 异步请求和过滤器Google Guice 依赖注入Apache Shiro 安全上下文与 JAX-RS 2.x 兼容的 JBoss RestEasy ##用法在你的 pom.xml 中插入这个依赖项: ...
包含零件WAR打包,适合在任何Servlet 3.0容器上运行Google Guice v4的IoC Quartz计时器服务Hibernate管理数据库对象REST API,基于Jersey(服务器端)和Retrofit(客户端) Web UI示例:一个通过Vaadin v7
Optimus提供基于Google Guice IOC容器的注释来代替XML配置和一个XML-less Navigation Handler能够让你减少基于XML配置JSF Navigation的需要。此外Optimus还支持利用JPA实现数据持久化;将DataTable的内容导出成Excel...
Optimus提供基于Google Guice IOC容器的注释来代替XML配置和一个XML-less Navigation Handler能够让你减少基于XML配置JSF Navigation的需要。此外Optimus还支持利用JPA实现数据持久化;将DataTable的内容导出成Excel...
Mocha MVC,只是另一个轻量级的WebMVC框架受Google 启发,这是一个专注于轻量级和性能的小型Web MVC框架。 它与和Guice一起很好地工作,也可以与其他DI甚至没有任何DI一起工作。特征使用DSL配置URL映射,摆脱XML(您...
带有 Jersey 1.18.1 和 Google Guice 3.0 的 RESTful Web 服务应用程序示例项目 包含的依赖项 小服务程序 2.5 泽西岛 1.18.1 吉斯 3.0 guice 持久化 3.0 gson 2.2.4 乔达时间 2.4 JUnit 4.10 要求 Java 7 ...