Skillversitas

Jython Servlets

A servlet is a Java class that handles HTTP requests in a web container (Tomcat, Jetty). Jython can write servlets in Python: your class extends javax.servlet.http.HttpServlet and overrides doGet/doPost - the container treats it like any Java servlet. This was a classic Jython use case: dynamic web handlers with Python's brevity on a Java server.

A Minimal Servlet

from javax.servlet.http import HttpServlet, HttpServletRequest, HttpServletResponse
import java.io

class HelloServlet(HttpServlet):
    def doGet(self, request, response):
        response.setContentType("text/html")
        out = response.getWriter()
        try:
            out.write("<html><body><h1>Hello from Jython</h1></body></html>")
        finally:
            out.flush()

    def doPost(self, request, response):
        name = request.getParameter("name") or "world"
        response.setContentType("text/plain")
        out = response.getWriter()
        try:
            out.write("Hello, " + name)
        finally:
            out.flush()

Registration in web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee">
  <servlet>
    <servlet-name>hello</servlet-name>
    <servlet-class>org.python.util.PyServlet</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>hello</servlet-name>
    <url-pattern>/hello</url-pattern>
  </servlet-mapping>
</web-app>

The Jython distribution provides a PyServlet bridge that locates your Python servlet class by name, so the container can instantiate your Python class.

Deploying to Tomcat

  1. Put jython.jar (and any dependencies) in WEB-INF/lib of your webapp.
  2. Put your servlet .py file in WEB-INF (or a package directory it can import).
  3. Register the mapping in web.xml as above and redeploy.
  4. Curl the endpoint: curl "http://localhost:8080/myapp/hello?name=Ada".

Parameters, Cookies, Sessions

def doGet(self, request, response):
    q = request.getParameter("q")            # query string
    page = request.getParameter("page") or "1"

    session = request.getSession(True)
    visits = session.getAttribute("visits") or 0
    session.setAttribute("visits", int(visits) + 1)

    cookie = javax.servlet.http.Cookie("theme", "dark")
    cookie.setMaxAge(60 * 60 * 24)
    response.addCookie(cookie)

    response.setContentType("text/plain")
    response.getWriter().write(
        f"q={q} page={page} visits={visits + 1}")

A Modern Note

Newer projects more often run FastAPI, Spring Boot, or similar, and Jython servlets are a legacy pattern - but for existing Tomcat/Jetty deployments they remain a way to add Python handlers without rewriting in Java.

Summary

Write a Jython servlet by subclassing HttpServlet and implementing doGet/doPost in Python, register it through the PyServlet bridge in web.xml, and deploy jython.jar plus your .py file into the webapp's WEB-INF. You get full servlet API access (parameters, sessions, cookies) from concise Python on a standard Java container.