##1,为什么需要MVC模式?
为什么需要MVC模式,以前简单的JSP页面处理不好吗?MVC有什么好处呢?
答:MVC就是常说的:

  • 模型(Model):POJO(Plain Old Java Object普通类)
  • 视图(View):Jsp
  • 控制Controller):Servlet Filter

它把业务处理和Jsp页面分开了。而以前的Jsp页面是把所有的代码都写在Jsp 页面中,那样不利于维护,MVC模式的目的就是实现Web系统的职能分工。
####MVC模式的好处:
#####1.各施其职,互不干涉
   在MVC模式中,三个层各施其职,所以如果一旦哪一层的需求发生 了变化,就只需要更改相应的层中的代码而不会影响到其它层中的
代码。
#####2.有利于开发中的分工
在MVC模式中,由于按层把系统分开,那么就能更好的实现开发中
的分工。网页设计人员可以进行开发视图层中的JSP,对业务熟悉的开
发人员可开发业务层,而其它开发人员可开发控制层。
#####3.有利于组件的重用
分层后更有利于组件的重用。如控制层可独立成一个能用的组件, 视图层也可做成通用的操作界面。

##2.MVC的基本原理是怎样的呢?
每个层之间的关系又是怎样的,它们是怎样执行的?
答:基本原理是:

每一步代表的意思是:
#####1,jsp页面,通过请求到配置文件中然后到Struts2Filter
#####2,a,在Struts2Filter中 通过页面的请求Action=“XXX.action”

//获得要请求的路径 打印uri的结果是 :/MVCTest1/reg.action
String uri=request.getRequestURI();
//获得请求的文件名:打印requstname 的结果是:reg.action
String reqeustname=uri.substring(uri.indexOf("/",1)+1);
//通过要请求的文件名到属性文件中去找相对应的类的名称
String classname= ps.getProperty(reqeustname);

#####3,返回一个相对应的类的名称

//去CLASS类中找类名为 classname的类
Class c=Class.forName(classname);
//找到后再调Class类的构造方法
Object obj=c.newInstance();
//因为obj是实现了Action接口的,所以
Action action=(Action)obj;

#####4,找到类后再去调类中的方法,

//然后再调Action中的execute方法  返回一个String字符串
String result = action.execute(request, response);
action.execute(request, response);//主要是用来调用Dao层的方法的

#####**5,因为类都实现了Action的接口,所以再第三步中可以中接口来作为类型 **

//接口是一个业务员要工作的一组规范
//参数是:请求对象 和响应对象
//返回是:String 最终页面跳转的路径
public String execute(HttpServletRequest     request,HttpServletResponse response)throws Exception;

#####6,因为方法的返回类型是 String对象,这个字符串代表的就是最终跳转的和页面,但是有一个问题,就是跳转的方式有重定向和转发这里,我们不做判断,默认就用转发

//重定向:通过request.getContextPath()得到上下文路response.sendRedirect(request.getContextPath()+"/"+path);//转发           request.getRequestDispatcher("/"+path).forward(request, response);

##3.具体实现
(1)开发一个Struts2Filter(公司),要求能够接收所有的.action请求。(即配置web.xml文件达到要求)

public class Struts2Filter implements Filter{public void destroy() {}........public void doFilter(ServletRequest req, ServletResponse res,FilterChain chain) throws IOException, ServletException {}}

(2)开发一个业务员的接口Action接口,要求定义一个行为,即execute方法,传入请求与响应对象,返回一个结果页面的jsp文件名。

public class MaleAction implements Action {public String execute(HttpServletRequest request,HttpServletResponse response) {String uname = request.getParameter("uname");request.setAttribute("uname", uname);System.out.println(uname+"你好,刘教授为你看病...");return "maleOk.jsp";}
}

(3)在WEB-INF目录上加一个属性文件,文件名:actionConfig.properties,此文件是一个注册了请求的URI与业务员类的对应关系。

#资源文件
#男科 = 专家刘教授
#内科 = 主任孙教授male.do = com.kz.action.MaleAction
#female.do = com.accp.action.FemaleAction
query.do = com.kz.action.QueryAction
del.do = com.kz.action.DelAction

(4)在Struts2Filter类的init方法中将属性文件actionConfig.properties文件内容加载到一个属性对象中。

public void init(FilterConfig filterConfig) throws      ServletException {//读取本地资源配置文件InputStream is =filterConfig.getServletContext().getResourceAsStream("/WEB-INF/config.properties");//把配置文件读入到内存中ps = new Properties();try {ps.load(is);//关闭is.close();} catch (IOException e) {e.printStackTrace();}}

(5)在Struts2Filter的服务方法首先对所有的请求参数进行编码。

//System.out.println("访问到了ActionServlet");
HttpServletRequest request = (HttpServletRequest)req;
HttpServletResponse response=(HttpServletResponse)res;
request.setCharacterEncoding("utf-8");

(6)在Struts2Filter的服务方法中根据请求的URI得到对应的业务员对象。

//1.获取客户端收送的请求类型(具体的请求信息:male.action
//                          female.action ....)
//    /mvc/male.action
String uri = request.getRequestURI();
//巧用文件对象,获取具体的male.action
File file = new File(uri);
String type = file.getName();
System.out.println(type);//2.根据请求类型,找到对应的负责处理请求的类
//发出的是一个看男科的请求,就需要找到对应的男科医生
String className = ps.getProperty(type);
if(className!=null){//根据具体的类名,获取其Class类型的对象Class c =  Class.forName(className);//根据 c对象,创建其具体的ActionAction action =  (Action)c.newInstance();
}

(7)在Struts2Filter的服务方法中得到业务员对象后,调用业务员execute方法,开始工作,并接收业务员返回的结果页面的jsp文件名,在Struts2Filter的服务方法中接收到业务员返回的结果页面jsp名字后后,将页面转发或者是重定向到结果页面去。

//调用action的执行方法(看病的行为,会有一个结果返回)
try{String url = action.execute(request,response);//根据结果,执行页面的跳转(默认是转发)request.getRequestDispatcher(url).forward(                                                   request, response);//放行---在最后放行if(url==null){chain.doFilter(request, response);}else{return ;}

遗留问题:不能确定设置重定向或者转发?


超全面的测试IT技术课程,0元立即加入学习!有需要的朋友戳:

腾讯课堂测试技术学习地址

java EE开发之Servlet第八课:MVC模式 (基本理解)相关推荐

  1. java ee监听器编程,java EE开发之Servlet第四课:监听器(Listener)

    1.什么是Listener 监听器就像老板的秘书,那个秘书就是活的监听器,时时监听着老板,当老板发生一些事情的时候,秘书就会有相应的措施.比如老板口渴了,秘书就会去端茶:比如老板要提提神,秘书就会泡一 ...

  2. Java服务器接口快速开发之Servlet详细教程

    今日科技快讯 7月14日晚间消息,据乐视网刚刚披露的业绩预告,公司预计2017年上半年亏损6.37亿至6.42亿元,上年同期盈利2.84亿元.报告期内,乐视网资产减值损失计提规模较大约为2.3亿元,其 ...

  3. JAVA游戏开发之FPS精准控制

    目录 JAVA游戏开发之FPS精准控制... 1 1       概述... 2 1.1        编写目的... 3 2       FPS精准控制... 3 2.1        FPS描述. ...

  4. java 并发开发之AQS

    java 并发开发之AQS AQS 是什么,有什么作用? ① 是什么:AQS 是抽象队列同步器,AQS定义了一套多线程访问共享资源的同步器框架,许多同步类实现都依赖它 ② 有什么作用:为Java的并发 ...

  5. MVC 模式/Servlet/JSP 编译原理剖析:Servlet 组件到底属于 MVC 模式的哪一层?

    文章目录 前言 一.回忆什么是 MVC 模式? 1.1.Model.View.Controller 组件介绍 1.2.明确 View 与 Controller 组件区别 二.什么是 Servlet? ...

  6. (004) java后台开发之Eclipse(Neon) 版本安装Java EE插件

    Eclipse Neon Java版本安装Java EE插件 Help→Install New Software 地址:Neon - http://download.eclipse.org/relea ...

  7. java 向上舍入_介绍Java的大数类(BigDecimal)和八种舍入模式

    1.BigDecimal简介 BigDecimal 由任意精度的整数非标度值 和32 位的整数标度 (scale) 组成.如果为零或正数,则标度是小数点后的位数.如果为负数,则将该数的非标度值乘以 1 ...

  8. Java EE:第10章初识Spring MVC框架 课后习题

    <Java EE企业级应用开发教程 第2版(Spring+Spring MVC+MyBatis)>黑马程序员编著 中国工信出版集团 人民邮电出版社 目录 1.请简述MyBatis与Spri ...

  9. Java开发之ServLet详解

    一.什么是ServLet? serverLet是javaEE中运行于服务器端的,用于接收和响应HTTP协议的请求的程序. 二.ServLet的三种实现方式 1.实现ServLet接口 步骤: (1)实 ...

最新文章

  1. oracle 函数参数类型,ORACLE 11g中的表值函数? (参数化视图)
  2. 显卡玩家の反击!矿难一个月,618集体大战黄牛“降价也不买”
  3. Cuda中Global memory中coalescing例程解释
  4. 《淘宝店铺装修与促销设计宝典》一6.1 设计全面的店铺客服区
  5. Web应用开发技术(1)-html
  6. MVC之AJAX异步提交表单
  7. sql server中数据约束相关的查询
  8. C++如何生成随机数
  9. UWA学堂|逻辑代码模块
  10. Norton Ghost V12
  11. 一些PDG格式的Linux书籍(转)
  12. python双色球数据抓取及模拟生成高概率的号码
  13. 解决win10网络共享自动关闭问题
  14. Windows下生成 MD5 文件校验和的方法
  15. 二维码超分效果评价指标
  16. 喜 欢 和 爱 的 区 别
  17. 解决百度云主机(BCH)wordpress程序伪静态和后台打开404问题(创客互联)
  18. DAEMON Tools Ultra(虚拟光驱超级版)v5.5.0.1046免费版
  19. linux netstat 命令 (转载)
  20. excel 数据的有效性检查

热门文章

  1. 南京去年2万多张驾驶证过期未审-驾驶证-过期
  2. 六、PageRank算法与代码实战【CS224W】(Datawhale组队学习)
  3. VNC-Server Install Windows Linux
  4. 平面反射builltinURP—— UnityShader学习记笔记
  5. springMvc接口开发--对访问的restful api接口进行拦截实现功能扩展
  6. linux mint 修改dns,如何在Ubuntu和LinuxMint中刷新DNS缓存-linux运维
  7. vue-echarts画深度图
  8. python如何将多张图片批量插入PPT中?
  9. C#学习记录(四)表达式及if、switch、try、while
  10. “IP+空格+域名”方式解决外国网站访问慢问题