The web module's manifest is very similar to the other bundles, but it imports the taglib and servlet bundles. Also instead of exporting a package, it imports the Message Service package exported by the Message Service bundles and specifies that is can use version 1.0.0 through 1.1.0.
Manifest-Version: 1.0
Bundle-Name: Simple Service Web Module
Bundle-SymbolicName: org.springbyexample.sdms.message.webModule
Bundle-Version: 1.0.0
Bundle-Vendor: Spring by Example
Bundle-ManifestVersion: 2
Import-Bundle: com.springsource.org.apache.taglibs.standard,
com.springsource.javax.servlet
Import-Library: org.aspectj;version="[1.6.0,1.7.0)",
org.springframework.spring;version="[2.5.5,3.0.0)"
Module-Type: Web
Web-ContextPath: message
Web-DispatcherServletUrlPatterns: *.html
Import-Package: org.springbyexample.sdms.message.service;version="[1.0.0,1.1.0]"
| The symbolic name the bundle is deployed under and another bundle could use to reference it. |
| The version the bundle is deployed under. |
| Declares the module type indicating this is a web module. This is used by the Spring dm Server. |
| The Web-ContextPath property configures the web application's context path. |
| The Web-DispatcherServletUrlPatterns property configures the dispatch servlet to route any matches for the pattern '*.html' to controllers. |
|
The Import-Package property imports the package
org.springbyexample.sdms.message.service which was exported by the message service bundle.
|
The bundle-context.xml isn't used in this example, but bundle-context-osgi.xml makes a reference to the message bundle service and exposes it as a bean. The Spring web configuration is in webmvc-context.xml.
The reference to the OSGi service MessageService is exposed as a bean
named messageService.
<?xml version="1.0" encoding="UTF-8"?>
<beans:beans xmlns="http://www.springframework.org/schema/osgi"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:beans="http://www.springframework.org/schema/beans"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/osgi
http://www.springframework.org/schema/osgi/spring-osgi.xsd">
<reference id="messageService" interface="org.springbyexample.sdms.message.service.MessageService"/>
</beans:beans>
This is just a standard Spring MVC configuration and the controller is register using context:component-scan.
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<context:component-scan base-package="org.springbyexample.sdms.web.message.mvc" />
<bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping">
<property name="interceptors" ref="localeChangeInterceptor"/>
</bean>
<!-- Enables annotated POJO @Controllers -->
<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter" />
<!-- Enables plain Controllers -->
<bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter" />
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"
p:prefix="/WEB-INF/jsp/"
p:suffix=".jsp"/>
<bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">
<property name="basenames">
<value>messages</value>
</property>
</bean>
<!-- Declare the Interceptor -->
<bean id="localeChangeInterceptor" class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor">
<property name="paramName" value="locale"/>
</bean>
<!-- Declare the Resolver -->
<bean id="localeResolver" class="org.springframework.web.servlet.i18n.SessionLocaleResolver" />
</beans>
To reduce the complexity of the example the controller just puts the message into
the Model and is rendered on the page using JSTL.
<html>
<head>
<title>Message</title>
</head>
<body>
<h1>Message</h1>
<p>${message}</p>
</body>
</html>
The controller has the message service defined in bundle-context-osgi.xml
injected using @Autowired. The display method maps to
/display/index.html" and puts the results of the message service
into the Model under the key 'message'.
Example 5. Mesage Service MessageController
@Controller
public class MessageController {
@Autowired
protected MessageService messageService = null;
/**
* Displays RMI info.
*/
@RequestMapping(value="/display/index.html")
public void display(Model model) {
model.addAttribute("message", messageService.getMessage());
}
}