JAVA开发自学教材03自定义MVC框架.

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

第三章自定义MVC框架回顾与作业点评ModelI的缺点有哪些?为什么要使用MVC设计模式开发应用程序?MVC模式的缺点有哪些?本章任务实现MVC自定义框架并使用基于Servlet技术是MVC思想的一个实现类似Struts框架本章目标掌握MVC设计模式使用MVC设计模式开发自定义MVC框架为什么需要框架技术2-1如何更快更好地写简历?使用Word简历模板思考:使用模板有什么好处呢?结构统一,便于人事阅读不用考虑布局、排版等,提高效率可专心在简历内容上新手也可以作出专业的简历什么是框架技术“框架技术”帮我们更快更好地构建程序:提供可重用的公共结构按一定规则来组织组件应用程序的半成品优势:不用再考虑公共问题专心在业务实现上结构统一,易于学习、维护新手也可写出好程序直接组装汽车,不用自己造轮子站在巨人的肩膀上,享用前人经验和智慧顾客点菜顾客点菜中餐厨师服务员把服务/菜给顾客以各自的功能进行分工生活中的MVC西餐厨师VCM行为抽象自定义MVC客户请求中心控制sevrlet登录操作ACTION房屋信息ACTIONACTION计算服务转换等(非数据库类)DB存储/持久化存储返回结果ACTION黄色部分为设计核心自定义MVC步骤1/2前端控制器新建一个Servlet配置到web.xml中,让这个Servlet能处理*.action请求核心功能接受请求根据请求URL,找到合适的Action最简单的控制器,只需用if/else去找Action调用Action转向输出页面演示示例:Controller的设计过程自定义MVC步骤2/2设计Action接口Action是具体处理业务逻辑的地方importjavax.servlet.http.HttpServletRequest;importjavax.servlet.http.HttpServletResponse;publicinterfaceAction{publicStringexecute(HttpServletRequestrequest,HttpServletResponseresponse)throwsException;}自定义MVC简单使用以登录为例实现Action接口在前端控制器添加一个if/else判断演示示例:Action实现指导——完成用户注册功能2-1训练要点:掌握自定义MVC框架使用Servlet作为控制器需求说明:开发自定义MVC框架通过自定义Action实现逻辑控制完成用户注册功能指导——完成用户注册功能2-2实现思路:开发模型M:实现业务逻辑的接口和类开发控制器C:自定义Action,由RegisterAction类实现开发视图V:register.jsp调试运行完成时间:20分钟共性问题集中讲解常见调试问题及解决办法代码规范问题共性问题集中讲解Controller的完善7-1在基础版本的自定义MVC框架中,每新增一个Action就要去改前端控制器的代码,框架代码不通用,有没有好的解决办法呢?将url与Action的映射信息保存在配置文件中,增加Action只需要修改配置文件Controller的完善7-2使用配置文件保存Action信息?xmlversion=1.0encoding=UTF-8?!DOCTYPEmystruts[!ELEMENTmystruts(actions)...]mystrutsactionsactionname=registerclass=cn.jbit.mystruts.framework.action.RegisterActionresultname=successpage/register_success.jsp/resultresultname=inputpage/register.jsp/resultresultname=errorpage/register.jsp/result/actionactionname=loginclass=cn.jbit.mystruts.framework.action.LoginActionresultname=successpage/manager.jsp/resultresultname=inputpage/result.jsp/result/action/actions/mystrutsAction名称Action应用路径设置页面转向Controller的完善7-3保存Action信息publicclassActionMapping{/*Action元素中的name属性*/privateStringname;/*Action元素中的className属性*/privateStringclassName;/*保存配置的Result属性信息*/privateMapString,StringresultMap=newHashMapString,String();//省略setter/getter方法publicStringgetResult(Stringname){returnresultMap.get(name);}publicvoidaddResult(Stringname,Stringresult){this.resultMap.put(name,result);}}保存Action信息的集合获取Action添加ActionController的完善7-4读取Action信息publicvoidinit(StringconfigureFileName){...InputStreamis=this.getClass().getResourceAsStream(/+configureFileName);//使用dom4j读取XML文件Documentdoc=newSAXReader().read(is);Elementroot=doc.getRootElement();//遍历所有Action元素IteratorElementactionsIt=root.elements(actions).iterator();...}配置文件名称获取文件信息读取配置文件获取信息内容Controller的完善7-5使用反射生成ActionpublicclassActionManager{/***createAction方法用来获取Action实例*@paramclassNameAction的全限定类名*/publicstaticActioncreateAction(StringclassName){try{return(Action)loadClass(className).newInstance();}catch(InstantiationExceptione){e.printStackTrace();}catch(IllegalAccessExceptione){e.printStackTrace();}returnnull;}...}根据名称创建Action实例Action的类名称Controller的完善7-6/***loadClass方法动态加载类。*@paramclassNameAction的完全限定名*/publicstaticClassloadClass(StringclassName){Classclazz=null;try{clazz=Thread.currentThread().getContextClassLoader().loadClass(className);}catch(ClassNotFoundExceptione){e.printStackTrace();}if(clazz==null){try{clazz=Class.forName(className);}catch(Exceptione){e.printStackTrace();}}returnclazz;}根据名称创建Class对象根据类名称得到当前运行Class对象Controller的完善7-7修改ActionServlet配置信息…servletservlet-nameActionServlet/servlet-nameservlet-classcn.jbit.mystruts.framework.servlet.ActionServlet/servlet-classinit-paramparam-nameconfig/param-nameparam-valuemystruts.xml/param-value/init-paramload-on-startup0/load-on-startup/servlet…设置ActionServlet初始化参数ActionServlet的引用地址Web应用启动时就加载该Servlet指导——使用MVC完成用户登录2-1训练要点:掌握MVC模式读取配置文件动态加载类的实例需求说明:完善自定义MVC框架,读取配置文件,动态加载Action实例使用完善后的自定义MVC框架,实现用户登录功能讲解需求说明指导——使用MVC完成用户登录2-2实现思路:编写配置文件编写ActionMapping类,保存Action信息读取配置文件反射生成Action完善Controller修改LoginAction开发视图调试运行完成时间:30分钟共性问题集中讲解常见调试问题及解决办法代码规范问题共性问题集中讲解完善视图4-1保存视图publicclassResult{privateStringname;privateStringvalue;privatebooleanisRedirect;publicbooleanisRedirect(){returnisRedirect;}publicvoidsetRedirect(booleanisRedirect){this.isRedirect=isRedirect;}//省略setter/getter方法}使用Result类保存视图信息完善视图4-2修改ActionMappingpublicclassActionMapping{…privateMapString,ResultresultMap=newHashMapString,Result();/***根据result-name,返回Result实例*/publicResultgetResult(Stringname){returnresultMap.get(name);}/***向Map中添加一个Result实例。*/publicvoidaddResult(Stringname,Resultresult){this.resultMap.put(name,result);}}使用Result类保存视图信息完善视图4-3修改ActionMappingManager类…//遍历Action元素的子元素-resultfor(IteratorElementresultIt=action.elementIterator(result);resultIt.hasNext();){//redirect-表示是否重定向StringisRedirect=resultElement.attributeValue(redirect);result.setRedirect(Boolean.valueOf(isRedirect));result.setValue(resultElement.getText());//把每个封装好的Result添加到ActionMapping中mapping.addResult(name,result);}读取重定向标识将读取结果保存到Result中完善视图4-4修改Ac

1 / 32
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功