流行的Java Web应用框架基本上都实现了MVC模型,下面分别以JSF和Struts为例介绍这些框架是如何实现MVC模型的。
JSF
在JSP框架中提供了一个中心控制器FacesServlet完成所有的控制,这样所有的请求都可以提交这个Servlet。需要在web.xml中进行配置,典型的代码如下:
<context-param>
<param-name>javax.faces.CONFIG_FILES</param-name>
<param-value>/WEB-INF/faces-config.xml</param-value>
</context-param>
<servlet>
<servlet-name>Faces Servlet</servlet-name>
<servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
<load-on-startup>0</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>Faces Servlet</servlet-name>
<url-pattern>*.faces</url-pattern>
</servlet-mapping>
在代码中,url-pattern的值是“*.faces”意味着所有的以.faces结束的请求都会由中心控制器FacesServlet处理。
另外在使用JSF框架的时候还需要编写一个配置文件,在上面的配置中可以看到有一个参数,参数指向了一个配置文件faces-config.xml,这个文件是所有的JSF应用中必须提供的,在这个配置文件中可以描述文件之间的跳转关系,以及使用JavaBean等。下面是某个应用中的faces-config.xml中的部分代码:
<navigation-rule>
<from-view-id>/login.jsp</from-view-id>
<navigation-case>
<from-outcome>success</from-outcome>
<to-view-id>/ok.jsp</to-view-id>
</navigation-case>
<navigation-case>
<from-outcome>failure</from-outcome>
<to-view-id>/error.jsp</to-view-id>
</navigation-case>
</navigation-rule>
<managed-bean>
<managed-bean-name>userValidator</managed-bean-name>
<managed-bean-class>validator.UserValidator</managed-bean-class>
<managed-bean-scope>session</managed-bean-scope>
</managed-bean>
其中<navigation-rule>表示一个跳转关系,<from-view-id>表示从哪个页面的发送的请求,<navigation-case>表示一个可能的跳转,<from-outcome>表示一种情况的条件,<to-view-id>表示这种条件下的跳转目标。<managed-bean>表示一个被容器自动加载的类,所以所有的JavaBean基本上都不需要实例化。
在JSF框架中模型部分也是采用JavaBean实现,没有特殊的地方。
JSF框架中视图部分仍然使用JSP文件实现,只是为了与框架更好的结合,JSF提供了大量的自定义标签库来增强页面的功能。
在值的传递方面,JSF提供了表达式语言,通过表达式语言,直接把值从视图层传递给模型层,也可以把值从模型层传递给视图层。当然具体的传递过程仍然是通过控制层完成的。相当于把4种传递方式(从视图到控制层,从控制层到模型层,从模型层到控制层,从控制层到视图层)结合在一起了。
Struts
在Struts中提供了一个中心控制器ActionServlet完成所有的控制,这样所有的请求都可以提交给这个Servlet。需要在web.xml中进行配置,典型的代码如下:
<servlet>
<servlet-name>action</servlet-name>
<servlet-class>org.apache.struts.action.ActionServlet</servlet-class>
<init-param>
<param-name>config</param-name>
<param-value>/WEB-INF/struts-config.xml</param-value>
</init-param>
<load-on-startup>0</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>action</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
在代码中,url-pattern的值是“*.do”意味着所有的以.do结束的请求都会由中心控制器ActionServlet处理。对应用户的每个请求,都需要编写一个Action,与中心控制器一起完成控制功能。Action控制器中的代码与现在介绍的控制器中的代码基本相同。
另外在使用Struts框架的时候还需要编写一个配置文件,在上面的配置中可以看到有一个参数,参数指向了一个配置文件struts-config.xml,这个文件是所有的Struts应用中必须提供的,在这个配置文件中可以描述文件之间的跳转关系,以及请求路径和处理处理之间的关系。下面是某个应用中的struts-config.xml中的部分代码:
<struts-config>
<action-mappings>
<action path="/findAction" type="com.li.action.FindAction">
<forward name="success" path="/test.jsp" />
</action>
</action-mappings>
<message-resources parameter="ApplicationResources" />
</struts-config>
其中,每个action元素就表示一个请求,path属性指出请求的名字,例子中的名字对应一个以findAction.do为结束的请求。Type指出该请求由哪个Action处理,com.li.cation.FindAction就是要与中心控制器协同工作的Action。子元素<forward>表示Action执行完之后可能跳转到什么文件,这里的配置表明如果用户在程序中选择了success,则最后将跳转到test.jsp文件。后面的<message-resources>元素表示应用所使用的资源文件。
Structs中的模型部分JSF中的模型没有区别。
Struts中的视图部分仍然使用JSP文件实现,只是为了与框架更好的结合,Struts提供了大量的自定义标签库来增强页面的功能。
在值的传递方面,Struts提供了ActionForm机制,如果需要在视图层与控制层传值,需要编写ActionForm,ActionForm中的属性与要传递的表单元素是对应的。