<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    春風(fēng)博客

    春天里,百花香...

    導(dǎo)航

    <2008年4月>
    303112345
    6789101112
    13141516171819
    20212223242526
    27282930123
    45678910

    統(tǒng)計(jì)

    公告

    MAIL: junglesong@gmail.com
    MSN: junglesong_5@hotmail.com

    Locations of visitors to this page

    常用鏈接

    留言簿(11)

    隨筆分類(224)

    隨筆檔案(126)

    個(gè)人軟件下載

    我的其它博客

    我的鄰居們

    最新隨筆

    搜索

    積分與排名

    最新評(píng)論

    閱讀排行榜

    評(píng)論排行榜

    Struts的ActionServlet模擬實(shí)現(xiàn)

    Struts中,ActionServlet作為總控Servlet接受請(qǐng)求并轉(zhuǎn)發(fā)到各Action,它的原理并不復(fù)雜,本文即展示了ActionServlet模擬實(shí)現(xiàn)過程。

    首先,在Web.xml中配置,讓所有url帶.go(struts用的do我用go,特意區(qū)分一下)的請(qǐng)求都讓DispatchServlet處理,DispatchServlet就是ActionServlet模擬實(shí)現(xiàn)類.

    <?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"
    >

        
    <!-- welcome.jsp -->
        
    <welcome-file-list>
            
    <welcome-file>/web/page/first.jsp</welcome-file>
        
    </welcome-file-list>

        
    <!-- DispatchServlet -->
        
    <servlet>
            
    <servlet-name>DispatchServlet</servlet-name>
            
    <servlet-class>
                com.sitinspring.action.DispatchServlet
            
    </servlet-class>
            
    <init-param>
                
    <description>Configuration File</description>
                
    <param-name>configFile</param-name>
                
    <param-value>web-inf\mockStruts-config.xml</param-value>
            
    </init-param>
        
    </servlet>

        
    <servlet-mapping>
            
    <servlet-name>DispatchServlet</servlet-name>
            
    <url-pattern>*.go</url-pattern>
        
    </servlet-mapping>
    </web-app>

    上面指定了DispatchServlet的初始化參數(shù),DispatchServlet將用它找到配置文件mockStruts-config.xml,這個(gè)文件模擬對(duì)應(yīng)著Struts-config.xml.

    DispatchServlet的代碼如下:
    package com.sitinspring.action;

    import javax.servlet.ServletConfig;
    import javax.servlet.ServletContext;
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;

    import com.sitinspring.util.ServletFinder;
    import com.sitinspring.util.StringUtil;

    /**
     * 用于分發(fā)命令到其它Servlet的總控Servlet
     * 
    @author sitinspring
     *
     * @date 2008-2-12
     
    */
    public class DispatchServlet extends HttpServlet {
        
    private static final long serialVersionUID = 56890894234786L;

        
    public void doPost(HttpServletRequest request, HttpServletResponse response)
                
    throws ServletException, java.io.IOException {
            request.setCharacterEncoding(
    "UTF-8");

            
    // 通過ServletContext取得工程的絕對(duì)物理路徑
            ServletContext sct = getServletContext();
            String realPath 
    = sct.getRealPath("/");
            
            
    // 通過ServletConfig實(shí)例取得初始化參數(shù)configFile
            ServletConfig config=this.getServletConfig();        
            String mockStrutsCfgFile
    =config.getInitParameter("configFile");
            
            
    // 組合配置文件全物理路徑
            mockStrutsCfgFile=realPath+mockStrutsCfgFile;
            
            
    // 取得請(qǐng)求的URI
            String reqUri=request.getRequestURI();
            
            
    // 取得模式匹配字符串,即go,do等
            String patternStr;
            
    if(reqUri.contains("?")){
                patternStr
    =StringUtil.getMatchedString("([.])(.*)?",reqUri);
            }
            
    else{
                patternStr
    =StringUtil.getMatchedString("([.])(.*)$",reqUri);
            }

            
    // 取得下一個(gè)處理請(qǐng)求的Servlet名
            String servletName=StringUtil.getMatchedString("/(.*)/(.*)[.]"+patternStr,reqUri);
            
            
    // 以Servlet名為基礎(chǔ)從設(shè)定文件中取得響應(yīng)的Servlet類名
            ServletFinder finder=new ServletFinder(mockStrutsCfgFile,servletName);        
            String servletClass
    =finder.getServletClass();
            
            
    try {
                
    // 通過反射調(diào)用真正的Servlet類進(jìn)行處理
                Class cls=Class.forName(servletClass);
                HttpServlet servlet
    =(HttpServlet)cls.newInstance();
                servlet.service(request, response);
            } 
    catch (Exception e) {
                e.printStackTrace();
            }
        }
            
        
    public void doGet(HttpServletRequest request, HttpServletResponse response)
                
    throws ServletException, java.io.IOException {
            doPost(request, response);
        }
    }

    上面的注釋應(yīng)該說得比較清楚了,DispatchServlet的作用就是解析URI中的ServletName,然后在文件mockStruts-config.xml中以此查找對(duì)應(yīng)的Servlet類,然后用反射生成它的實(shí)例處理用戶請(qǐng)求.解析的過程借助了正則表達(dá)式,查找XML的過程借助了dom4j.

    mockStruts-config.xml文件內(nèi)容如下:
    <?xml version="1.0" encoding="GBK"?>

    <servlets>
        
    <!-- 處理登錄的Servlet -->
        
    <servlet>
            
    <name>login</name>
            
    <class>com.sitinspring.action.LoginServlet</class>
        
    </servlet>
        
        
    <!-- 處理注冊(cè)的Servlet -->
        
    <servlet>
            
    <name>register</name>
            
    <class>com.sitinspring.action.RegisterServlet</class>
        
    </servlet>
        
        
    <!-- 處理翻頁(yè)的Servlet -->
        
    <servlet>
            
    <name>ShowPage</name>
            
    <class>com.sitinspring.action.ShowPageServlet</class>
        
    </servlet>
    </servlets>

    接下來諸個(gè)Servlet類處理請(qǐng)求沒有什么特別的,你想怎么處理就怎么處理,在下面的Servlet中是找出了提交的所有參數(shù)并在后即頁(yè)面中展示.
    package com.sitinspring.action;

    import java.util.Enumeration;
    import java.util.Hashtable;
    import java.util.Map;

    import javax.servlet.RequestDispatcher;
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;

    /**
     * 用于登錄處理的Servlet
     * 
    @author sitinspring
     *
     * @date 2008-2-12
     
    */
    public class LoginServlet extends HttpServlet {
        
    private static final long serialVersionUID = 56890894234786L;

        
    public void doPost(HttpServletRequest request, HttpServletResponse response)
                
    throws ServletException, java.io.IOException {
            request.setCharacterEncoding(
    "UTF-8");
            
            Map
    <String,String> ht=new Hashtable<String,String>();
            
            
    // 取得輸入?yún)?shù)并存入哈希表
            Enumeration params=request.getParameterNames();        
            
    while(params.hasMoreElements()){
                String key
    =(String)params.nextElement();            
                String value
    =request.getParameter(key);
                
                ht.put(key, value);
            }
            
            request.setAttribute(
    "ht", ht);

            RequestDispatcher dispatcher 
    = request.getRequestDispatcher("/web/page/loginResult.jsp");
            dispatcher.forward(request, response);
            
    return;
        }
            
        
    public void doGet(HttpServletRequest request, HttpServletResponse response)
                
    throws ServletException, java.io.IOException {
            doPost(request, response);
        }
    }

    顯示結(jié)果的jsp頁(yè)面代碼:
    <%@ page contentType="text/html; charset=UTF-8"%>
    <%@page language="java" import="java.util.Map"%>
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
    <html>
    <head>
    <title>"MockStruts"-loginResult頁(yè)面</title>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <script src="web/js/ajax.js" type="text/javascript"></script>
    <link rel="stylesheet" rev="stylesheet" href="web/css/style.css"
        type
    ="text/css" />
    </head>

    <body>    
        
    <%
            Map
    <String,String> ht=(Map<String,String>)request.getAttribute("ht");    
        
            
    for(String key:ht.keySet()){
                
    String value=ht.get(key);
                
                out.print(
    "<p>參數(shù)名:"+key+" 參數(shù)值:"+value+"</p>");
            }
        
    %>
    </body>
    </html>

    轉(zhuǎn)發(fā)效果之一(通過form提交請(qǐng)求):



    轉(zhuǎn)發(fā)效果之二(通過鏈接提交請(qǐng)求):




    本文代碼下載(請(qǐng)?jiān)趌ib中加入dom4j-1.6.1.jar并載入到工程的庫(kù)中):
    http://www.tkk7.com/Files/sitinspring/MockStruts20080329004955.zip

    posted on 2008-03-29 00:31 sitinspring 閱讀(2460) 評(píng)論(2)  編輯  收藏 所屬分類: SSH

    評(píng)論

    # re: Struts的ActionServlet模擬實(shí)現(xiàn)[未登錄] 2008-04-03 16:25 CoderDream

    這個(gè)不錯(cuò),支持一下!  回復(fù)  更多評(píng)論   

    # re: Struts的ActionServlet模擬實(shí)現(xiàn) 2013-05-09 13:48 ily

    你好 這樣寫后如何處理并發(fā)問題.  回復(fù)  更多評(píng)論   

    sitinspring(http://www.tkk7.com)原創(chuàng),轉(zhuǎn)載請(qǐng)注明出處.
    主站蜘蛛池模板: 91免费人成网站在线观看18| 亚洲香蕉在线观看| 亚洲区小说区图片区QVOD| 亚洲人成无码网站久久99热国产| 国产成人精品男人免费| 国产公开免费人成视频| 国产美女做a免费视频软件| 四虎影在线永久免费观看| 免费人成年轻人电影| 亚洲午夜国产片在线观看| 亚洲中文字幕在线第六区| 国产亚洲日韩一区二区三区| 亚洲精品成人片在线播放 | 一个人免费日韩不卡视频| 久久午夜夜伦鲁鲁片无码免费| 99re免费99re在线视频手机版| 99热这里只有精品6免费| 最近免费中文字幕大全高清大全1| 中文字幕免费在线| 黄瓜视频影院在线观看免费| 成年女人免费视频播放体验区| 欧洲美熟女乱又伦免费视频| 内射无码专区久久亚洲| 国产偷国产偷亚洲清高动态图 | 99久久综合国产精品免费| 午夜一级毛片免费视频| 四虎永久成人免费| 中文字幕亚洲日本岛国片| 亚洲av色影在线| 国产日本亚洲一区二区三区| 国产亚洲福利一区二区免费看| 一区二区三区在线观看免费| 日本中文字幕免费高清视频| 国产情侣激情在线视频免费看| 国产精品免费视频播放器| 亚洲中文字幕无码一区二区三区 | 精品亚洲一区二区三区在线播放| 久久亚洲AV午夜福利精品一区| 亚洲人成黄网在线观看| 偷自拍亚洲视频在线观看 | 国产成人精品日本亚洲网址|