Hmm.  Here’s a full working example:

(in-package :common-lisp-user)

(ql:quickload :hunchentoot)
(ql:quickload :drakma)
(ql:quickload :cl-who)

(defpackage :org.softwarematters.hunchentoot-test
  (:nicknames :hunchentoot-test :web-test)
  (:use :common-lisp
        :cl-who))

(in-package :web-test)

;;; Define the web server acceptor

(defparameter *test-acceptor*
  (make-instance 'hunchentoot:easy-acceptor
                 :port 8081
                 :document-root #p"/Users/Patrick/src/lisp/web/"
                 :access-log-destination "/tmp/web-test-access.log"
                 :message-log-destination "/tmp/web-test-message.log"))

;;; A couple of macros for encapsulating the details of a standard page.
;;; This came from Stack Overflow (How to connect a web app to Hunchentoot)
;;; and http://www.adampetersen.se/articles/lispweb.htm.

(defmacro standard-page ((&key title) &body body)
  "Abstract away the placing of standard page stuff."
  `(with-html-output-to-string (*standard-output* nil :prologue t :indent t)
     (:html :xmlns "http://www.w3.org/1999/xhtml"
    :xml\:lang "en" 
    :lang "en"
    (:head 
     (:meta :http-equiv "content-type" 
    :content    "text/html;charset=UTF-8")
     (:title ,title)
     (:link :type "text/css" 
    :rel "stylesheet"
    :href "/test.css"))
    (:body 
     (:div :id "header")
     ,@body
     (:div :id "footer")))))

(defmacro defpage (name (title) &body body)
  `(progn
     (defmethod ,name ()
       (standard-page (,title)
         ,@body))
     (push (create-prefix-dispatcher ,(format nil "/~(~a~).html" name) ',name)
           *dispatch-table*)))

;;; URI implementations

(defun display-home-page ()
  "Display the home page."
  (hunchentoot:redirect "/index.html"))

(push (hunchentoot:create-regex-dispatcher "^/$" 'display-home-page)
      hunchentoot:*dispatch-table*)

(hunchentoot:define-easy-handler (home-page-handler
                                  :uri "/index.html"
                                  :default-request-type :GET)
    ()
  "Return the home page."
  (standard-page (:title "Web Test Home Page")
                 (:h1 "Web Test")
                 (:p "remote IP address: "
                     (format t "~A" (hunchentoot:remote-addr*)))
                 (:p "real remote IP address: "
                     (format t "~A" (hunchentoot:real-remote-addr)))
                 (:p "headers: "
                     (:br)
                     (dolist (header (hunchentoot:headers-in*))
                       (format t "~A: ~A<br/>" (car header) (cdr header))))
                 (:p "GET parameters: "
                     (format t "~A" (hunchentoot:get-parameters*)))))

;;; Override 404 handling

(defun display-404-page ()
  (standard-page (:title "Web Test 404 Page") (:h1 "404")))

(defmethod acceptor-status-message (acceptor (http-status-code (eql 404)) &key)
  (display-404-page))

;(defmethod hunchentoot:acceptor-status-message (acceptor (http-status-code (eql 404)) &key) "NOT FOUND")

;;; Start the web server

(hunchentoot:start *test-acceptor*)

I tried calling (display-404-page) in an easy-handler and it works fine.

Thanks for any help.

Regards,

Patrick

On May 8, 2014, at 9:12 AM, Hans Hübner <hans.huebner@gmail.com> wrote:

2014-05-08 15:07 GMT+02:00 Patrick May <patrick.may@mac.com>:
Removing the incorrect eql specialization still doesn’t result in my 404 page being displayed.  Do I have to subclass acceptor to get it to work?

No, it works just fine without an extra subclass, e.g.:

(defmethod hunchentoot:acceptor-status-message (acceptor (http-status-code (eql 404)) &key) "NOT FOUND")

-Hans