Spring MVC底层的简单实现


Spring的主要功能是揉和struts和hibernate,使他们更好的配合,发挥更大的作用。
首先要实现struts对方法的调用,先写一个实体类
public class Student {
    private String username="haha";
    private int age=89;
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    public String getUsername() {
        return username;
    }
    public void setUsername(String username) {
        this.username = username;
    }
    //此方法便于后面的测试
    public void test(){
        System.out.println("hello world");
    }
}

写一个action,并且和实体类建立以来关系。
public class UserAction {
    private Student stu;
    public Student getStu() {
        return stu;
    }
    public void setStu(Student stu) {
        System.out.println("set方法: "+stu);
        this.stu = stu;
    }
    public String register(){
        System.out.println(stu.getUsername());
        System.out.println(stu.getAge());
        System.out.println("我是register");
        return "success";
    }
}

再写一个strutsaction的测试类,获取方法名,便于读取方法
import java.lang.reflect.Field;
import java.lang.reflect.Method;
public class Struts2ActionTest {
                                                                                                                                                                           
    public static void main(String[] args)throws Exception {
        //类的全路径
        String actionClass="service.UserAction";
        //将要执行的方法名称
        String method="register";
        //加载Action类并动态创建一个对象
        Object action=Class.forName(actionClass).newInstance();
        //通过这个对象得到自己的Class信息对象
        Class cls=action.getClass();
        //得到这个类的属性变量
        Field[] fields=cls.getDeclaredFields();
        for(Field field:fields){
            //得到属性的类型
            Class fieldClass=field.getType();
            //创建这个属性的对象
            Object fieldObj=fieldClass.newInstance();
            //得到属性名
            String fieldName=field.getName();
            //构造setter方法
String setMethod="set"+fieldName.substring(0,1).toUpperCase()
+fieldName.substring(1);
            System.out.println("setMethod: "+setMethod);
            //通过方法名和参数列表得到具体的方法对象
Method prop_method=cls.getDeclaredMethod(setMethod,new Class[]{fieldClass});
        //执行这个方法,并且传入fieldObj参数(调用了setter方法进行赋值)
            prop_method.invoke(action,fieldObj);
        }
        //得到Action中具体的执行方法
        Method actionMethod=cls.getDeclaredMethod(method);
        //执行这个方法
        actionMethod.invoke(action);
System.out.println(actionMethod.invoke(action));
    }
}

这样就得到了UserAction里的setStu方法,这样就可以进入register方法,并且得到方法返回的“success”。

下面写一个方法调用的类,通过包名+类名+方法名,实现方法的调用:

import java.lang.reflect.Field;
import java.lang.reflect.Method;
public class InvokeHandle {
    public static void callMethod(String className,String methodName){
        try {
            Object obj=Class.forName(className).newInstance();
            Class cls=obj.getClass();
  System.out.println("父类是:"+cls.getSuperclass().getName());
            //得到这个类的属性变量
            Field[] fields=cls.getDeclaredFields();
            System.out.println("成员变量有:");
            for(Field f:fields){
                System.out.println(f.getName()+" *** ");
            }
            System.out.println("=====================");
            Method[] methods=cls.getDeclaredMethods();
            System.out.print("方法有:");
            for(Method method:methods){
                System.out.println(method.getName()+" ");
            }
            System.out.println("=====================");
            Method targetMethod=cls.getMethod(methodName,null);
            targetMethod.invoke(obj);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

写一个简单的方法:
public class DepartService {
    public void getDepartById(){
        System.out.println("我通过id得到部门");
    }
}

写一个学生类测试一下:
public class StudentTest {
                                                         
    public static void main(String[] args) {
        //传统的调用方法
        Student student=new Student();
        student.setUsername("afei");
        student.test();
        System.out.println();
        InvokeHandle.callMethod("service.DepartService","getDepartById");
    }
}

有写的不好的地方请多交流。
希望对你们有帮助!!!

 

Spring MVC+Spring3+Hibernate4开发环境搭建

Spring MVC整合Freemarker基于注解方式

基于注解的Spring MVC简单介绍

Spring MVC 框架搭建及详解

相关内容