<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年3月>
    2425262728291
    2345678
    9101112131415
    16171819202122
    23242526272829
    303112345

    統(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)過(guò)程。

    首先,在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");

            
    // 通過(guò)ServletContext取得工程的絕對(duì)物理路徑
            ServletContext sct = getServletContext();
            String realPath 
    = sct.getRealPath("/");
            
            
    // 通過(guò)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 {
                
    // 通過(guò)反射調(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)該說(shuō)得比較清楚了,DispatchServlet的作用就是解析URI中的ServletName,然后在文件mockStruts-config.xml中以此查找對(duì)應(yīng)的Servlet類,然后用反射生成它的實(shí)例處理用戶請(qǐng)求.解析的過(guò)程借助了正則表達(dá)式,查找XML的過(guò)程借助了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>

    接下來(lái)諸個(gè)Servlet類處理請(qǐng)求沒(méi)有什么特別的,你想怎么處理就怎么處理,在下面的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ā)效果之一(通過(guò)form提交請(qǐng)求):



    轉(zhuǎn)發(fā)效果之二(通過(guò)鏈接提交請(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 閱讀(2461) 評(píng)論(2)  編輯  收藏 所屬分類: SSH

    評(píng)論

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

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

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

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

    sitinspring(http://www.tkk7.com)原創(chuàng),轉(zhuǎn)載請(qǐng)注明出處.
    主站蜘蛛池模板: 亚洲日产2021三区在线| 亚洲高清免费视频| 亚洲免费网站在线观看| 久久免费视频观看| 男女一边摸一边做爽的免费视频| 边摸边脱吃奶边高潮视频免费| 亚洲精品无码久久久久秋霞| 在线观看亚洲AV日韩AV| 中文字幕亚洲码在线| 一本天堂ⅴ无码亚洲道久久| 亚洲精华国产精华精华液| 亚洲日产乱码一二三区别| 亚洲中文字幕无码爆乳app| 亚洲精品美女久久7777777| 成a人片亚洲日本久久| 国产亚洲美女精品久久| 全部一级一级毛片免费看| 一级黄色免费毛片| 国产免费内射又粗又爽密桃视频 | 99热亚洲色精品国产88| 亚洲一区二区观看播放| 国产AV无码专区亚洲AV麻豆丫| 国产成人综合亚洲| 一级毛片免费播放试看60分钟| 99视频在线观看免费| 久9热免费精品视频在线观看| 2021精品国产品免费观看| 97国产免费全部免费观看| 夫妻免费无码V看片| 亚洲国产精品综合久久一线| 亚洲中文字幕无码日韩| 久久亚洲国产成人精品性色| 亚洲va成无码人在线观看| 美国毛片亚洲社区在线观看| 香蕉视频在线免费看| 国产精品爱啪在线线免费观看| 成人性生活免费视频| 亚洲一区二区三区在线视频| 亚洲综合激情另类小说区| 亚洲精品久久久久无码AV片软件| 乱人伦中文视频在线观看免费|