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 ;
    }

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

发布了26 篇原创文章 · 获赞 13 · 访问量 7032

猜你喜欢

转载自blog.csdn.net/womeia331416/article/details/54955536