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

##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对象,创建其具体的Action
            Action 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 ;
        }
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值