此代码是 oschina 到手柄形状像 http://www.oschina.net/p/tomcat 这种URL

此类已经废弃,改用 http://www.oschina.net/code/snippet_12_2832

标签:
OSCHINA

[1].[代码] URLMappingServlet.java 跳至 

code=5#6" style="font-weight:normal; font-size:9pt; text-decoration:none">[1]

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
package

my.view;
 
import

java.io.*;
import

java.util.*;
 
import

javax.servlet.*;
import

javax.servlet.http.*;
 
import

org.apache.commons.lang.StringUtils;
import

org.apache.commons.logging.Log;
import

org.apache.commons.logging.LogFactory;
 
/**
 *
用于URL地址的转换
 *
http://www.oschina.net/news/list/1/3 -> {base}/news/list.vm?

p1=1&p2=3

 *
@author liudong
 */
public

final

class

URLMappingServlet
extends

HttpServlet {
 
    private

final

static

Log log = LogFactory.getLog(URLMappingServlet.
class); 
     
    public

final

static

String CURRENT_URI =
"current_uri";
//{index}
    public

final

static

String REQUEST_URI =
"request_uri";
//{/index}
     
    private

final

static

String DEFAULT_INDEX_PAGE =
"index.vm";
    private

final

static

String PAGE_EXTENSION =
".vm";
    private

final

static

char

URL_SEPERATOR =
'/';
 
    private

String default_base;
    private

HashMap<String, String> other_base =
new

HashMap<String, String>();
     
    private

String rootDomain =
"oschina.net";
     
    @Override
    @SuppressWarnings("unchecked")
    public

void

init()
throws

ServletException {
        Enumeration<String>
names = getInitParameterNames();
        while(names.hasMoreElements()){
            String
name = names.nextElement();
            String
v = getInitParameter(name);
            if("default".equalsIgnoreCase(name)){
                default_base
= v;
                continue;
            }
            for(String
n : StringUtils.split(name,
',')){
                other_base.put(n,
v);
            }
        }
    }
 
    private

String _GetTemplateBase(HttpServletRequest req) {
        String
base =
null;
        String
prefix = req.getServerName().toLowerCase();
        base
= other_base.get(prefix);
        if(base
!=
null)
            return

base;
        int

idx = prefix.indexOf(rootDomain);
        if(idx
>
0){
            prefix
= prefix.substring(
0,
idx -
1);
            base
= other_base.get(prefix);
        }
        return

(base==
null)?default_base:base;
    }
     
    /**
     *
运行页面映射过程
     *
@param req
     *
@param res
     *
@throws ServletException
     *
@throws IOException
     */
    protected

void

perform(HttpServletRequest req, HttpServletResponse res)
            throws

ServletException, IOException {
 
        StringBuilder
show_page =
new

StringBuilder(_GetTemplateBase(req));
        String
prefix = req.getServletPath().substring(
1);
        String
spath = req.getRequestURI();
        req.setAttribute(REQUEST_URI,
spath);
        req.setAttribute(CURRENT_URI,
prefix);
        //解析URL地址
        String[]
s_result = spath.substring(
1).split(String.valueOf(URL_SEPERATOR));
        if(s_result.length==1){
            show_page.append(prefix);
            show_page.append(URL_SEPERATOR);
            show_page.append(DEFAULT_INDEX_PAGE);
        }
        else{
            show_page.append(prefix);
            show_page.append(URL_SEPERATOR);
            //
Ex: http://www.oschina.net/admin/login/ld
            StringBuilder
testPath =
new

StringBuilder(show_page);
            testPath.append(s_result[1]);
            testPath.append(PAGE_EXTENSION);
            boolean

isVM = _IsVmExist(testPath.toString());
            int

param_idx =
1;
            if(isVM){
                show_page.append(s_result[1]);
                show_page.append(PAGE_EXTENSION);
                param_idx
=
2;
            }
            else{
                show_page.append(DEFAULT_INDEX_PAGE);
            }
            for(int

i=param_idx;i<s_result.length;i++){
                if(i==param_idx)
                    show_page.append('?');
                else
                    show_page.append('&');
                show_page.append('p');
                show_page.append((i-param_idx+1));
                show_page.append('=');
                show_page.append(s_result[i]);
            }
            testPath.setLength(0);
            testPath
=
null;
        }
        if(log.isDebugEnabled())
            log.debug("request_uri="+spath+",servlet_path="+
                            req.getServletPath()+",vm="+show_page);
        //运行真实的页面
        RequestDispatcher
rd = getServletContext().getRequestDispatcher(show_page.toString());
        rd.forward(req,
res);  
         
    }
 
    private

final

static

List<String> vm_cache =
new

Vector<String>();
     
    /**
     *
推断某个页面是否存在。假设存在则缓存此结果
     *
@param path
     *
@return
     */
    private

boolean

_IsVmExist(String path){
        if(vm_cache.contains(path))
            return

true
;
        File
testFile =
new

File(getServletContext().getRealPath(path));
        boolean

isVM = testFile.exists() && testFile.isFile();
        if(isVM)
            vm_cache.add(path);
        return

isVM;
    }
     
    @Override
    protected

void

doGet(HttpServletRequest req, HttpServletResponse resp)
            throws

ServletException, IOException {
        perform(req,
resp);
    }
 
    @Override
    protected

void

doPost(HttpServletRequest req, HttpServletResponse resp)
            throws

ServletException, IOException {
        perform(req,
resp);
    }
 
}

版权声明:本文博客原创文章,博客,未经同意,不得转载。

OSChina 的URL类的源代码重写过程的更多相关文章

  1. Java中的URL类

    Java的网络类可以让你通过网络或者远程连接来实现应用.而且,这个平台现在已经可 以对国际互联网以及URL资源进行访问了.Java的URL类可以让访问网络资源就像是访问你本地的文件夹一样方便快捷.我们 ...

  2. JVM——类的加载过程

    附一张图方便理解,一个类的执行过程 类的加载过程,简明的来说 类装饰器就是寻找类的字节码文件并构造出类在JVM内部表示的对象组件.在Java中,类装载器把一个类装入JVM中,要经过以下步骤: 装载:查 ...

  3. java之URL类

    Java的网络类可以让你通过网络或者远程连接来实现应用.而且,这个平台现在已经可 以对国际互联网以及URL资源进行访问了.Java的URL类可以让访问网络资源就像是访问你本地的文件夹一样方便快捷.我们 ...

  4. Java URL类踩坑指南

    背景介绍 最近再做一个RSS阅读工具给自己用,其中一个环节是从服务器端获取一个包含了RSS源列表的json文件,再根据这个json文件下载.解析RSS内容.核心代码如下: class Presente ...

  5. Java的URL类(一)

    转:https://www.cnblogs.com/blackiesong/p/6182038.html Java的URL类(一) Java的网络类可以让你通过网络或者远程连接来实现应用.而且,这个平 ...

  6. JAVA学习第六十三课 — 关于client服务端 &amp;&amp; URL类 &amp; URLConnection

    常见的client和服务端 client:       浏览器:IE:弹窗体,猎豹:弹窗体.多标签,争强效果 服务端:       server:TomCat:1.处理请求 2.给予应答 想让TomC ...

  7. 一文摸透从输入URL到页面渲染的过程

    一文摸透从输入URL到页面渲染的过程 从输入URL到页面渲染需要Chrome浏览器的多个进程配合,所以我们先来谈谈现阶段Chrome浏览器的多进程架构. 一.Chrome架构 目前Chrome采用的是 ...

  8. Java类的加载过程-重点!!

    java类的加载过程有以下几步共同完成: 加载->连接->初始化.连接又分为验证.准备.解析 一个非数组类的加载阶段(加载阶段获取类的二进制字节流的动作)是可控性最强的阶段,这一步我们可以 ...

  9. 【高并发】深度解析ScheduledThreadPoolExecutor类的源代码

    在[高并发专题]的专栏中,我们深度分析了ThreadPoolExecutor类的源代码,而ScheduledThreadPoolExecutor类是ThreadPoolExecutor类的子类.今天我 ...

随机推荐

  1. UVA 707 - Robbery(内存搜索)

    UVA 707 - Robbery 题目链接 题意:在一个w * h的图上.t个时刻,然后知道一些信息,每一个时刻没有小偷的矩阵位置,问哪些时刻能够唯一确定小偷位置.和确定小偷是否已经逃走,假设没逃走 ...

  2. C#的c/s做出开灯关灯计算?

    static void light(Boolean[] lights,int n) {     if (n <= 1 || lights.Length<5) return;     for ...

  3. JS脚本加载与执行对性能的影响

    高性能JavaScript-JS脚本加载与执行对性能的影响 在web产品优化准则中,很重要的一条是针对js脚本的加载和执行方式的优化.本篇文章简单描述一下其中的优化准则. 1. 脚本加载优化 1.1 ...

  4. java线程例子登山

    Through its implementation, this project will familiarize you with the creation and execution of thr ...

  5. JavaEEB2C网上商城前端系统

    问题的提出: 电子商务已经成为人们生活中不可或缺的组成部分,它提供了一种足不出户就可以挑选.购买.使用商品的方式.在众多点上网站中,综合类的B2C电商以其较高的可信度,丰富的商品类目,得到消费者的青睐 ...

  6. 源代码分析:LayoutParams的wrap_content, match_parent, 而详细的价值观

    问题: 慢慢地熟悉android 的过程中.发现view 要么layout初始化,建或者生产活动是很清楚.被添加到父控制,然后开始了相应的生命周期.但父控件的整个界面.还是第一个系统view. 怎么来 ...

  7. fscanf()功能具体解释

    一旦文件被解析常规时间或使用正则表达式.或者是敲自己太傻代码来解析一个普通文件. 今天突然发现c该图书馆有一个现成的文件可以解析常规功能,这是fscanf()功能.哎 曾经自己做了这么多无用功.在这里 ...

  8. IOT(Index Organized Table)

    我们知道一般的表都以堆(heap)的形式来组织的,这是无序的组织方式.Oracle还提供了一种有序的表,它就是索引组织表,简称IOT表.IOT表上必须要有主键,而IOT表本身不对应segment,表里 ...

  9. VMware vSphere 服务器虚拟化之十八桌面虚拟化之安装View Composer服务器

                        VMware vSphere 服务器虚拟化之十八桌面虚拟化之安装View Composer服务器      View Compose服务可安装在管理虚拟机的vC ...

  10. 使用QT 4.8.6 + Cmake 3.0.0 编译 最新版本OpenCv3.0.0

    mingw32 (x32) gcc g++ qt opencv- -- cmake -rc1 windows x64 参考文章: http://blog.csdn.net/qiurisuixiang/ ...