Hoe kan ik een “root” Servlet toewijzen zodat andere scripts nog steeds kunnen worden uitgevoerd?

Ik probeer een Servlet te bouwen die een JSP-pagina aanroept, vergelijkbaar met het volgende:

public void doGet(HttpServletRequest req, HttpServletResponse resp)
        throws IOException, ServletException {
    req.getRequestDispatcher("/WEB-INF/main.jsp").forward(req, resp);
}

Ik heb deze Servlet nodig om te reageren op de root van het domein (bijv.: http://example.com/), dus Ik gebruik de volgende toewijzing in de web.xml:

<servlet-mapping>
    <servlet-name>MainServlet</servlet-name>
    <url-pattern>/*</url-pattern>
</servlet-mapping>

Het probleem dat ik heb is dat dit met ALLES overeenkomt, dus wanneer de coördinator doorstuurt naar “/WEB-INF/main.jsp”, komt dit overeen met het url-patroon, zodat de Servlet opnieuw wordt uitgevoerd. Dit resulteert in een lus die loopt totdat deze sterft met een java.lang.StackOverflowError.

Hoe kan ik de root matchen zonder te voorkomen dat andere scripts kunnen worden uitgevoerd?


Antwoord 1, autoriteit 100%

Gebruik een leeg patroon, bijv.

<servlet-mapping>
    <servlet-name>MainServlet</servlet-name>
    <url-pattern></url-pattern>
</servlet-mapping>

De servlet 3.0-specificatie heeft dit verduidelijkt:

De lege tekenreeks (“”) is een speciaal URL-patroon dat exact overeenkomt met de
context root van de applicatie

Dus het zou op zijn minst moeten werken op een 3.0-container, en ik heb geverifieerd dat het werkt op Jetty 8


Antwoord 2, autoriteit 59%

Het gebruik van het welkomstbestandselement van web.xml werkte voor mij, op app-engine. Dit is de mijne:

<web-app>
    <servlet>
        <servlet-name>RootServlet</servlet-name>
        <servlet-class>com.foo.RootServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>RootServlet</servlet-name>
        <url-pattern>/foo</url-pattern>
    </servlet-mapping>
    <welcome-file-list>
        <welcome-file>foo</welcome-file>
    </welcome-file-list>
</web-app>

Antwoord 3, autoriteit 14%

De oorspronkelijke vraag vermeldt niet dat ze een root-servlet op App Engine proberen toe te wijzen – het is gemakkelijk voor Tomcat (en andere servlet-containers voor zover ik weet), maar App Engine is geen normale servlet-container.

Mijn normale manier om een ​​webtoepassing met servlets te bouwen is om HttpServlet uit te breiden, een “pagina”-object toe te voegen met titel, inhoud, fouten, berichten enz. en voor uitvoer door te sturen naar een JSP-sjabloon. Dit was een absolute nachtmerrie om in App Engine te werken.

  • JSP-bestanden kunnen niet worden “benoemd” zonder een “/” aan het begin.
  • JSP-bestanden mogen niet in een submap staan
  • Servlets kunnen niet worden toegewezen aan de hoofdmap van uw toepassing met een “/” url-patroon

Hier is mijn web.xml (voor de beknoptheid aangepast) die uiteindelijk werkte.

<web-app>
  <servlet>
    <!-- this servlet needs to redirect to a NamedDispatcher
         called "template" -->
    <servlet-name>Home</servlet-name>
    <servlet-class>my.domain.HomeSv</servlet-class>
  </servlet>
  <servlet>
    <!-- jsp file must apparently be in root directory and have "/" at
         start of path -->
    <servlet-name>template</servlet-name>
    <jsp-file>/template.jsp</jsp-file>
  </servlet>
  <servlet-mapping>
    <!-- map your home servlet to somewhere other than "/" -->
    <servlet-name>Home</servlet-name>
    <url-pattern>/home</url-pattern>
  </servlet-mapping>
  <welcome-file-list>
    <!-- make your Home servlet the welcome file -->
    <welcome-file>home</welcome-file>
  </welcome-file-list>
</web-app>

Ik ben niet bijzonder wetenschappelijk geweest om dit alles te valideren, maar het lijkt nu voor mij te werken en daar ben ik best blij mee.


Antwoord 4, autoriteit 8%

U kunt een welkomstbestand met de naam index.jsp in de hoofdmap maken met de volgende code met behulp van JSTL of anderszins.

<c:redirect url="/main"/>

Dus in het web.xml-bestand heb je dit:

<welcome-file-list>
    <welcome-file>index.jsp</welcome-file>        
</welcome-file-list>

Dus iedereen die de root aanvraagt, wordt doorgestuurd naar /main. Nu kan uw servlet worden toegewezen aan de hoofdmap.

<servlet-mapping>
    <servlet-name>MainServlet</servlet-name>
    <url-pattern>/main</url-pattern>
</servlet-mapping>

Antwoord 5, autoriteit 2%

Probeer gewoon ‘*’ uit het patroon te verwijderen, bijv.

<url-pattern>/</url-pattern>

Antwoord 6, autoriteit 2%

Een oplossing wordt genoemd in een andere thread URL-patroon voor servlet-mapping in web.xmlmet behulp van URLrewrite -> http://tuckey.org/urlrewrite/


Antwoord 7

Heb je het onderstaande geprobeerd? (Let op de ontbrekende *, die een jokerteken is en de reden is dat uw configuratie alles opvangt.)

<servlet-mapping>
        <servlet-name>MainServlet</servlet-name>
        <url-pattern>/index.jsp</url-pattern>
</servlet-mapping>

(Bewerkt volgens opmerkingen van slechts /.)


Antwoord 8

Je kunt niet omleiden naar WEB-INF. Een servletcontainer zal nooit verzoeken om documenten in die map dienen.

Als je wilt dat je applicatie (niet alleen een servlet, maar de hele applicatie) beschikbaar is onder de root-context (“/” van “http://www.domainname.com/“), dan moet je er een contextvermelding voor instellen – geen servlet-toewijzing.

Met Tomcat voegt u een nieuwe <Context>mapping(op een van de ongeveer 3 verschillende mogelijke plaatsen).

Other episodes