程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> struts2自界說MVC框架

struts2自界說MVC框架

編輯:關於JAVA

struts2自界說MVC框架。本站提示廣大學習愛好者:(struts2自界說MVC框架)文章只能為提供參考,不一定能成為您想要的結果。以下是struts2自界說MVC框架正文


本文實例為年夜家分享了struts2自界說MVC框架的辦法,供年夜家參考,詳細內容以下

自界說MVC: (起首懂得Model1和Model2的概念)

Model1與Model2:

  Model1:就是一種純jsp開辟技巧,將營業邏輯代碼和視圖襯著代碼雜糅在一路。

  Model2:Model2是在Model1的基本上,將營業邏輯的代碼分別開來,零丁構成一個Servlet,Model2也是基於MVC開辟。

總結MVC特色以下:

(1)數據的獲得和顯示分別

(2)掌握器將分歧的模子和視圖組合在一路

(3)運用分為三部門,三部門之間松耦歸並協同任務,從而進步運用的可擴大性和可保護性

(4)各層擔任分歧的功效,各司其職,每層的組件具有雷同的特點,便於經由過程工程化和對象化發生法式代碼

MVC思惟及其優勢(很強勢)

MVC是一種架構形式,目標是將模子(營業邏輯)、視圖(表現層)分別,使模子和視圖可以自力修正互不影響。年夜多半軟件在設計架構時都采取此形式。應用MVC形式有許多處,當一個經由過程閱讀器閱讀的體系想要開辟手機版本時,只須要從新開辟視圖,模子部門的營業邏輯可以重用。很多軟件須要同時推出B/S和C/S版本,采取MVC形式,模子部門可以重用,只須要開辟分歧的視圖便可。MVC思惟將一個運用分紅三個根本部門M(Model,模子)V(View,視圖)C(Controller,掌握器)。個中M表現處置營業邏輯的部門,V表現顯示數據和獲得用戶輸出的部門,C相似中介,包管M和V不會直接交互。

根本步調以下:  

1.創立XML文檔Framework.xml  

2.界說Action接口  

3.界說一個actionMapping類,視為action節點  

4.界說ActionMappingManage類來治理ActionMapping類(actions節點)  

5.界說ActionManager類應用反射機制依據字符串類型的類名獲得到詳細的類(web.xml標簽的書寫)  

6.編寫servlet停止運轉機會的掌握  

7.界說LoginAction類停止測試

1.創立XML文檔Framework.xml 

<!--?xml version="1.0" encoding="UTF-8"?-->
<!-- 界說束縛文件 -->(標注)
<!-- ELEMENT 表現元素 -->
<!-- ATTLIST 表現屬性 -->
<!-- CDATA 表現字符串類型 -->
<!-- REQUIRED 表現此屬性必需的寫 -->
<!-- *代表多個 -->
<!-- IMPLIED 表現此屬性可寫 -->
<!-- redirect 重定向或轉發 -->
 
 
  <!--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.hq.Action.LoginAction">
  <result name="success">success.jsp</result>
  <result name="login">index.jsp</result>
  </action>
</actions>
</framework>

留意:空格和<>的書寫標准。

   節點的條理。

2.界說Action接口 

留意:excute參數的書寫,要求和呼應。

3.界說一個actionMapping類,視為action節點(停止action節點的標簽的書寫)

    

停止封裝字段和results聚集的添加數據。

留意:添加數據的書寫。(Map聚集)

4.界說ActionMappingManage類來治理ActionMapping類(actions節點)

/*
 * action節點不止一個
 * 用來來治理ActionMapping類
 */
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[] file){
    for (String filename : file) {
      Init(filename);
    }
  }
  //init初始化辦法
  //解析xml文檔
  public void Init(String path){
     
    try {
       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);
           System.out.println(mapp.getName());
         }
         //獲得一切action節點的聚集
         maps.put(mapp.getName(), mapp);
       }
        
    } catch (Exception e) {
      // TODO: handle exception
    }
   }
  }

歸納綜合:

經由過程dom4j解析Framework.xml設置裝備擺設文件。從而獲得根節點,和actions節點,並經由過程for輪回遍歷actions節點下的action節點拿到name和class的屬性值,因為一個action節點下有多個result節點 及遍歷action下一切的result節點,分離存入到actionMapping中的雙列聚集中,最初獲得一切action節點的聚集。

留意:Init辦法的書寫,和ActionMappingManager帶參數組的書寫。

5.界說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) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    }
    if(clazz==null)
    {
      try {
        //假如該線程中沒有,那末應用class.forname辦法獲得
        clazz=Class.forName(classname);
      } catch (ClassNotFoundException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
      }
    }
    if(action==null)
    {
      try {
        //將獲得到的類型轉換為action,挪用無參結構函數,某種水平上相當於new,不外new須要指定類型
        action=(Action)clazz.newInstance();
      } catch (InstantiationException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
      } catch (IllegalAccessException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
      }
    }
    return action;
  }
} 

web.xml的節點設置裝備擺設:

6.編寫servlet停止運轉機會的掌握(servlet,初始化一切的類)

public class MyServlet extends HttpServlet {
 
  /**
   *你很菜
   */
  public void doGet(HttpServletRequest request, HttpServletResponse response)
      throws ServletException, IOException {
 
    doPost(request, response);
  }<br>
  /**
   *持續盡力
   */
  ActionMappingManager man=null;
  public void doPost(HttpServletRequest request, HttpServletResponse response)
      throws ServletException, IOException {
     
    //獲得ActionMapping對象
    ActionMapping actionMapping = man.getActionMapping(getPath(request));
    //獲得action接口反射機制
    Action action = ActionManager.getActionManager(actionMapping.getClassname());
     
    try {
      String message=action.execute(request, response);
      String results = actionMapping.getResults(message);
       
      response.sendRedirect(results);
    } catch (Exception e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    }
  }
   
  /*
   * 獲得要求的途徑名
   */
  public String getPath(HttpServletRequest request){
    //項目+要求地址
    String requestURI = request.getRequestURI();
    //項目稱號
    String contextPath = request.getContextPath();
    //詳細要求
    String path = requestURI.substring(contextPath.length());
    String filename = path.substring(1,path.lastIndexOf("."));
     
    return filename;
  }
  /*
   *重寫init,法式運轉加載一切類
   *
   */
  @Override
  public void init(ServletConfig config) throws ServletException {
 
    //config對象是javax.servlet.ServletConfig的對象,功效是取得初始化設置裝備擺設信息
    //config.getInitParameter是獲得指命名稱的初始化參數內容
    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);
  }
}

留意:代碼的條理及正文。

7.界說LoginAction類停止測試

public class LoginAction implements Action{
 
  @Override
  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;
    } 
  }
}

jsp代碼:

完成後果:

再長的路,一步步也能走完,再短的路,不邁開雙腳也沒法達到。

以上就是本文的全體內容,願望對年夜家的進修有所贊助,也願望年夜家多多支撐。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved