天天看點

spring+vaadin的一個記錄

public class SimpleAddressBook extends AbstractApplicationServlet  {
	@Resource(name="messageSource")
	private ResourceBundleMessageSource messageSource;
	private Class<? extends Application> clazz;
	@Override
	public void init(ServletConfig config) throws ServletException{
		super.init(config);
		WebApplicationContext wac = WebApplicationContextUtils.getRequiredWebApplicationContext(
		config.getServletContext());
		Application application = (Application) wac.getBean("application", Application.class);
		clazz = application.getClass();
	}
	@Override
	protected Application getNewApplication(HttpServletRequest request)
			throws ServletException {
		// TODO Auto-generated method stub
		WebApplicationContext wac = WebApplicationContextUtils.getRequiredWebApplicationContext(request.getSession().getServletContext());
		return (Application) wac.getBean("application", Application.class);
	}
	@Override
	protected Class<? extends Application> getApplicationClass()
			throws ClassNotFoundException {
		// TODO Auto-generated method stub
		return clazz;
	}
	
}
           
<?xml version="1.0" encoding="UTF-8"?> 
<web-app...> 
... 
  <servlet> 
      <servlet-name>Vaadin servlet</servlet-name> 
      <servlet-class>ch.frankel.blog.vaadin.SpringVaadinServlet </servlet-class> 
      <init-param> 
       <param-name>application</param-name> 
      <param-value>ch.frankel.blog.vaadin.Application</param-value> 
      </init-param> 
  </servlet> 
  <servlet-mapping> 
      <servlet-name>Vaadin servlet</servlet-name> 
      <url-pattern>/*</url-pattern> 
  </servlet-mapping> 
</web-app>
           

轉帖過來:

I lately became interested in Vaadin, another web framework but where everything is done on the server side: no need for developers to learn HTML, CSS nor JavaScript. Since Vaadin adress my remarks about web applications being to expensive because of a constant need of well-rounded developers, I dug a little deeper: it will probably be the subject of another post.

Anyway, i became a little disappointed when I wanted to use my favourite Dependency Injection framework, namely Spring, in Vaadin. After a little Google research, I found the Vaadin Wiki and more preciselythe page talking about Vaadin Spring Integration. It exposes two ways to integrate Spring in Vaadin.

The first one uses the Helper “pattern”, a class with static method that has access to the Spring application context. IMHO, those Helper classes should be forgotten now we have DI since they completely defeat its purpose. If you need to explicitly call the Helper static method in order to get the bean, where’s the Inversion of Control?

The second solution uses Spring proprietary annotation

@Autowired

in order to use DI. Since IoC is all about decoupling, I’m vehemently opposed to coupling my code to the Spring framework.

Since neither option seemed viable to me, let me present you the one I imagined: it is very simple and consists of subclassing the Vaadin’s

AbstractApplicationServlet

and using it instead of the classical

ApplicationServlet

.

?
    
          

01

02

03

04

05

06

07

08

09

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

public

class

SpringVaadinServlet

extends

AbstractApplicationServlet {

/** Class serial version unique identifier. */

private

static

final

long

serialVersionUID = 1L;

private

Class clazz;

@Override

public

void

init(ServletConfig config)

throws

ServletException {

super

.init(config);

WebApplicationContext wac = WebApplicationContextUtils.getRequiredWebApplicationContext(

config.getServletContext());

Application application = (Application) wac.getBean(

"application"

, Application.

class

);

clazz = application.getClass();

}

/**

* Gets the application from the Spring context.

*

* @return The Spring bean named 'application'

*/

@Override

protected

Application getNewApplication(HttpServletRequest request)

throws

ServletException {

WebApplicationContext wac = WebApplicationContextUtils.getRequiredWebApplicationContext(

request.getSession().getServletContext());

return

(Application) wac.getBean(

"application"

, Application.

class

);

}

/**

* @see com.vaadin.terminal.gwt.server.AbstractApplicationServlet#getApplicationClass()

*/

@Override

protected

Class getApplicationClass()

throws

ClassNotFoundException {

return

clazz;

}

}

This solution is concise and elegant (according to me). Its only drawback is that it couples the servlet to Spring. But a class-localized coupling is of no consequesence and perfectly acceptable. Morevoer, this lets you use Spring autowiring mechanism, JSR 250 autowiring or plain old XML explicit wiring.

http://blog.frankel.ch/vaadin-spring-integration

此高手的部落格

繼續閱讀