On Thu, 2011-12-22 at 10:35 +0100, Oleksiy Stashok wrote:
> On 12/21/2011 09:32 PM, Ryan Lubke wrote:
> > On 12/21/11 11:47 AM, Andreas Kohn wrote:
> > >
> > > [ migrating from ServletHandler in 2.1.7 to 2.2 ]
> > >
> > With the API changes, there should be no reason to directly create the
> > ServletHandler yourself.
> >
> > The proper way to register a servlet now would be:
> >
> > WebappContext ctx = new WebappContext("Test", "/contextPath");
> >
> > Then call ctx.addServlet(String, Servlet);
> >
> > final ServletRegistration reg = ctx.addServlet(name, new
> > HttpServlet() {
> >
> > @Override
> > protected void doGet(
> > HttpServletRequest req, HttpServletResponse resp)
> > throws IOException {
> > LOGGER.log(Level.INFO, "{0} received request {1}", new
> > Object[]{alias, req.getRequestURI()});
> > resp.setStatus(HttpServletResponse.SC_OK);
> > resp.setHeader("Content-Type", header);
> > resp.setHeader("Path-Info", req.getPathInfo());
> > resp.setHeader("Request-Was", req.getRequestURI());
> > resp.setHeader("Servlet-Name", getServletName());
> > resp.getWriter().write(alias);
> > }
> > });
> >
> > Then add the path mapping:
> >
> > reg.addMapping(alias);
> >
> > Register the WebappContext with the HttpServer:
> >
> > ctx.deploy(httpServerInstance);
> > httpServer.start();
> >
> > You should then be able to access the servlet.
> Just wanted to add that our motivation was making API similar to how
> Servlets are defined within webapplication.
> 1) It became easier to define several servlets, which share the same
> ServletContext (like webapplication)
> 2) Now Filters are getting associated with ServletContext
> (webapplication), not specific ServletHandler.
>
> Please let us know if we've missed some usecase.
Hi,
thanks, the new API actually looks nicer!
Unfortunately I'm hitting road blocks still.
WebappContext sets the context path to '/', and does not allow an
empty string. This breaks the ServletContext#getContextPath() spec,
which says:
The context path is the portion of the request URI that is used
to select the context of the request. The context path always comes
first in a request URI. The path starts with a "/" character but
does not end with a "/" character. For servlets in the default
(root) context, this method returns "".
(servlet-api 2.5 javadoc)
I'm trying to map my servlet to the root, and neither addMapping("/")
nor addMapping("") help in work properly:
addMapping("/") produces a handler at '//', which seems to actually work
if one explicitly uses the // in the URL (
http://host:port//). 500
Internal Error is returned for
http://host:port and
http://host:port/,
I'm not yet sure where from.
addMapping("") produces:
java.lang.StringIndexOutOfBoundsException: String index out of range: 0
at java.lang.String.charAt(String.java:695)
at org.glassfish.grizzly.servlet.WebappContext.updateMappings(WebappContext.java:1575)
at org.glassfish.grizzly.servlet.WebappContext.initServlets(WebappContext.java:1490)
at org.glassfish.grizzly.servlet.WebappContext.deploy(WebappContext.java:247)
Is this problem known?
Regards,
--
Andreas
--
Never attribute to malice that which can be adequately explained by
stupidity. -- Hanlon's Razor