Vaadin、Spring 整合。
1.Spring配置
(1).web.xml
<param-name>contextConfigLocation</param-name> <param-value>classpath*:/spring-config.xml</paramvalue> </context-param> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <!-- spring管理session作用域的bean --> <listener> <listener-class>org.springframework.web.context.request.RequestContextListener</listener-class> </listener>
2.将Vaadin 的 Application 纳入到 Spring 的 Context中进行管理;
(1).web.xml
<!--Vaadin 应用程序Servlet继承vaadin的Appliction--> <servlet> <servlet-name>Vaadinmanager Application</servlet-name> <servlet-class>com.iyspace.manager.SpringApplicationServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>Vaadinmanager Application</servlet-name> <url-pattern>/*</url-pattern> </servlet-mapping>
(2).com.iyspace.manager.SpringApplicationServlet 类继承自Vaadin的application类,过滤所有的请求并从Spring的ApplicationContext中取得应用的Application对象
SpringApplicationServlet 源码
package com.iyspace.manager;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import org.springframework.web.context.WebApplicationContext;
import org.springframework.web.context.support.WebApplicationContextUtils;
import com.vaadin.Application;
import com.vaadin.terminal.gwt.server.AbstractApplicationServlet;
@SuppressWarnings("serial")
public class SpringApplicationServlet extends AbstractApplicationServlet {
/** Default application bean name in Spring application context. */
private static final String DEFAULT_APP_BEAN_NAME = "application";
/** Application bean name in Spring application context. */
private String name;
@Override
public void init(ServletConfig config) throws ServletException {
super.init(config);
String name = config.getInitParameter("applicationBeanName");
this.name = name == null ? DEFAULT_APP_BEAN_NAME : name;
}
@Override
protected Application getNewApplication(HttpServletRequest request) throws ServletException {
WebApplicationContext wac = WebApplicationContextUtils.getWebApplicationContext(getServletContext());
if (wac == null) {
throw new ServletException("Cannot get an handle on Spring's context. Is Spring running?"
+ "Check there's an org.springframework.web.context.ContextLoaderListener configured.");
}
Object bean = wac.getBean(Application.class);
if (!(bean instanceof Application)) {
throw new ServletException("Bean " + name + " is not of expected class Application");
}
return (Application) bean;
}
@SuppressWarnings({ "unchecked", "rawtypes" })
@Override
protected Class<? extends Application> getApplicationClass() throws ClassNotFoundException {
WebApplicationContext wac = WebApplicationContextUtils.getWebApplicationContext(getServletContext());
if (wac == null) {
throw new ClassNotFoundException("Cannot get an handle on Spring's context. Is Spring running? "
+ "Check there's an org.springframework.web.context.ContextLoaderListener configured.");
}
Object bean = wac.getBean(name);
if (bean == null) {
throw new ClassNotFoundException("No application bean found under name " + name);
}
return (Class) bean.getClass();
}
}
(3)应用的Application类
VaadinmanagerApplication
@Component("application")
@Scope("session")
public class VaadinmanagerApplication extends Application{
@Autowired
public MainWindow mainWindow; // Spring中管理存在在session作用域中
public VaadinmanagerApplication(){
System.out.println("application create");
}
@Override
public void init() {
this.mainWindow.showLoginPage();
setMainWindow(this.mainWindow);
}
}
现在就Vaadin和Spring就简单的整合到一起了,当有请求到来时SpringApplicationServlet 会判断如果是第一次请求(Session中没有VaadinmanagerApplication 对象)spring会创建该对象,若有该对象将直接使用。
以上的内容是google加自己摸索整理出来的如果有错误的地方欢迎指正。
先整到这里,明天再写 Vaadin页面怎么使用Spring中的bean来加载数据。