Struts2 自訂MVC架構

來源:互聯網
上載者:User

標籤:分配   ant   request   span   final   source   ring   xml配置   注釋   

一、Model1與Model2:

Model1:就是一種純jsp開發技術,將商務邏輯代碼和視圖渲染代碼雜糅在一起。

Model2:Model2是在Model1的基礎上,將商務邏輯的代碼分離開來,單獨形成一個Servlet,Model2也是基於MVC開發

二、MVC設計模式:

由3個部分組成,各部分作用如下:

Model:模型,主要用於資料和業務的處理

View:視圖,用於資料的顯示

Controller:控制器,用於進行流程式控制制

MVC設計模式的特點:

①一個模型可以對應多個視圖

②顯示與邏輯控制的分離

③分層控制,減輕了代碼間的耦合

自訂MVC架構只需dom4j.jar包即可!

 

 三、準備XML文檔Framework.xml

注意點:

<!-- ELEMENT 表示元素 -->
<!-- ATTLIST 表示屬性 -->
<!-- CDATA 表示字串類型 -->
<!-- REQUIRED 表示此屬性必須的寫 -->
<!-- *代表多個 -->
<!-- IMPLIED 表示此屬性可寫 -->

<!DOCTYPE Framework[<!ELEMENT Framework (actions)><!ELEMENT actions (action*)><!ELEMENT action (result*)><!ATTLIST action name CDATA #REQUIRED                 class CDATA #REQUIRED><!ATTLIST RESULT name CDATA #IMPLIED                 redirect (true|false) "false">]><Framework><actions><action name="loginAction" class="cn.happy.action.LoginAction"><result name="success">success.jsp</result><result name="login">index.jsp</result></action></actions></Framework>

四、定義自己的Action介面,用於存放結果集和要執行的方法

public interface Action {    //定義兩個靜態字串常量(邏輯視圖名)    public static final String SUCCESS="success";    public static final String LOGIN="login";    //定義一個抽象方法execute    public String execute(HttpServletRequest request,HttpServletResponse response)throws Exception;}

五、定義ActionMapping類用於存放Action節點,即一個ActionMapping類可以視為設定檔中的一個action節點

public class ActionMapping {    //根據action節點中的屬性 以及action節點中的<result></result>節點定義三個私人屬性        private String name;//action的名稱    private String classname;//action對應程式中的類    private Map<String,String> results=new HashMap<String,String>();        //向results集合中添加資料的方法    public void addResult(String name,String value){        results.put(name, value);    }    //根據名稱擷取的方法    public String getResults(String name){        return results.get(name);    }        public Map<String, String> getResults() {        return results;    }    public void setResults(Map<String, String> results) {        this.results = results;    }    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }    public String getClassname() {        return classname;    }    public void setClassname(String classname) {        this.classname = classname;    }    

六、定義ActionMappingManager類用於管理ActionMapping,並通過dom4j解析Framework.xml設定檔。從而擷取根節點,以及actions節點,並通過for迴圈遍曆actions節點下的action節點拿到name和class的屬性值,由於一個action節點下有多個result節點 及遍曆action下所有的result節點,分別存入到actionMapping中的雙列集合中,最後得到所有action節點的集合

public class ActionMappingManager {    //actionMapping類的集合    private Map<String,ActionMapping> maps=new HashMap<String,ActionMapping>();    public ActionMapping getActionMapping(String name){        return maps.get(name);    }        //解析src下所有設定檔    public ActionMappingManager(String[]files){        for (String filename : files) {            init(filename);        }    }        //建立初始化方法,使用dom4j解析設定檔    public void init(String path){        try {             //getResourceAsStream取得該資源輸入資料流的引用保證程式可以從正確的位置抽取資料            InputStream is=this.getClass().getResourceAsStream("/"+path);            //解析XML            Document doc=new SAXReader().read(is);            //擷取根節點            Element root = doc.getRootElement();            //擷取actions節點             Element actions =(Element)root.elementIterator("actions").next();             //使用for迴圈來             //遍曆actions節點下的所有action節點             for (Iterator<Element> action=actions.elementIterator("action");action.hasNext();) {                //擷取到action節點                 Element actionnext = action.next();                //分別擷取到action節點中的name屬性和class屬性                 String name=actionnext.attributeValue("name");                 String classname=actionnext.attributeValue("class");                 //將以上兩個屬性儲存到ActionMapping類中                 ActionMapping mapp=new ActionMapping();                 mapp.setClassname(classname);                 mapp.setName(name);                 //由於一個action節點下有多個result節點 遍曆action下所有的result節點                 for (Iterator<Element> result=actionnext.elementIterator("result");result.hasNext();){                     //擷取到result節點                     Element resultnext = result.next();                     //提取result節點的name屬性值和result節點中的值                     String resultname= resultnext.attributeValue("name");                    String resultvalue= resultnext.getText();                     //將其分別存入到actionMapping中的雙列集合中去,方便調用actionMapping類(actionMapping類中就有資料了!)                    mapp.addResult(resultname, resultvalue);                 }                //得到所有action節點的集合                 maps.put(mapp.getName(), mapp);             }                } catch (Exception e) {                    }    }

七、使用反射機制根據字串類型的類名擷取到具體的類--ActionManager

public class ActionManager {    public static Action getActionClass(String classname){        Class clazz=null;        Action action=null;        //擷取當前線程的載入類        try {            clazz=Thread.currentThread().getContextClassLoader().loadClass(classname);        } catch (ClassNotFoundException e) {            e.printStackTrace();        }                if(clazz==null){            try {                //如果該線程中沒有,那麼使用class.forname方法擷取                clazz=Class.forName(classname);            } catch (ClassNotFoundException e) {                e.printStackTrace();            }        }                if(action==null){            //將擷取到的類型轉換為action,調用無參建構函式,某種程度上相當於new,不過new需要指定類型            try {                action =(Action)clazz.newInstance();            } catch (InstantiationException e) {                e.printStackTrace();            } catch (IllegalAccessException e) {                // TODO Auto-generated catch block                e.printStackTrace();            }        }        return action;    }

八、定義Servlet類,詳情見注釋!注意點在web.xml中添加 <load-on-startup>節點,讓程式一開始就初始化servlet

 

 

public class MyServlet extends HttpServlet {        public void doGet(HttpServletRequest request, HttpServletResponse response)            throws ServletException, IOException {           doPost(request,response);            }    ActionMappingManager man=null;    public void doPost(HttpServletRequest request, HttpServletResponse response)            throws ServletException, IOException {          //擷取到ActionMapping對象        ActionMapping actionMapping=man.getActionMapping(getname(request));        //擷取action介面利用反射機制        Action action = ActionManager.getActionClass(actionMapping.getClassname());        try {            String message=action.execute(request, response);            String results=actionMapping.getResults(message);            response.sendRedirect(results);        } catch (Exception e) {            e.printStackTrace();        }    }            //擷取請求路徑名        public String getname(HttpServletRequest request)        {            //項目+請求地址            String requestURI =request.getRequestURI();            //項目名稱            String contextPath=request.getContextPath();            //具體的請求            String path=requestURI.substring(contextPath.length());            String filename=path.substring(1,path.lastIndexOf(".")).trim();            return filename;                }        //重寫servlet的init方法,讓程式一開始就初始化servlet    //由於一個項目src根目錄下有可能有多個設定檔,不止一個,所以逐個解析            @Override    public void init(ServletConfig config) throws ServletException {                //初始化參數資訊        String filename = config.getInitParameter("config");        String [] filenames=null;                if(filename==null){            //如果沒有別的參數資訊,就將已經配好的放入數組中            filenames=new String[]{"Framework.xml"};        }        else{            //拆分設定檔名稱字串            filenames=filename.split(",");        }        //使用init方法初始化        man=new ActionMappingManager(filenames);    }

 

九、商務邏輯Action並實現Action介面,並重寫自訂的execute方法

public class LoginAction implements Action{    public String execute(HttpServletRequest request,            HttpServletResponse response) throws Exception {        String name=request.getParameter("name");        String pwd=request.getParameter("pwd");        if(name.equals("1")&&pwd.equals("1")){            return SUCCESS;        }        else{            return LOGIN;        }    }

十、編寫登入介面

  <body>     <form action="loginAction.action" method="post">    姓名:<input type="text" name="name"/><br/>    密碼:<input type="text" name="pwd"/><br/>    <input type="submit" value="登入">    </form>  </body>

 

 實現效果:

Struts2 自訂MVC架構

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.