ITPub博客

首页 > 大数据 > 数据分析 > java EE开发之Servlet第八课:MVC模式 (基本理解)

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

原创 数据分析 作者:新梦想IT 时间:2023-03-27 15:49:45 0 删除 编辑



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

        }


来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/69940641/viewspace-2941885/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
新梦想IT职业教育(新梦想软件测试),是长沙一家专注于IT教育培训的机构。分享干货不容易,如果想了解更多的软件测试精彩干货,请留言交流,感谢阅读!

注册时间:2019-07-11

  • 博文量
    237
  • 访问量
    140168