⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 wicket通过osgi框架注入jetty.txt

📁 OSGI 开发指南源代码|实例|入门及相关的文档
💻 TXT
📖 第 1 页 / 共 2 页
字号:
protected ISessionStore newSessionStore() { 
return new SecondLevelCacheSessionStore(this, new DiskPageStore(new File(this.diskStorePath), (int) Bytes.megabytes(10).bytes(), (int) Bytes.megabytes( 
100).bytes(), 25)); 
} 

public void setDiskStorePath(String path){ 
this.diskStorePath = path; 
} 
} 

  由于Wicket1.3开始采用Filter处理Request,不再使用Servlet,所以我们的环境中只需要配置Filter的相关信息即可。为了能采用IOC方式配置Filter及其映射,引入一个新类FilterMapping:

java 代码

package wanged.web.wicket; 

import javax.servlet.Filter; 

public class FilterMapping { 
private Class filterClass; 

private Filter filter; 

private String urlPattern = "/*"; 

public Class getFilterClass() { 
return filterClass; 
} 

public void setFilterClass(Class filterClass) { 
this.filterClass = filterClass; 
} 

public Filter getFilter() { 
return filter; 
} 

public void setFilter(Filter filter) { 
this.filter = filter; 
} 

public String getUrlPattern() { 
return urlPattern; 
} 

public void setUrlPattern(String urlPattern) { 
this.urlPattern = urlPattern; 
} 

} 

  内容很简单,不多废话了。到目前为止,我们只是定义了Wicket相关的类文件,如何注入到Jetty中呢?接下来就是最主要的了:

java 代码
package wanged.web; 

import java.util.HashMap; 
import java.util.List; 
import java.util.Map; 

import org.mortbay.jetty.Handler; 
import org.mortbay.jetty.servlet.Context; 
import org.mortbay.jetty.servlet.DefaultServlet; 
import org.mortbay.jetty.servlet.FilterHolder; 
import org.mortbay.jetty.servlet.SessionHandler; 

import wanged.web.wicket.FilterMapping; 

public class ContextFactory { 

private HashMap attributes; 

private List filterMappings; 

private Context ctx = new Context(); ; 

public Context newInstance() { 
return ctx; 
} 

public void init() { 
if (this.attributes != null) { 
for (Map.Entry entry : this.attributes.entrySet()) { 
ctx.setAttribute(entry.getKey(), entry.getValue()); 
} 
} 
ctx.setSessionHandler(new SessionHandler()); 
ctx.addServlet(DefaultServlet.class, "/"); 

for (FilterMapping fm : filterMappings) { 
ctx.addFilter(new FilterHolder(fm.getFilter()), fm.getUrlPattern(), Handler.REQUEST); 
} 
} 

public void setFilterMappings(List filterMappings) { 
this.filterMappings = filterMappings; 
} 
public void setAttributes(HashMap attributes) { 
this.attributes = attributes; 
} 

public void setContextPath(String contextPath) { 
this.ctx.setContextPath(contextPath); 
} 

} 

  这个类负责收集我们配置文件中的bean,然后打包成一个Context作为一个对外声明的Handler服务(注意org.mortbay.jetty.servlet.Context实现了org.mortbay.jetty.Handler接口)。

  下面看配置文件web-bean.xml:

xml 代码
<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> 

<!-- 定义服务实现 --> 
<bean id="handler" factory-bean="contextFactory" factory-method="newInstance" /> 

<!-- Jetty的处理器工厂,用来向Jetty添加处理器 --> 
<bean id="contextFactory" class="wanged.web.ContextFactory" init-method="init"> 
<property name="contextPath" value="/" /> 
<property name="filterMappings"> 
<!-- Filter执行顺序预定顺序相关 --> 
<list> 
<ref bean="gzipFilterMapping" /> 
<ref bean="wicketFilterMapping" /> 
</list> 
</property> 
</bean> 

<bean id="gzipFilter" class="org.mortbay.servlet.GzipFilter" /> 

<bean id="wicketFilter" class="wanged.web.wicket.SpringWicketFilter"> 
<property name="applicationFactory" ref="applicationFactory" /> 
</bean> 

<bean id="wicketFilterMapping" class="wanged.web.wicket.FilterMapping"> 
<property name="filter" ref="wicketFilter" /> 
</bean> 

<bean id="gzipFilterMapping" class="wanged.web.wicket.FilterMapping"> 
<property name="filter" ref="gzipFilter" /> 
</bean> 

<bean id="applicationFactory" class="wanged.web.wicket.SpringWebApplicationFactory" init-method="init" > 
<property name="diskStorePath" value="F:/TMP" /> 
</bean> 

</beans> 

  这里定义了我们所使用到的各种类,同时SpringWebApplicationFactory在此获得Spring上下文信息。

  另一个声明服务的配置文件osgi-service.xml:

xml 代码

<osgi:service interface="org.mortbay.jetty.Handler" ref="handler" /> 

<osgi:reference id="roleService" interface="wanged.security.service.RoleService" /> 

  这里的roleService是引用了外部的一个服务,用来测试Sping注入的(可以用一个在web-bean.xml中定义的bean来代替测试)。

  以上已经完成了wicket的web应用注入jetty的工作,最后就是写一个LoginPage.java完成整个Bundle:

java 代码

package wanged.web.wicket.login; 

import org.apache.wicket.ajax.AjaxRequestTarget; 
import org.apache.wicket.ajax.markup.html.form.AjaxButton; 
import org.apache.wicket.markup.html.WebPage; 
import org.apache.wicket.markup.html.form.Form; 
import org.apache.wicket.markup.html.form.PasswordTextField; 
import org.apache.wicket.markup.html.form.TextField; 
import org.apache.wicket.model.CompoundPropertyModel; 
import org.apache.wicket.model.IModel; 

import wanged.security.entity.Role; 
import wanged.security.service.RoleService; 
import org.apache.wicket.spring.injection.annot.SpringBean; 
import org.mortbay.jetty.Handler; 

public class LoginPage extends WebPage { 

private LoginUser user; 

public LoginPage() { 
super(); 
this.user = new LoginUser(); 

Form form = new AutoSaveForm("loginForm", new CompoundPropertyModel(user)); 
add(form); 
form.add(new TextField("username")); 
form.add(new PasswordTextField("password")); 
} 

} 

class AutoSaveForm extends Form { 

/* 这里就是使用IOC的地方, 
试想一下如果没有IOC,我们如何让自定义的类来获得其他Bean呢 
*/ 
@SpringBean 
RoleService roleService; 

AutoSaveForm(String id, IModel m) { 
super(id, m); 
AjaxButton button = new AjaxButton("button", this) { 
@Override 
protected void onSubmit(AjaxRequestTarget target, Form form) { 
LoginUser user = (LoginUser)form.getModelObject(); 
System.out.println("un: " + user.getUsername()); 
System.out.println("pd: " + user.getPassword()); 
} 
}; 
this.add(button); 
} 
} 

  运行一下一切OK。感觉好繁琐呀!确实如此,OSGi带给我们的是基于组件的面向服务的开发,用来做小项目确实有点大炮打蚊子的感觉,但如果是做大型项目,就能充分体现出组件和SOA的优势。

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -