第9章-Tea-web应用MVC设计与实现

上传人:细水****9 文档编号:244088553 上传时间:2024-10-02 格式:PPT 页数:42 大小:391KB
返回 下载 相关 举报
第9章-Tea-web应用MVC设计与实现_第1页
第1页 / 共42页
第9章-Tea-web应用MVC设计与实现_第2页
第2页 / 共42页
第9章-Tea-web应用MVC设计与实现_第3页
第3页 / 共42页
点击查看更多>>
资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,第,9,章,Tea web,应用,MVC,设计与实现,主要内容,MVC,设计文档撰写规范,MVC,设计文档实例,布置作业模块,调用流程与参数传递,Tea Web,应用框架搭建,布置作业模块的实现,完成作业模块的设计与实现要点,本章目标,理解,MVC,设计文档的撰写规范,理解布置作业模块的,MVC,设计,能够按照规范撰写完成作业和批改作业的设计文档,能够搭建基于,WebFrame,框架的,Tea Web,应用,理解布置作业模块的实现,掌握,MVC,各层的实现特点,在,Tea Web,应用中实现完成作业和批改作业模块,9.1 MVC,设计文档撰写规范,在前面需求分析和数据库设计已完成的基础上,本章的主要任务是对作业管理子系统的各个功能模块进行详细设计。,在这一阶段,基于,MVC,的分层设计思想,对各功能进行细化,设计出每个子功能需要的页面、控制器以及业务处理模型。明确页面的文件名和页面中需要传递的参数、输出的变量;明确控制器的类名、映射地址和需要读取的参数(名字、类型)、调用的模型层处理方法以及最后传出的参数和转发地址;明确模型层需要实现的业务方法,包括方法名、方法返回值类型和方法参数。,9.1 MVC,设计文档撰写规范,同样,在设计阶段也需要撰写文档来明确相关信息。由于采用,MVC,设计模式,在撰写设计文档时也分为视图层、模型层和控制器层来分层描述相关细节和关键问题,下面分别介绍设计文档中针对每一层所需要描述的内容和撰写规范。,9.1 MVC,设计文档撰写规范,1,V,:视图层(,JSP,),大部分视图层文件都是,JSP,文件,对于视图层文件,需要描述以下内容:,(,1,)文件名:需要指明文件路径,.,(,2,)文件作用。,(,3,)显示效果图。,(,4,)输出变量命名(同时需要指明作用域)。,(,5,)输入控件命名:类型,名字,值和备注(应包括输入验证要求)。,(,6,)关联控制器:,(,a,)链接地址或表单提交地址等。,(,b,)传递的参数:(超链接传参或利用,hidden,控件传参等)。,9.1 MVC,设计文档撰写规范,2,M,:模型层(,JavaBean,Java,类),模型层文件基本上是一些,Java,类,对每个类需要从以下几个方面描述:,(,1,)命名:包名、类名。,(,2,)父类或实现的接口。,(,3,)方法,1,定义:,(,a,)作用。,(,b,)方法头声明。,(,c,)方法实现说明。,9.1 MVC,设计文档撰写规范,3,C,:控制层(,Servlet,Java,类),控制器层主要是,Servlet,来实现,对每个,Servlet,需要描述以下几点:,(,1,)命名:包名、类名。,(,2,),Mapping,Url,(,web.xml,中映射,url,)。,(,3,)步骤:,(,a,)获取参数:作用域和名字。,(,b,)调用模型的方法。,(,c,)处理结果。,(,d,)转发请求或重定向。,9.2 MVC,设计文档实例,布置作业模块(,Homework 01,),明确了设计文档的撰写规范之后,下面以作业管理子系统中的教师布置作业模块为例,来撰写相应的设计文档。,由于布置作业功能需要进行一系列操作,包括在课程列表页面选择课程、布置作业整体信息、布置作业详细信息等步骤。因此对该功能进行拆分细化,分别对其中涉及到的每一个子功能进行详细设计并撰写文档。,9.2.1,课程列表功能,首先,教师用户登录系统后,会进入到课程列表页面。在该页面,教师可以选择要进行操作的课程。,1,V:,视图层(,JSP,),课程列表功能仅需要一个视图层文件:,(,1,)文件名:,courseList.jsp,(放在根路径,/manage/hw/,下),(,2,)文件作用:显示课程列表,(,3,)显示效果图:图,7.5,教师用户作业管理课程列表页面。,(,4,)输出变量命名:,(,a,)课程列表:,request,中,ArrayList,类型的,courseList,(,b,)课程名称:,request,中,cou_name,(,5,)输入控件命名:无,(,6,)关联控制器:,(,a,)“布置作业”链接:,href,=”,根路径,/hw/,ThwAddFormAction,”,(,b,)传递的参数:,超链接传参:,request,中,ArrayList,类型的,courseList,中的,cou_no,9.2.1,课程列表功能,2,M:,模型层(,JavaBean,Java,类),课程列表功能的模型层涉及到一个,Java,类,TeaHomeworkService,:,(,1,)命名:,tea.service.TeaHomeworkService,(,2,)父类:,tea.service.BaseService,(,3,),getCourseList,(),方法:,作用:获取当前登录教师所教的所有课程信息,方法头声明:,public List,getCourseList(String,user_no,),实现说明:参照第,8,章,8.4.2,节 主业务验证,教师课程列表,9.2.1,课程列表功能,3,C:,控制层(,servlet,Java,类),课程列表的功能涉及到一个控制器,TeaCourseListAction,。,(,1,)命名:,tea.action.hw.TeaCourseListAction,(,2,),Mapping,Url,:,/manage/hw/,TeaCourseListAction,(,3,)步骤:,(,a,)获取参数:,String,类型的,tea_no,值从,session,中获取,键值(,key,)为”,user_no,”,(,b,)调用模型,tea.service.HwService,的方法:,public List,getTeaCourseList(String,tea_no,),,得到结果,courseList,,它是,ArrayList,对象。,(,c,)处理结果,将,courseList,放到,request,中,并命名为“,courseList,”,,将请求转发到”,courseList.jsp,”,。,9.2.2,布置作业整体信息,教师在选课页面选择好课程以后,接下来进入该门课程的布置作业页面,首先进入布置作业整体信息页面添加作业的整体信息。,限于篇幅原因,布置作业整体信息的相关设计文档请参考教材,9.2.2,节。,9.2.3,布置作业详细信息,教师布置完作业整体信息以后,接下来进入布置作业详细信息页面添加作业的详细信息。,限于篇幅原因,布置作业详细信息的相关设计文档请参考教材,9.2.3,节。,9.2.4,调用流程与参数传递,布置作业中,每一层之间的调用过程和参数传递情况请参考教材,9.2.4,节图,9-1,。,9.3 Tea web,应用框架搭建,本书第,6,章中已经搭建好可以重复使用的,WebFrame,框架,下面,基于,WebFrame,建立,Tea Web,应用。,(,1,)在,Package Explorer,中复制,WebFrame,工程并粘贴,新工程命名为,tea,。,9.3 Tea web,应用框架搭建,(,2,)在,tea,工程上右击鼠标,选择,Properties,。,(,3,)在左侧目录树中选择,MyEclipse,Web,,修改其中的,Web Context-root,值,改为,/tea,,单击,OK,按钮结束。,9.3 Tea web,应用框架搭建,(,4,)将,manageHeader.jsp,、,homeHeader.jsp,和,footer.jsp,拷贝到,WebRoot,中的,common,子目录下。其中,manageHeader.jsp,和,homeHeader.jsp,分别为本系统后台页面导航条和前台页面导航条,,footer.jsp,为本系统所有页面的页脚。,9.3 Tea web,应用框架搭建,(,5,)在,TOMCAT_HOME,/conf/Catalina/,localhost,下放置,tea.xml,,配置,tea,工程以及工程中所使用的数据库连接池资源。,tea.xml,文件如下:,9.3 Tea web,应用框架搭建,(,6,)修改,mon.Const,类,将其中的,DATA_SOURCE,常量的值改为第(,5,)步中配置的数据源名。修改后的代码如下:,public static final String DATA_SOURCE = java:/comp/,env/jdbc/tea,;/,数据源名字,9.3 Tea web,应用框架搭建,(,7,)修改,tea.service.UserService,类,修改其中的,LOGIN_SQL_TYPE1,常量和,LOGIN_SQL_TYPE2,常量,修改后的代码如下:,/,用户类型值为空或者用户类型值为,tea,对应的,SQL,语句,public static final String LOGIN_SQL_TYPE1 = select,tea_no,from teacher where,tea_user,=? and,tea_pass,=?;,/,用户类型值为,stu,对应的,SQL,语句,public static final String LOGIN_SQL_TYPE2 = “select,stu_no,from student where,stu_user,=? and,stu_pass,=?”;,这样,新工程,tea,就创建好并可以使用了。本学期将要实现的作业管理系统就使用此,tea,工程。,9.4,布置作业模块的实现,布置作业模块针对教师用户,主要功能是教师用户登录系统后,可进行其所教授的一门课程的新作业的布置。,本模块的实现仍采用,MVC,模式,下面,分别对涉及到的每项子功能进行说明。,9.4.1,课程列表,1,V:,视图层(,JSP,),/manage/hw/,courseList.jsp,(,1,)页面字符集使用“,UTF-8”,:,(,2,)导入,JSTL,核心标记库:,%,taglib,prefix=c,uri,=http:/, List,getCourseList(String,user_no,) ,List l=new,ArrayList,();,String,sql,=select,cou_no,cou_name,from course where,cou_no,in (select,cou_no,from,tea_book,where,tea_no,=?);,l=,this.getList(sql,new,Objectuser_no,);,return l;,9.4.1,课程列表,3,C,:控制层(,Servlet,Java,类),在,TeaCourseListAction,中定义并实现,process(),方法,并在,TeaCourseListAction,的,doGet,(),、,doPost,(),方法中调用,process,方法,要点如下:,(,1,)从,session,中获取当前登录用户的编号信息,赋值给,String,变量时需要强制类型转换:,String,user_no,=(,String)session.getAttribute(user_no,);,(,2,)调用模型层的,getCourseList,(),方法时,需要使用当前用户编号(,user_no,)作为参数,并且方法的返回值是,List,类型:,List courses=,ths.getCourseList(user_no,);,(,3,)将方法的返回值即查询出的课程列表信息存入,request,中,以便视图层文件读取:,request.setAttribute(courses,courses,);,(,4,)跳转到指定的视图层文件输出结果:,RequestDispatcher,rd=,request.getRequestDispatcher(courseList.jsp,);,rd.forward(request,response,);,9.4.2,分页显示的实现,本节以课程列表功能为例,演示第,6,章,6.7,节中分页显示功能的具体实现。,由于在,WebFrame,框架中,已经提供了分页链接页面,pageList.jsp,,并且在,BaseService,中提供了,getPage,(),方法用于,返回当前页的记录集和总页数。因此,为课程列表页面添加分页显示功能就变得非常简单,只需对该功能涉及到的视图、控制器和模型加以简单修改并添加少量代码即可实现分页显示。,9.4.2,分页显示的实现,1,V:,视图层(,JSP,),/manage/hw/,courseList.jsp,(,1,)利用,forEach,标签循环输出课程信息时,需要修改,items,属性,如下:,(,2,)需要在页面尾部加入如下,include,指令,包含分页链接页面,pageList.jsp,:,9.4.2,分页显示的实现,2,M:,模型层(,JavaBeanJava,类),修改,TeaHomeworkService,中,getCourseList(),方法,要点如下:,(,1,)将,getCourseList,(),方法的返回值类型修改为,Map,类型,并为方法添加一个,String,类型的参数,curPage,。该参数代表当前要显示的页码。,(,2,)方法体内,调用,BaseService,(),中实现的,getPage,(),方法,得到当前页的记录集和总页数,代码如下:,Map m=,this.getPage(sql,new,Objectuser_no,curPage,);,9.4.2,分页显示的实现,3,C,:控制层(,Servlet,Java,类),修改,TeaCourseListAction,的,process(),方法,要点如下:,(,1,)需要使用,getParameter,(),方法获取用户请求的当前页号:,String,curPage,=1;,if(request.getParameter(curPage,)!=null),curPage,=,request.getParameter(curPage,);,(,2,)调用模型层的,getCourseList,(),方法时,需要使用当前用户编号(,user_no,)以及当前页号(,curPage,)作为参数,并且方法的返回值现为,Map,类型:,Map courses=,ths.getCourseList(user_no,curPage,);,(,3,)将方法的返回值存入,request,中,并且必须命名为”,pageInfo,”,。返回值(,Map,类型的对象)中包含查询出的当前页的课程列表信息以及总页数信息,传回给视图层文件:,request.setAttribute(pageInfo,courses,);,(,4,)还需要额外向试图层传递两个参数,actionUrl,和,pNames,。其中,actionUrl,的值为当前控制器的,mapping,url,,,pNames,的值为保存了当前所有请求参数名的,Enumeration,对象:,request.setAttribute(actionUrl,request.getServletPath,();,request.setAttribute(pNames,request.getParameterNames,();,9.4.3,布置作业整体信息,1,V,:视图层(,JSP,),/manage/hw/,thwAddForm.jsp,(,1,)页面字符集使用“,UTF-8”,:,(,2,)导入,JSTL,格式标记库:,(,3,)表单的提交地址:,(,4,)利用,标记格式化输出系统当前时间:,9.4.3,布置作业整体信息,2,M,:模型层(,JavaBeanJava,类),在,TeaHomeworkService,中定义,如下方法:,getCourseName(),:,用于根据课程编号获取课程名称,thwAdd,(),:用于添加作业整体信息,getMaxThwNo,(),:用于获取刚添加的作业的编号,9.4.3,布置作业整体信息,3,C,:控制层(,Servlet,Java,类),ThwAddFormAction,控制器,ThwAddFormAction,用于显示作业整体信息输入页面,实现要点如下:,(,1,)获取通过超链接传递过来的参数,cou_no,:,String,cou_no,=,request.getParameter(cou_no,);,(,2,)调用模型层的,getCourseName,(),方法时,需要使用课程编号(,cou_no,)作为参数,并且方法的返回值是,String,类型:,String,cou_name,=,ths.getCourseName,(,cou_no,);,(,3,)将方法的返回值即查询出的课程名称存入,request,中,以便视图层文件读取:,request.setAttribute(cou_name,cou_name,);,(,4,)跳转到指定的视图层文件:,RequestDispatcher,rd=,request.getRequestDispatcher(thwAddForm.jsp,);,rd.forward(request,response,);,9.4.3,布置作业整体信息,ThwAddAction,控制器,ThwAddAction,用于响应整体信息输入页面中的“下一步”按钮。实现要点如下:,(,1,)将调用,thwAdd,(),方法所需的参数都存入,Map,类型的对象,thw,中,如:,thw.put(cou_no,request.getParameter(cou_no,);,(,2,)调用模型层的,thwAdd,(),方法时,需要使用,Map,类型对象(,thw,)作为参数,并且方法的返回值是,boolean,类型,根据方法的返回值决定下一步的操作:,if(ths.thwAdd(thw,),else,(,3,)若,thwAdd,(),方法的返回值为,true,,则调用模型层,getMaxThwNo,(),方法获取刚刚成功添加的作业编号并传递给下一个控制器:,String,tea_hw_no,=,ths.getMaxThwNo,();,request.setAttribute(tea_hw_no,tea_hw_no);,(,4,)跳转到下一个控制器,ThwDetailAddFormAction,:,rd=request.getRequestDispatcher(ThwDetailAddFormAction);,rd.forward(request,response);,(,5,)若,thwAdd(),方法的返回值为,false,,则将出错信息存入,requestScope,,跳转到信息提示控制器,MessageAction,:,request.setAttribute(messageInfo,Const.ERROR);,rd=,request.getRequestDispatcher(/common/MessageAction,);,rd.forward(request,response,);,9.4.4,布置作业详细信息,1,V,:视图层(,JSP,),/manage/hw/,thwDetailAddForm.jsp,(,1,)表单的提交地址以及,enctype,属性的设置:,(,2,)使用文件框(,type=file,)选择本地上传文件:,9.4.4,布置作业详细信息,2,M,:模型层(,JavaBean,Java,类),在,TeaHomeworkService,中定义,thwDetailAdd,(),方法用于添加作业详细信息 。,9.4.4,布置作业详细信息,3,C,:控制层(,Servlet,Java,类),ThwDetailAddFormAction,控制器,ThwDetailAddFormAction,用于显示作业详细信息输入页面。实现要点如下:,(,1,)获取通过表单,hidden,控件传递过来的当前题号,proNo,:,if(request.getAttribute(proNo)!=null),proNo=Integer.parseInt(String)request.getAttribute(proNo);,(,2,)将当前题号增,1,后再存入,request,中,以便视图层文件读取:,request.setAttribute(proNo,proNo+);,(,3,)跳转到指定的视图层文件:,RequestDispatcher rd=request.getRequestDispatcher(thwDetailAddForm.jsp);,rd.forward(request,response,);,9.4.4,布置作业详细信息,ThwDetailAddAction,控制器,ThwDetailAddAction,用于响应详细信息输入页面中的“下一题”或“提交”按钮。实现要点如下:,(,1,)创建上传工具类对象:,UploadUtil,up=new,UploadUtil(this.getServletConfig(),request,response,);,(,2,)上传文件时调用上传工具类对象的,upload(),方法:,String,quePath,=/upload/hw/question/;/,题目上传文件存放目录,String,queFileName,=up.upload(0,quePath); /,上传题目文件,(,3,)读取表单提交过来的参数时,不能再使用,request.getParameter,(),方法,而是使用上传工具类对象的,getParameter,(),方法,如:,up.getParameter(tea_hw_no,),(,4,)根据单击的按钮进行不同的操作:,if(up.getParameter(sub).equals(,下一题,),else ,9.5,完成作业模块的设计与实现要点,完成作业模块针对学生用户,,主要功能是学生用户登录系统后,可选择完成或查看其所学的一门课程的作业。,本模块的实现仍采用,MVC,模式,下面,分别对其中的较难的功能点的设计和注意事项进行说明。,9.5.1,完成作业详细设计(,Homework 04,),限于篇幅原因,完成作业详细设计文档参见教材,9.5.1,节。,9.5.2,完成作业实现要点,1,V,:视图层(,JSP,),shwSubmit.jsp,(,1,)显示作业完成页面时,利用,标记循环输出每道题的信息,并利用,标记判断当前题目类型,根据类型不同,提供不同的输入控件让用户输入该题答案。,(,2,)显示题目内容相关上传文件超链接时,其地址如下格式:,href,=$,pageContext.request.contextPath/common/DownloadFileAction?file,=$,hw.thd_file_addr,其中,DownloadFileAction,用来来完成文件下载功能。调用时,需要传递一个名为“,file”,的参数,其值为要下载的文件的,url,地址。具体代码如下:,UploadUtil,up=new,UploadUtil(this.getServletConfig(),request,response,);,up.download(file,);,(,3,)由于作业的题目个数可能不只一个,因此在给每道题对应的输入控件命名时,最好在末尾加编号来区分不同题目对应的不同组控件。,因此同一组输入控件的,name,属性值为:,name=,shd_answer$vs.count,9.5.2,完成作业实现要点,2,C,:控制层(,Servlet,Java,类),控制器,ShwSubmitFormAction,用于显示完成作业输入页面。控制器,ShwSubmitAction,用于响应完成页面中的提交按钮。,ShwSubmitAction,在控制器,ShwSubmitAction,中,需要注意:,(,1,)先调用,shwAdd,(),方法添加学生作业整体信息。,(,2,)整体信息成功添加后,需要调用,getMaxShwNo,(),获取刚添加成功的作业整体信息编号,稍后添加作业详细信息时需要使用。,(,3,)添加作业详细信息时,需要利用,for,循环添加每道题的信息。,(,4,)获取多选题答案时,需要使用,getParameterValues,(),方法:,String type=,up.getParameter(thd_type+i,);,if(type.equals,(,多选,),String temp=,up.getParameterValues(shd_answer+i,);,if(temp,!=null),String,str,=;,for(int,k=0;k,temp.length;k,+),str,+=,tempk,;,shd.put(shd_answer,str,);,(,5,)当整体信息和详细信息均成功添加后,需要调用,updateTeabook,(),方法更新教学手册中该名学生本门课的作业提交次数。,小结,本章主要介绍了详细设计阶段需要明确的问题,并规定了相关设计文档的撰写规范。在实现功能之前,先按照文档中规定的内容确定文件名、类名、方法名以及输入输出参数名、数据类型、调用过程、转发地址等,只有明确了上述问题,才能在编码实现阶段少走弯路,并保证所实现的程序代码的合理性和正确性。在今后的项目开发中,也要养成先写设计文档,再根据文档的设计思路来编写代码的习惯。,另外,本章还介绍了如何利用第,6,章已经搭建完毕的模版工程,WebFrame,框架来搭建,tea,工程。,WebFrame,框架中提供的许多工具类及页面,在,tea,工程中同样也可以使用。将来如果需要创建其他的,Web,工程来实现不同的应用,都可以以,WebFrame,工程为模版,在它的基础上进行开发可以提高开发效率。,
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 办公文档 > 解决方案


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!