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代碼:
完成後果:
再長的路,一步步也能走完,再短的路,不邁開雙腳也沒法達到。
以上就是本文的全體內容,願望對年夜家的進修有所贊助,也願望年夜家多多支撐。