實現簡單配置的servlet單入口

更新:這個方法跟重不重啓並無關係,修改後的class要reload以後纔會生效,這個可在tomcat的後臺裏reload,不用重啓整個服務器。

用servlet作一些遊戲的後臺挺不錯,不過每一個servlet都要在web.xml中配置路徑映射也很麻煩。其實若是咱們實現servlet單入口,即只定義一個Servlet,而後在這個Servlet中處理轉發,就能夠免去這些麻煩了。下面是一些步驟。

一、定義處理器接口IAction。真正的處理器都繼承自這個接口,接口很簡單,只有一個方法,
import javax.servlet.http.HttpServletRequest;

/**
 * Action接口,用於執行真正的處理操做
 */
public interface IAction {
    public String execute(HttpServletRequest request);
}
二、編寫調度的Servlet,主要代碼:
// Action後綴,如/First對應FirstAction類
private static final String ACTION_EXT="Action";
// 自定義Action處理器所在的包名
private static final String PACKAGE_NAME="com.xxx.";

-----------------

protected void processRequest(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
    response.setContentType("text/html;charset=UTF-8");
    PrintWriter out = response.getWriter();
    // 根據url找到對應的action
    String uri=request.getRequestURI();
    String path=request.getContextPath();
    String actionName=uri.substring(path.length()+1)+ACTION_EXT;
    String fullActionName=PACKAGE_NAME+actionName;
    IAction action=null;
    try {
        Class<?> ref=Class.forName(fullActionName);
        action=(IAction)ref.newInstance();
    }
    catch (Exception e)
    {
    }
    if (action!=null)
    {
        out.println(action.execute(request));
    }
    else
    {
        out.println("Error: "+actionName+" not found.");
    }
}
三、配置,
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.1" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd">
    <servlet>
        <servlet-name>DispatcherServlet</servlet-name>
        <servlet-class>lib.DispatcherServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>DispatcherServlet</servlet-name>
        <url-pattern>/*</url-pattern>
    </servlet-mapping>
    <session-config>
        <session-timeout>
            30
        </session-timeout>
    </session-config>
</web-app>
讓DispatcherServlet接管全部的url。

以後編寫的Action就能夠不用在XML中配置了, 很靈活。
相關文章
相關標籤/搜索