📄 wicket通过osgi框架注入jetty.txt
字号:
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 + -