溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

自定義MVC框架

發(fā)布時間:2020-07-27 08:22:48 來源:網(wǎng)絡(luò) 閱讀:582 作者:melon_jj 欄目:web開發(fā)

 

  一、 實現(xiàn)自定義MVC的體系結(jié)構(gòu)圖
自定義MVC框架

  1、ModelI模式開發(fā)Web應(yīng)用時,分兩種情況:

  純JSP技術(shù)方式開發(fā)

  JSP+JavaBean方式開發(fā)

  2、ModelI模式開發(fā)的不足:

  JSP頁面中嵌入大量的Java代碼,可讀性差。

  大量代碼在JSP中難以復(fù)用。

  后期維護(hù)及擴(kuò)展的難度大。

  3、為了克服ModelI模式的缺陷,引入了ModelII的模式開發(fā)

  ModelII模式體現(xiàn)了基于MVC(Model-View-Controller,模型-視圖-控制器)的設(shè)計模式,簡單的說,ModelII模式就是將數(shù)據(jù)顯示、流程控制和業(yè)務(wù)邏輯處理分離,使之相互獨(dú)立。

  4、MVC設(shè)計模式由3個部分組成各部分的作用。

  Model:模型,主要用于數(shù)據(jù)和業(yè)務(wù)的處理。

  View:視圖,用于數(shù)據(jù)顯示。

  Controller:控制器,用于流程控制。

  5、MVC設(shè)計模式的特點

  一個模型可以對應(yīng)多個視圖。

  顯示與邏輯控制分離。

  分層控制,減低了代碼間的耦合。

  二、 我們?nèi)绾蝿?chuàng)建一個自己的MVC框架??

 ?。ㄒ唬┪覀円趌ib里面準(zhǔn)備一個夾包

  dom4j-1.6.1.jar主要作用:解析xml文件

  (二)準(zhǔn)備配置文檔(在src下)

  <!DOCTYPEmyframework[

  <!ELEMENTmyframework(actions)>

  <!ELEMENTactions(action*)>

  <!ELEMENTaction(result*)>

  <!ATTLISTactionnameCDATA#REQUIRED

  classCDATA#REQUIRED

  >

  <!ATTLISTresultnameCDATA#IMPLIED

  redirect(true|false)"false"

  >

  ]>

  解釋:自定義MVC框架

  解釋:根據(jù)上述約束完成的“*”代表該節(jié)點可以出現(xiàn)多次

  <myframework>

  <actions>

  <actionname="LoginAction"class="cn.action.LoginAction">

  <resultname="success">success.jsp</result>

  <resultname="login">login.jsp</result>

  </action>

  </actions>

  </myframework>

  (三)自己準(zhǔn)備一個Action接口,用于放入結(jié)果集和執(zhí)行方法

  packagecn.framework;

  importjavax.servlet.http.HttpServletRequest;

  importjavax.servlet.http.HttpServletResponse;

  publicinterfaceAction{

   publicfinalStringSUCCESS="success";

   publicfinalStringERROR="error";

   publicfinalStringLOGIN="login";

   publicfinalStringINPUT="input";

   publicStringexecute(HttpServletRequestrequest,

   HttpServletResponseresponse);

  }

 ?。ㄋ模┒x一個ResultMapping用來存放result節(jié)點

  packagecn.framework;

  publiccla***esultMapping{

   //result節(jié)點名字

   privateStringname;

   //是否重定向

   privatebooleanredirect;

   //跳轉(zhuǎn)的頁面

   privateStringurl;

   publicResultMapping(){

   }

   publicResultMapping(Stringname,booleanredirect,Stringurl){

   this.name=name;

   this.redirect=redirect;

   this.url=url;

   }

   publicStringgetName(){

   returnname;

   }

   publicvoidsetName(Stringname){

   this.name=name;

   }

   publicbooleanisRedirect(){

   returnredirect;

   }

   publicvoidsetRedirect(booleanredirect){

   this.redirect=redirect;

   }

   publicStringgetUrl(){

   returnurl;

   }

   publicvoidsetUrl(Stringurl){

   this.url=url;

   }

  }

 ?。ㄎ澹┒x一個ActionMapping用來存放Action節(jié)點

  packagecn.framework;

  importjava.util.HashMap;

  importjava.util.Map;

  publicclassActionMapping{

   //Action名稱

   privateStringname;

   //Action名稱對應(yīng)的Action的類的全稱

   privateStringclassName;

   //result集合

   privateMap<String,ResultMapping>results=newHashMap<String,ResultMapping>();

   publicActionMapping(){

   }

   publicActionMapping(Stringname,StringclassName,Map<String,ResultMapping>results){

   super();

   this.name=name;

   this.className=className;

   this.results=results;

   }

   publicStringgetName(){

   returnname;

   }

   publicvoidsetName(Stringname){

   this.name=name;

   }

   publicStringgetClassName(){

   returnclassName;

   }

   publicvoidsetClassName(StringclassName){

   this.className=className;

   }

   publicMap<String,ResultMapping>getResults(){

   returnresults;

   }

   publicvoidsetResults(Map<String,ResultMapping>results){

   this.results=results;

   }

  }

 ?。?zhǔn)備一個ActionMappingManager是用來管理ActionMapping的

  packagecn.framework;

  importjava.io.InputStream;

  importjava.util.HashMap;

  importjava.util.List;

  importjava.util.Map;

  importorg.dom4j.Attribute;

  importorg.dom4j.Document;

  importorg.dom4j.Element;

  importorg.dom4j.io.SAXReader;

  publicclassActionMappingManager{

   Map<String,ActionMapping>actionMapping=newHashMap<String,ActionMapping>();

   publicActionMappingManager(){

   init();

   }

   publicActionMappinggetActionMapping(StringactionName){

   returnactionMapping.get(actionName);

   }

   publicActionMappingManager(StringfileName){

   }

   publicMap<String,ActionMapping>getActionMapping(){

   returnactionMapping;

   }

   publicvoidsetActionMapping(Map<String,ActionMapping>actionMapping){

   this.actionMapping=actionMapping;

   }

   publicstaticvoidmain(String[]args){

   newActionMappingManager().init();

   }

   publicvoidinit(){

   InputStreamis=this.getClass().getResourceAsStream("/myframework.xml");

  

   SAXReadersr=newSAXReader();

   try{

   Documentdoc=sr.read(is);

   ElementelRoot=doc.getRootElement();

   List<Element>listActions=elRoot.elements();

   for(ElementelActions:listActions){

   List<Element>listAction=elActions.elements();

   for(ElementelAction:listAction){

   ActionMappingaMapping=newActionMapping();

   AttributeattName=elAction.attribute("name");

   AttributeattClass=elAction.attribute("class");

   aMapping.setName(attName.getValue());

   aMapping.setClassName(attClass.getValue());

   List<Element>listResult=elAction.elements();

   for(ElementelResult:listResult){

   ResultMappingrMapping=newResultMapping();

   AttributeattResultName=elResult.attribute("name");

   AttributeattResultRedirect=elResult.attribute("redirect");

   rMapping.setName(attResultName.getValue());

   rMapping.setRedirect(Boolean.parseBoolean(attResultRedirect.getValue()));

   rMapping.setUrl(elResult.getTextTrim());

   aMapping.getResults().put(rMapping.getName(),rMapping);

   }

   actionMapping.put(aMapping.getName(),aMapping);

   }

   }

   }catch(Exceptione){

   e.printStackTrace();

   }

   }

  }

 ?。ㄆ撸├梅瓷錂C(jī)制找到自己的實列

  packagecn.framework;

  publicclassActionManager{

   publicstaticActioncreateAction(StringclassName){

   Class<?>clz=null;

   try{

   clz=Thread.currentThread().getContextClassLoader().loadClass(className);

   }catch(Exceptionex){

   ex.printStackTrace();

   }

   try{

   if(clz==null){

   clz=Class.forName(className);

   }

   }catch(Exceptionex){

   ex.printStackTrace();

   }

   Actionaction=null;

   try{

   action=(Action)clz.newInstance();

   }catch(Exceptionex){

   ex.printStackTrace();

   }

   returnaction;

   }

  }

  (八)寫一個業(yè)務(wù)邏輯

  packagecn.action;

  importjavax.servlet.http.HttpServletRequest;

  importjavax.servlet.http.HttpServletResponse;

  importcn.framework.Action;

  publicclassLoginActionimplementsAction{

   @Override

   publicStringexecute(HttpServletRequestrequest,HttpServletResponseresponse){

   return"success";

   }

  }

 ?。ň牛┖诵目刂破鱏ervlet

  packagecn.framework;

  importjava.io.IOException;

  importjavax.servlet.ServletConfig;

  importjavax.servlet.ServletException;

  importjavax.servlet.annotation.WebServlet;

  importjavax.servlet.http.HttpServlet;

  importjavax.servlet.http.HttpServletRequest;

  importjavax.servlet.http.HttpServletResponse;

  publicclassMVCServletextendsHttpServlet{

   privatestaticfinallongserialVersionUID=1L;

   protectedvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)

   throwsServletException,IOException{

   }

   ActionMappingManageramanager=null;

   @Override

   publicvoidinit(ServletConfigconfig)throwsServletException{

   amanager=newActionMappingManager();

   }

   protectedvoiddoPost(HttpServletRequestrequest,HttpServletResponseresponse)

   throwsServletException,IOException{

   ActionMappingam=amanager.getActionMapping(getActionName(request));

   Actionaction=ActionManager.createAction(am.getClassName());

   Stringr=action.execute(request,response);

   ResultMappingrm=am.getResults().get(r);

   if(rm.isRedirect()){

   response.sendRedirect(rm.getUrl());

   }else{

   request.getRequestDispatcher(rm.getUrl()).forward(request,response);

   }

   }

   publicStringgetActionName(HttpServletRequestrequest){

   StringactionName=null;

   Stringuri=request.getRequestURI();

   StringcontentPath=request.getContextPath();

   StringactionPath=uri.substring(contentPath.length());

   actionName=actionPath.substring(1,actionPath.indexOf(".")).trim();

   returnactionName;

   }

  }

 ?。ㄊ┬薷膚eb.xml

   <servlet>

   <servlet-name>MVCServlet</servlet-name>

   <servlet-class>cn.framework.MVCServlet</servlet-class>

   </servlet>

   <servlet-mapping>

   <servlet-name>MVCServlet</servlet-name>

   <url-pattern>*.action</url-pattern>

   </servlet-mapping>

 ?。ㄊ唬?zhǔn)備一個login.jsp頁面
自定義MVC框架
  (十二)發(fā)布到Tomcat運(yùn)行自定義MVC框架

  

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI