<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://m.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://m.tkk7.com)原創(chuàng),轉(zhuǎn)載請(qǐng)注明出處.
    主站蜘蛛池模板: 久久久无码精品亚洲日韩蜜桃 | 亚洲人成未满十八禁网站| 嫩草影院在线播放www免费观看| 在线观看亚洲成人| 青青草原1769久久免费播放| 在线播放亚洲第一字幕| 日韩免费在线视频| 亚洲视频在线观看地址| 最新欧洲大片免费在线 | 亚洲伊人成无码综合网| 久久国产美女免费观看精品| 亚洲精品亚洲人成人网| 午夜免费啪视频在线观看 | 无码国产亚洲日韩国精品视频一区二区三区| 亚洲熟妇无码av另类vr影视| 国产精品无码一区二区三区免费 | 卡一卡二卡三在线入口免费| 亚洲国产高清国产拍精品| 免费**毛片在线播放直播| gogo免费在线观看| 亚洲首页在线观看| 国产免费观看青青草原网站| 一级毛片完整版免费播放一区| 亚洲国产精品无码久久SM| 久久久久久免费视频| 激情无码亚洲一区二区三区| 伊人久久大香线蕉亚洲五月天 | 免费无码成人AV片在线在线播放| 国产精品亚洲五月天高清| 亚洲精品字幕在线观看| 少妇高潮太爽了在线观看免费| 狼色精品人妻在线视频免费| 亚洲毛片αv无线播放一区| 亚欧色视频在线观看免费| 亚洲av无码偷拍在线观看| 国产亚洲人成无码网在线观看| aⅴ在线免费观看| 成人久久久观看免费毛片| 亚洲欧洲精品视频在线观看| 国产免费小视频在线观看| baoyu116.永久免费视频|