基础数据准备好之后,就轮到action 和 actionform 出场了 (struts 的核心组件)。
mvc框架中control 在这里就是action,充当控制器的action在请求发送发来时可以做出相应的处理然后转发到(或者重定向)对应的页面,这样通过控制器这个中介者,当模型层的数据发生了改变之后,视图层将自动改变其内容,这里也蕴含了设计模式中的观察者模式和中介者模式。
我写的简单action如下:
- <span style="font-family:System;font-size:13px;">import javax.servlet.http.HttpServletRequest;
- import javax.servlet.http.HttpServletResponse;
- public abstract class Action {
- public abstract ActionForward execute(ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception ;
- }</span>
但是你会发现这个action里面只有一个方法,所有的处理只能在这一个方法里面写,跟普通的servlet相比强不到哪里去,于是我模仿struts1.X写了个dispatcheraction 这个action继承了抽象类action(体现了面向对象思想的小优点),运用反射思想实现了一个更加灵活的控制器;如下:
- <span style="font-family:System;font-size:13px;">import java.lang.reflect.Method;
- import javax.servlet.http.HttpServletRequest;
- import javax.servlet.http.HttpServletResponse;
- public class DispatcherAction extends Action {
- @Override
- public ActionForward execute(ActionForm form, HttpServletRequest request,
- HttpServletResponse response) throws Exception {
- //1、获取界面上传递的method参数
- String methodName = request.getParameter("method");
- if (null == methodName || "".equals(methodName)) {
- return this.unspecified(form, request, response);
- }
- //2、根据method参数,调用自身的对应方法
- Class c = this.getClass();
- Method method = c.getMethod(methodName, new Class[]{ActionForm.class,HttpServletRequest.class,HttpServletResponse.class});
- return (ActionForward)method.invoke(this, new Object[]{form,request,response});
- }
- public ActionForward unspecified(ActionForm form, HttpServletRequest request,
- HttpServletResponse response) throws Exception {
- return null;
- }
- }</span>
我们可以通过界面传来的method参数动态选择调用对应的方法,反射真带感;当没有method参数的就默认调用unspecified方法。
c.getMethod(methodName, new Class[]{ActionForm.class,HttpServletRequest.class,HttpServletResponse.class}); 这行代码就要求我们当自己写一个要被调用的方法时候参数列表比喻和这里的参数一样,只有这样反射的时候才能获取到对应的方法。
你或许在上面又看到了一个不知道的类:actionforward。
每当控制层拿到模型层的数据的时候,根据需要要选择转发或者重定向,但是需要返回相同的类型哦;所以我们就把这两种情况封装到一个类里面。
如下:
- public class ActionForward {
- //请求或者重定向的URI
- private String uri;
- //是否转发。为TRUE就转发,为FALSE就是重定向
- private boolean isForward;
- public ActionForward(String uri) {
- this.uri = uri;
- isForward = true;
- }
- public ActionForward(String uri, boolean isForward) {
- this.uri = uri;
- this.isForward = isForward;
- }
- public String getUri() {
- return uri;
- }
- public void setUri(String uri) {
- this.uri = uri;
- }
- public boolean isForward() {
- return isForward;
- }
- public void setForward(boolean isForward) {
- this.isForward = isForward;
- }
- }
当然这时候还缺少一个界面数据封装组件,大家应该也知道就是actionform(呵呵,struts1.X的 代表作,曾被无数高手鄙视,它的存在催生了struts2.0的诞生)如下:
- /**
- * 少了一个reset方法和一个validator方法
- *
- */
- public abstract class ActionForm {
- }
但是现在大家仍然没感觉到我这个MVC框架到底怎么个回事,是的之前全是在做准备工作,下面的就是核心的命令控制器 RequestProcessor的 实现,它会将整个MVC框架的流程展现得淋漓尽致!