MVC的控制层

控制层主要用来转发从视图层传来的数据和请求到相对应的模型层,因此,实现它最好的方式莫过于使用Servlet了。当从视图层获取请求后,首先通过对web.xml文件的配置,使其转入Servlet,在Servlet中完成对页面中数据的封装和对相应模型的选择,然后再到相应的模型层进行数据处理;当在模型层数据处理完毕后,通过RequestDispatcher将处理后的数据返回相应的视图页面.在Servlet中,将使用doPost()来处理相应的中转请求,如果开发人员使用get提交方式,则使用如下方式进行处理。示例代码如下:

public void doGet(HttpServletRequest req, HttpServletResponse res)

throws ServletException, IOException {

    doPost(req, res);

}

//使用post提交方式

public void doPost(HttpServletRequest req, HttpServletResponse res)

throws ServletException, IOException {

    do_Dispatcher (req, res);

}

— 不论采用get还是post提交方式,都将执行do_Dispatcher(req, res)方法。

— do_Dispatcher(req, res)是用来处理视图层发送来的请求的方法。

直接使用request方式来获取从页面提交的数据,在要获取的数据比较多的情况下,会比较烦琐,而且直接将request传递给模型层不符合Model 2规范。所以,这里将对从页面传来的值进行封装,将其放在一个Map中,然后再传递给模型层,这样在模型层就可以直接使用Map

private HashMap getRequestToMap(HttpServletRequest req) throws Exception {

    req.setCharacterEncoding("GBK");

        HashMap infoIn = new HashMap();

        for (Enumeration e = req.getParameterNames(); e.hasMoreElements ();)

                {//获取页面中所有元素名

            String strName = (String)e.nextElement();

            String[] values = (String[]) req.getParameterValues (strName);

                //根据名称获取对应的值

            if (values == null) {//假如没有值

                infoIn.put(strName, "");

            } else if (values.length == 1) {//假如只有一个值

                infoIn.put(strName, values[0]);

            } else {//假如有多个值

                infoIn.put(strName, values);

            }

        }

    return infoIn;

}

一个视图对应一个模型,也可能一个视图对应多个模型,但只有一个控制器,所以,为了实现一个控制器可以转发到多个模型中去,就需要使用接口,让所有模型都实现这个接口,然后在控制器里,仅仅是面对接口编程即可。这里定义一个接口Action.java,Action.java的示例代码如下:

package com.gd.;

import java.util.*;

public interface Action{

    public HashMap doAction(HashMap infoIn);

}

在控制器中只针对这个接口处理即可。示例代码如下:

Actionaction = (Action) Class.forName(getActionName(systemName,

logicName)).newInstance();

HashMap infoOut = action.doAction(infoIn);

—  getActionName()方法是获取实现接口Action的类的名称和所在的包。示例代码如下:

private String getActionName(String systemName ,String actionName) 

throws IOException, Exception {

return "com. " + systemName + ".action." + actionName;

}
使用RequestDispatcher返回视图层。示例代码如下:

req.setAttribute("infoOut", infoOut);

RequestDispatcher rd = req.getRequestDispatcher("/"+ systemName +

"/jsp/" + forwardJsp+ ".jsp");

rd.forward(req, res);

定义web.xml文件,是将所有以do为后缀的请求,都转入控制器进行分派。web.xml文件的示例代码如下:

<?xml version="1.0" encoding="GBK"?>

<web-app version="2.4"

 xmlns="http://java.sun.com/xml/ns/j2ee"

 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

 xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee

 http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">

    <display-name>web.xml的示例</display-name>

    <description>

    控制器示例

    </description>

<!--定义控制器-->

<servlet>

        <servlet-name>gdServlet</servlet-name>

        <servlet-class>com.gd.action.GdServlet</servlet-class>

</servlet> 

<!--拦截所有以do为后缀的请求-->

    <servlet-mapping>

         <servlet-name>gdServlet</servlet-name>

         <url-pattern>*.do</url-pattern>

    </servlet-mapping>

</web-app>

—  com.gd.web.GdServlet,表示控制器为com.gd.web.GdServlet。

—  *.do,表示拦截所有以do为后缀的请求。

猜你喜欢

转载自utopialxw.iteye.com/blog/1483254