OSChina 的URL重写处理类源码

此代码是 oschina 用来处理形如 http://www.oschina.net/p/tomcat 这样的URL的类

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

标签:
OSCHINA

[1].[代码] URLMappingServlet.java 跳至 [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);

    }

}

时间: 2024-08-08 09:24:02

OSChina 的URL重写处理类源码的相关文章

Thread类源码剖析

目录 1.引子 2.JVM线程状态 3.Thread常用方法 4.拓展点 一.引子 说来也有些汗颜,搞了几年java,忽然发现竟然没拜读过java.lang.Thread类源码,这次特地拿出来晒一晒.本文将剖析Thread类源码(本文后面源码全部默认JDK8),并讲解一些重要的拓展点.希望对大家能有一些帮助. 本文讲解主干全部出自源码和注释,保证了权威性.(注意:网上,某些书中很多观点都是错的,过时的,片面的,所以大家一定要看源码,重要事情说N遍,看源码!看源码!看源码......) 二.JVM

android 小说类源码制作教程源码下载

自己闲着没事制作了个小说软件用来自己看全本/连载小说, 翻页,字体大小,目录,自动更新 具体效果如下:奉献给大家下载查看... 下载APK效果查看地址: http://yun.baidu.com/s/1gdknYyJ 源码下载地址: http://download.csdn.net/detail/ainibaifenbai/7575817 android 小说类源码制作教程源码下载,布布扣,bubuko.com

Scroller类源码解析及其应用(一)

滑动是我们在自定义控件时候经常遇见的难听,让新手们倍感困惑,这篇文章主要介绍Scroller类的源码,告诉打击这个到底有什么用,怎么使用它来控制滑动.另外,我还会结合一个简单的例子,来看一下这个类的应用. 要说明Scroller类,我们往往要从另外两个方法说起,一个是ScrollTo(),一个是ScrollBy() 这两个方法我们可以在View的源码看到,我们知道其实每个空间都有滚动条,只是有的我们将它隐藏,所以我们看不见 下面是ScrollTo方法 /** * Set the scrolled

List 接口以及实现类和相关类源码分析

List 接口以及实现类和相关类源码分析 List接口分析 接口描述 用户可以对列表进行随机的读取(get),插入(add),删除(remove),修改(set),也可批量增加(addAll),删除(removeAll,retainAll),获取(subList). 还有一些判定操作:包含(contains[All]),相等(equals),索引(indexOf,lastIndexOf),大小(size). 还有获取元素类型数组的操作:toArray() 注意事项 两种迭代器Iterator和L

Java集合---Array类源码解析

Java集合---Array类源码解析              ---转自:牛奶.不加糖 一.Arrays.sort()数组排序 Java Arrays中提供了对所有类型的排序.其中主要分为Primitive(8种基本类型)和Object两大类. 基本类型:采用调优的快速排序: 对象类型:采用改进的归并排序. 1.对于基本类型源码分析如下(以int[]为例): Java对Primitive(int,float等原型数据)数组采用快速排序,对Object对象数组采用归并排序.对这一区别,sun在

Cocos2d-X3.0 刨根问底(六)----- 调度器Scheduler类源码分析

上一章,我们分析Node类的源码,在Node类里面耦合了一个 Scheduler 类的对象,这章我们就来剖析Cocos2d-x的调度器 Scheduler 类的源码,从源码中去了解它的实现与应用方法. 直入正题,我们打开CCScheduler.h文件看下里面都藏了些什么. 打开了CCScheduler.h 文件,还好,这个文件没有ccnode.h那么大有上午行,不然真的吐血了, 仅仅不到500行代码.这个文件里面一共有五个类的定义,老规矩,从加载的头文件开始阅读. #include <funct

ASP.NET实现用户在线检测的类源码

//online.cs(用户在线检测) /*程序实现思路: 该用户有以下几个属性: name:用户名 sessionID:用户ID,通过它唯一表示一个用户 iswhere :附加信息,用户当前所在位置 lasttime:用户登陆时间 curtime:本次刷新时间 在客户端,使用一个IFRAME,装载一个刷新页面,每隔XX秒更新一下他的名字对应的curtime,就表示他仍然在 在服务器端,建立一个守护线程,每隔固定时间就运行一遍,然后判断当前所有用户列表中的时间间隔是否超出了规定的时间,如果超出,

Long类源码浅析

1.Long类和Integer相类似,都是基本类型的包装类,类中的方法大部分都是类似的: 关于Integer类的浅析可以参看:Integer类源码浅析 2.这里主要介绍一下LongCache类,该缓存类比Integer的缓存类,实现更简单 1 private static class LongCache { 2 private LongCache(){} 3 4 static final Long cache[] = new Long[-(-128) + 127 + 1]; 5 6 static

Java的URL来下载网页源码

import java.io.BufferedInputStream; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.Reader; import java.net.MalformedURLException; import java.net.URL; import java.net.URLConnection; @SuppressWarn