| java 版和C# 版 UrlRewriter 的实现方法 | |
| java 版UrlRewriter 的实现 web.xml <?xml version="1.0" encoding="UTF-8"?> <web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> <filter> <filter-name>urlRewriter</filter-name> <filter-class>dang.web.UrlRewriter</filter-class> </filter> <filter-mapping> <filter-name>urlRewriter</filter-name> <url-pattern>*.jhtml</url-pattern> <dispatcher>REQUEST</dispatcher> </filter-mapping> </web-app> package dang.web;![]() import java.io.IOException; import java.io.InputStream; import java.util.regex.Pattern; import java.util.ArrayList; import java.util.List;![]() import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import javax.servlet.http.HttpServletRequest; import javax.xml.parsers.DocumentBuilderFactory;![]() import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.NodeList; import org.w3c.dom.Node;![]() ![]() public class UrlRewriter implements Filter![]() ![]() { private static List<UrlPattern> urlpattern_list = null; public void doFilter(ServletRequest request, ServletResponse response,FilterChain chain) throws IOException, ServletException![]() { if(urlpattern_list==null) getPatternListFromResource(); String path = getFullRequestInfo((HttpServletRequest)request); for(UrlPattern up : urlpattern_list)![]() { if(up.isMatch(path)) request.getRequestDispatcher(up.replace(path)).forward(request, response); } } private static void getPatternListFromResource()![]() { Document xdoc = null; try![]() { InputStream stream = UrlRewriter.class.getResourceAsStream("/w.xml"); xdoc = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(stream); } catch (Exception e)![]() {![]() } if(xdoc==null) return; NodeList list = xdoc.getDocumentElement().getChildNodes(); urlpattern_list = new ArrayList<UrlPattern>(); int i,len=list.getLength(); for(i=0;i<len;i++)![]() { Node n = list.item(i); if(n.getNodeType()==Node.ELEMENT_NODE)![]() { Element e = (Element)n; UrlPattern up = new UrlPattern(e.getAttribute("find"), e.getAttribute("to")); urlpattern_list.add(up); } } } private static String getFullRequestInfo(HttpServletRequest request)![]() { String url = request.getRequestURI(); String para = request.getQueryString(); return para==null?url:url.concat("?").concat(para); } ![]() public void destroy() {}![]() ![]() public void init(FilterConfig filterConfig) {} }![]() class UrlPattern![]() ![]() { //<editor-fold defaultstate="collapsed" desc="UrlPattern class"> private Pattern p; private String to; public UrlPattern(String find,String to)![]() { this.p=Pattern.compile(find); this.to = to; } public String replace(String path)![]() { return p.matcher(path).replaceAll(to); } public boolean isMatch(String path)![]() { return p.matcher(path).matches(); } //</editor-fold> }web.config <?xml version="1.0"?> <configuration> <configSections> <section name="urlRewriter" type="System.Configuration.IgnoreSectionHandler"/> </configSections> <urlRewriter> <add find="^/(\d+).aspx$" to="/product.aspx?page_index=$1&page_size=5"/> </urlRewriter> <system.web> <httpModules> <add name="urlRewriter" type="Dang.Web.HttpModule.UrlRewriter,Dang.Web"/> </httpModules> </system.web> </configuration>UrlRewriter.cs using System;
using System.Web; using System.Xml; using System.Text; using System.Collections; using System.Text.RegularExpressions; using System.Configuration;![]() namespace BBS.Core![]() ![]() { public class UrlRewriter : IHttpModule![]() { private static UrlRegex[] regArray = null;![]() static UrlRewriter()![]() { XmlDocument xmlDoc = new XmlDocument(); xmlDoc.Load(string.Concat(AppDomain.CurrentDomain.BaseDirectory,"web.config")); XmlNodeList nodeList = xmlDoc.SelectNodes("/configuration/urlRewriter/add");![]() int j = nodeList.Count; regArray = new UrlRegex[j];![]() for (int i = 0; i < j; i++) regArray[i] = new UrlRegex(nodeList[i].Attributes["find"].Value, nodeList[i].Attributes["to"].Value); }![]() public void Dispose()![]() { }![]() public void Init(HttpApplication context)![]() { context.BeginRequest += new System.EventHandler(context_BeginRequest); }![]() void context_BeginRequest(object sender, System.EventArgs e)![]() { HttpContext context = ((HttpApplication)sender).Context; string url = context.Request.RawUrl; foreach (UrlRegex reg in regArray) if (reg.IsMatch(url)) context.RewritePath(reg.Replace(url)); } }![]() ![]() public class UrlRegex![]() { private Regex reg = null; private string find = null; private string to = null;![]() public UrlRegex(string find, string to)![]() { this.reg = new Regex(find, RegexOptions.IgnoreCase); this.find = find; this.to = to; }![]() public string Replace(string input)![]() { return this.reg.Replace(input, this.to); }![]() public bool IsMatch(string input)![]() { return this.reg.IsMatch(input); } } } |
|
| 楼主 创建:08-06-02 11:20:00 更新:08-06-02 11:20:00 | |
| 发表回复 | |
| 1/1(共1页) | |
| 大狗熊 | 上面 的 java 版的 UrlRewriter 也可以用Servlet 实现 代码类似 <servlet> |
| 1楼 创建:08-06-02 15:22:19 更新:08-06-02 15:22:19 | |
| 发表回复 | |