web.xml
<servlet> <servlet-name>invoker</servlet-name> <servlet-class> org.apache.catalina.servlets.InvokerServlet </servlet-class> <init-param> <param-name>debug</param-name> <param-value>2</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>invoker</servlet-name> <url-pattern>/servlet/*</url-pattern> </servlet-mapping>
위와 같은 설정이 되어 있을 경우 해당 컨텍스트의 서블릿 클래스는 다음과 같이 호출됩니다.
http://ip:port/context/invoker-url-pattern/pacakge.ServletClass
이를 실제 URL로 위의 예를 변환하면
http://localhost:8080/test/servlet/info.javapattern.servlet.TestServlet
package org.jboss.servlets;
import java.io.IOException;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.jboss.logging.Logger;
public class SlashInvoker extends HttpServlet {
private static final long serialVersionUID = 156894170597729161L;
private int debug = 0;
private static Logger log = Logger.getLogger(SlashInvoker.class);
/** A serialized MarshalledInvocation */
/**
* Initializes the servlet.
*/
@Override
public void init(ServletConfig config) throws ServletException {
super.init(config);
try {
// Set our properties from the initialization parameters
if (getServletConfig().getInitParameter("debug") != null)
debug = Integer.parseInt(getServletConfig().getInitParameter("debug"));
} catch (Exception e) {
throw new ServletException("Failed to build invokerName", e);
}
}
/**
* Destroys the servlet.
*/
@Override
public void destroy() {
}
/**
* Handles the HTTP <code>GET</code> method.
*
* @param request
* servlet request
* @param response
* servlet response
*/
@Override
protected void doGet(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
processRequest(request, response);
}
/**
* Handles the HTTP <code>POST</code> method.
*
* @param request
* servlet request
* @param response
* servlet response
*/
@Override
protected void doPost(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
processRequest(request, response);
}
/**
* Returns a short description of the servlet.
*/
@Override
public String getServletInfo() {
return "An HTTP to JMX invocation servlet";
}
/**
* Process servlet request using slash url pattern
*
* @param request
* servlet request
* @param response
* servlet response
*/
protected void processRequest(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
try {
if( debug > 0 ) {
log.info("************ URI : " + request.getRequestURI());
log.info("************ PATH INFO : " + request.getPathInfo());
}
String servletClass = request.getPathInfo();
int slash = servletClass.indexOf('/');
if (slash >= 0) {
servletClass = servletClass.substring(slash + 1);
}
String inServletClass = servletClass.replace("/", ".");
String redirectUrl = request.getContextPath() + "/catalina/"
+ inServletClass;
if( debug > 0 )
log.info("************* Redirect URL : " + redirectUrl);
// response.sendRedirect(redirectUrl);
RequestDispatcher dispatcher = getServletContext()
.getRequestDispatcher("/catalina/" + inServletClass);
dispatcher.forward(request, response);
} catch (Exception e) {
throw new ServletException("Failed to build invokerName", e);
}
}
}
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5"> <display-name>jboss-jms-monitor</display-name> <welcome-file-list> <welcome-file>index.html</welcome-file> <welcome-file>index.htm</welcome-file> <welcome-file>index.jsp</welcome-file> </welcome-file-list> <servlet> <servlet-name>invoker</servlet-name> <servlet-class> org.jboss.servlets.SlashInvoker </servlet-class> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>invoker</servlet-name> <url-pattern>/servlet/*</url-pattern> </servlet-mapping> <servlet> <servlet-name>CatalinaInvoker</servlet-name> <servlet-class> org.apache.catalina.servlets.InvokerServlet </servlet-class> <init-param> <param-name>debug</param-name> <param-value>2</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>CatalinaInvoker</servlet-name> <url-pattern>/catalina/*</url-pattern> </servlet-mapping> </web-app>
테스트 웹 애플리케이션을 첨부합니다.


slash-invoker-web.zip
SetCharacterEncodingFilter.java

