一个基于servlet极简的web框架实现,通过web.xml来做servlet mapping是痛苦的。简单写了一个web框架。
<?xml version="1.0" encoding="UTF-8"?> <web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"> <servlet> <servlet-name>dispatcherServlet</servlet-name> <servlet-class>com.taobao.proxy.web.ProxyDispatcherServlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>dispatcherServlet</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> </web-app>
package com.taobao.tlog.proxy.web; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * 此Servlet是web.xml的入口,提供了简单实用的servlet mapping,避免写大量的xml * @author yunpeng * */ public class ProxyDispatcherServlet extends HttpServlet { public static final Logger logger = LoggerFactory.getLogger(ProxyDispatcherServlet.class); private static final long serialVersionUID = -156295649559639694L; protected void mapper() throws InstantiationException, IllegalAccessException { UrlMapping.mapping("^/jobadd$", JobAddServlet.class); UrlMapping.mapping("^/jobinfo$", JobInfoServlet.class); UrlMapping.mapping("^/jobstatus$", JobStatusServlet.class); UrlMapping.mapping("^/$", ProxyServlet.class); } public void init() throws ServletException { logger.info("tlog-proxy starting..."); try { mapper(); } catch (Exception e) { throw new ServletException(e); } } protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String path = request.getRequestURI(); ProxyBaseServlet serviet = UrlMapping.find(path); if (serviet == null) { response.sendError(404); return; } else { serviet.doGet(request, response); } } }
package com.taobao.tlog.proxy.web; import java.util.HashMap; import java.util.Map; import java.util.Map.Entry; import java.util.regex.Matcher; import java.util.regex.Pattern; /** * 一个极简的urlMapping * @author yunpeng * */ public class UrlMapping { private static Map<Pattern, ProxyBaseServlet> urlPatterns = new HashMap<Pattern, ProxyBaseServlet>(); public static void mapping(String pattern, Class<? extends ProxyBaseServlet> servlet) throws InstantiationException, IllegalAccessException { Pattern ptn = Pattern.compile(pattern); urlPatterns.put(ptn, servlet.newInstance()); } public static ProxyBaseServlet find(String path) { for (Entry<Pattern, ProxyBaseServlet> entry : urlPatterns.entrySet()) { Matcher mc = entry.getKey().matcher(path); if (mc.find()) { return entry.getValue(); } } return null; } }
import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.taobao.hsf.tlog.proxy.web.core.ProxyBaseServlet; public class ProxyServlet extends ProxyBaseServlet { private static final long serialVersionUID = -2124094625600853748L; public static final Logger logger = LoggerFactory.getLogger(ProxyServlet.class); protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { jsonMsg(false, "this is tlog poxy ", response); } }
/** * 此Servlet是所有业务Servlet的基类,提供一些通用的方法 * @author yunpeng * */ public abstract class ProxyBaseServlet extends HttpServlet { /** * */ private static final long serialVersionUID = -7353341318065451370L; protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { this.doGet(request, response); } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { } protected void jsonMsg(boolean success, Object data, HttpServletResponse response) throws IOException { response.setContentType("text/html"); response.setStatus(HttpServletResponse.SC_OK); Map<String, Object> map = new HashMap<String, Object>(); map.put("success", success); map.put("data", data); String result = new Gson().toJson(map); response.getWriter().write(result); } }