Skip to content
Various servets and filters
Java HTML
Branch: master
Clone or download

README.org

Java servlet common code

Servlet and filter classes that are intended to be inherited to cut down on boilerplate code

Status of the project

https://travis-ci.org/steinarb/servlet.svg?branch=master https://sonarcloud.io/api/project_badges/measure?project=no.priv.bang.servlet%3Aservlet&metric=alert_status#.svg https://maven-badges.herokuapp.com/maven-central/no.priv.bang.servlet/servlet/badge.svg https://www.javadoc.io/badge/no.priv.bang.servlet/servlet.svg

Sonarqube

https://sonarcloud.io/api/project_badges/measure?project=no.priv.bang.servlet%3Aservlet&metric=ncloc#.svg https://sonarcloud.io/api/project_badges/measure?project=no.priv.bang.servlet%3Aservlet&metric=bugs#.svg https://sonarcloud.io/api/project_badges/measure?project=no.priv.bang.servlet%3Aservlet&metric=vulnerabilities#.svg https://sonarcloud.io/api/project_badges/measure?project=no.priv.bang.servlet%3Aservlet&metric=code_smells#.svg https://sonarcloud.io/api/project_badges/measure?project=no.priv.bang.servlet%3Aservlet&metric=coverage#.svg

Release history

DateVersionComment
<2020-03-05 Thu 18:22>1.1.2Use runtime dependency to jackson-databind 2.9.10.3 to fix security issue CVE-2020-8840
<2020-02-21 Fri 22:42>1.1.1Bugfix release of the JerseyServlet with correct method name
<2020-02-19 Wed 07:52>1.1.0First release of the JerseyServlet
<2020-01-12 Sun 23:26>1.0.0First release of the FrontendServlet

Overview of the project

Frontend

This is a servlet that’s intended to be extended by a servlet serving out a JS frontend packed by webpack.

The servlet will search for resources matching the pathInfo (minus the webcontext) on the classpath and serve them out, setting the content type based on the file name extension.

The servlet will try serving the file “index.html” (that must exist on the classpath) for a list of routes, that can be set by a subclass. This is to handle reloads of URLs set by e.g. the react router.

To use the servlet in an application built with maven, add the maven dependency:

<dependency>
 <groupId>no.priv.bang.servlet</groupId>
 <artifactId>servlet.frontend</artifactId>
 <version>1.1.2</version>
</dependency>

To use the servlet in a webapp running in the apache karaf web whiteboard apache:

  1. Add a maven dependency
    <dependency>
     <groupId>no.priv.bang.servlet</groupId>
     <artifactId>servlet.frontend</artifactId>
     <version>1.1.2</version>
     <scope>provided</scope>
    </dependency>
        
  2. Create an OSGi bundle containing a DS component registering with the web whiteboard
    @Component(service={Servlet.class}, property={"alias=/myapp"})
    public class ReactServlet extends FrontendServlet {
        public ReactServlet() {
            super();
            setRoutes("/", "/counter", "/about");
        }
    
        @Reference
        public void setLogservice(LogService logservice) {
            super.setLogService(logservice);
        }
    }
        
  3. Add a runtime dependency to the bundle project’s template feature repository (i.e. src/main/feature/feature.xml in the bundle project):
    <features>
     <repository>mvn:no.priv.bang.servlet/servlet/1.0.0/xml/features</repository>
     <feature name="my-servlet">
      <feature>frontend-servlet</feature>
     </feature>
    </features>
        

Jersey

This is a servlet that’s intended to be extended by a servlet using jersey to implement a REST API.

The JerseyServlet does two things:

  1. Adds a way to add injected OSGi services to the HK2 dependency injection container, so that the OSGi services can be injected into Jersey resources, allowing the Jersey resources to be thin shims over OSGi service calls
  2. Adds the subpackage “.resources” of the servlet’s package as the default package to scan for Jersey resources Note! If a different package is set by configuration, this will override the default

To use the servlet in an application built with maven, add the maven dependency:

<dependency>
 <groupId>no.priv.bang.servlet</groupId>
 <artifactId>servlet.jersey</artifactId>
 <version>1.1.2</version>
</dependency>

To use the servlet in a webapp running in the apache karaf web whiteboard apache:

  1. Add a maven dependency
    <dependency>
     <groupId>no.priv.bang.servlet</groupId>
     <artifactId>servlet.jersey</artifactId>
     <version>1.1.2</version>
     <scope>provided</scope>
    </dependency>
        
  2. Create an OSGi bundle containing a DS component registering with the web whiteboard.
    package no.priv.bang.servlet.jersey.test;
    
    @Component(service={Servlet.class})
    public class ExampleJerseyServlet extends JerseyServlet {
    
        @Reference
        public void setHelloService(HelloService service) {
            addInjectedOsgiService(HelloService.class, service);
        }
    
        @Reference
        public void setLogService(LogService logservice) {
            super.setLogService(logservice);
        }
    }
        

    Note! The OSGi LogService must be added by a separate method, since the LogService is used by the JerseyServlet itself (as well as being added to HK2, which makes it possible to use LogService in Jersey resources).

  3. Add resources implementing REST API endpoints in the .resources sub-package of the servlet’s package, and use @Inject to inject the OSGi services that JerseyServlet adds to the HK2 dependency injection container:
    package no.priv.bang.servlet.jersey.test.resources;
    
    @Path("/hello")
    public class HelloResource {
    
        @Inject
        HelloService service;
    
        @GET
        @Produces("text/plain")
        public String getHello() {
            return service.hello();
        }
    }
        
  4. Add a runtime dependency to the bundle project’s template feature repository (i.e. src/main/feature/feature.xml in the bundle project):
    <features>
     <repository>mvn:no.priv.bang.servlet/servlet/1.1.2/xml/features</repository>
     <feature name="my-servlet">
      <feature>jersey-servlet</feature>
     </feature>
    </features>
        

License

This code is licensed under the Apache license v. 2. See the LICENSE file for details.

You can’t perform that action at this time.