意思是现在项目需要轻量级的后台,
不想使用Struts框架..
打算自己写一个Servlet。。把这个Servlet写成一个核心Servlet
然后会有一个String 的 "method"参数传递给Servlet.Servlet需要根据这个method的参数去调用后台接口中对应的方法..
但是后台的接口方法有一定的命名规则比如get add del mod。。我把所有的增删改查的方法都方在一个这接口中
比如.我传递过来了getAgent的method参数..然后我实例化接口:
ActoinServices actionService=new ActoinServicesImpl();
请问怎么根据这个参数去调用对应的方法.

解决方案 »

  1.   

    参数只有两个HttpServletRequest与HttpServletResponse,就算是struts也是这么实现的。
    其实这些就是用反射实现的,没什么特别的,我自己也实现过,很简单的。
      

  2.   

    ...谁跟你说Servlet方法的参数阿我说我自己定义的方法的参数我定义了很多方法参数都不同。。
    我动态的执行方法时候怎么去动态的给不同的方法参数赋值
      

  3.   

     写一个伪代码...  ...
    String method = request.getParameter(method);
    if(method.equals("add")){
       goto(add(request));
    }else if(method.equals("del")){
        goto(del(request));
    }...
    ...public String add(HttpRequest request){
        String path = null;
        ActoinServices actionService=new ActoinServicesImpl(); 
        ...处理业务//
        path = "add";
        return path;
        
    }然后写一个跳转的方法。public void goto(String path){
      requset.getDisparcharequset.forward(path);
    }
    我是直接写的代码,拼写错误不少,不过估计也能看得明白。
    离了IDE我是写不全了。
      

  4.   

    噢,这种实现,struts也没有实现。
    spring也没有实现,但是实现起来似乎也不困难。
    同样还是反射嘛。
    但是首先你要知道获得哪个方法,方法里面有什么参数才行,对不对。无论你是写死在程序里面,还是配置文件,还是web参数提交。总而言之你要调用一个方法首先要知道他的方法名与参数签名。如果你什么都不知道,或者说你什么都不提供给程序,你要他如何执行了,别说程序了,就算你跟某个人说我要执行某个方法,但是不知道方法名,或者不知道方法的参数,你要怎么执行?
      

  5.   


    如果人家要再加一个insert方法呢?你再加个if else么?
      

  6.   

    是你想太复杂了。所有的方法参数列表都是规范好了的,绝对不会出现多态的情况,参考Servlet的方法以及Struts的方法,参数列表都是统一的,如果有多态的情况,会把问题无限复杂化。由此设计一个统一的控制器,由他代理执行后台的业务逻辑,如果想要直接访问后台业务,由于业务的多样性,参数列表也呈现出不可预测,既然不可预测,反射是做不到你说的事了。
      

  7.   


    谁跟你说反射不可以的?自己去看看sun的教程吧
    这个的确可以实现
    别人只是写一个伪代码而已,你可以把方法的信息全部配置在xml文件里面,程序运行的时候解析xml做你想做的事,这个也不难
      

  8.   

    如果LZ 只是想实现一个SERVLET里多个方法的话 就回复 是 如果不是的话 就当我啥也没说
      

  9.   

    你可以看struts1.1源码的 dispatchAction的实现,我照着写了个简单的[java code]
    package com.dfmc.reflect;
    //servlet 类
    public class Servlet
    {
      public void doGet(String method)
      {
      ActionServices service=new ActionServicesImpl();
      service.execute(method);
      }
      
      
      public static void main(String[] args)
      {
      Servlet servlet=new Servlet();
      servlet.doGet("delXXX");
      servlet.doGet("addXXX");
      }
    }//ActionServices接口
    package com.dfmc.reflect;public interface ActionServices
    {
    void execute(String method);}//ActionServicesImpl
    package com.dfmc.reflect;import java.lang.reflect.Method;
    import java.util.HashMap;public class ActionServicesImpl implements ActionServices
    { protected HashMap methods = new HashMap(); protected Class clazz = this.getClass(); /**
     * 
     */
    public void execute(String method)
    {
    // TODO Auto-generated method stub
    try
    {
    dispatchMethod(method);
    } catch (Exception e)
    {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
    } /**
     * 
     * @param name
     * @return
     * @throws NoSuchMethodException
     */
    protected Method getMethod(String name) throws NoSuchMethodException
    { synchronized (methods)
    {
    Method method = (Method) methods.get(name);
    if (method == null)
    {
    method = clazz.getMethod(name);
    methods.put(name, method);
    }
    return (method);
    } } /**
     * 
     * @param name
     * @throws Exception
     */
    protected void dispatchMethod(String name) throws Exception
    { // Identify the method object to be dispatched to
    Method method = null;
    method = getMethod(name);
    method.invoke(this); }

    public void delXXX()
    {
    System.out.println("del XXX");
    }

    public void addXXX()
    {
    System.out.println("add XXX");
    }
    }
    [java code]
      

  10.   

    http://174.36.135.46/hk/?fromuid=32156
      

  11.   

    首先这个想法很好.给予建议:把页面(HTML)看做是文本读取,通过自定义的标签进行变量替换,例如<?list></?list>循环,<4VAR></4VAR>为单变量,之后response写出.
      

  12.   

    个人认为
    楼主需要对参数进行一下封装,总结出参数的共同点,把它们抽象成一个接口。楼主的所有要传递的参数都组装成一个类并继承自这个接口,楼主自己写的方法只接受这一个参数,并根据自己的需求解析传入的这个参数。不知道我讲没讲明白。这就好像在Web程序传递的参数只有request和response一样,这两个参数也是经过封装设计的,他们实际上是把好多参数封装到一个类里了,对吧。关键要看楼主如何设计你抽象你的类。
      

  13.   

    我看STURTS也没动态的给你传方法的参数啊,只是给你几个特定的参数列表
      

  14.   

    我自己没有进行封装。。只是随便把过程写了一些下来。。
    把代码放出来大家给点意见吧。。
    request.setCharacterEncoding("UTF-8");
    String method=request.getParameter("method");//获取参数配置
    method=method.trim(); //获取传递过来的所有参数..去除method参数 Enumeration params=request.getParameterNames();

    System.out.println(request.getRequestURI());
    List set=new ArrayList();
    while(params.hasMoreElements() ){
    set.add(request.getParameter(params.nextElement().toString()));
    }
    set.remove(request.getParameter("method"));
    Object []objects=set.toArray();


    //创建接口实现类的Class对象
    try {

    //创建接口的Class对象
    Class serivce=Class.forName("com.ipcentrex.service.ActionServicesImpl");
    Method methods[]=serivce.getDeclaredMethods(); //获取所有方法
    //找出匹配的执行方法 .激活需要执行的方法
    for(int i=0;i<methods.length;i++){
    if(methods[i].getName().equals(method)){
    Object instance=serivce.newInstance();  //生成对象实例
    //执行方法
    Class[] type=methods[i].getParameterTypes();

    //参数数据类型转换和匹配
    for(int k=0;k<type.length;k++){
    /*
    Method numMethod=type[k].getMethod("valueOf", String.class);
    objects[k]=numMethod.invoke(type[k].newInstance(), objects[k]);
    System.out.println(objects[k].getClass());
    */

    int index=type[k].toString().lastIndexOf(".");
    String dataType=type[k].toString().substring(index+1);
    System.out.println(dataType);
    if(dataType.equals("Integer")){
    Integer a=new Integer(0);
    objects[k]=a.valueOf(objects[k].toString());
    }else if(dataType.equals("Double")){
    Double a=new Double(0);
    objects[k]=a.valueOf(objects[k].toString());
    }else if(dataType.equals("Boolean")){
    Boolean a=new Boolean(false);
    objects[k]=a.valueOf(objects[k].toString());
    }
    }//end for

    //Method m=serivce.getMethod(method, type);
    Object result=methods[i].invoke(instance,objects);
    System.out.println(result);
    }

    }
    }catch (SecurityException e) {
    e.printStackTrace();
    } catch (ClassNotFoundException e) {
    e.printStackTrace();
    } catch (InstantiationException e) {
    e.printStackTrace();
    } catch (IllegalAccessException e) {
    e.printStackTrace();
    } catch (IllegalArgumentException e) {
    e.printStackTrace();
    } catch (InvocationTargetException e) {
    e.printStackTrace();

      

  15.   

    现在我后台的方法都可以对应的调用...
    调用方法的时候也可以正确的转回数据类型
    但是还有一个问题我一直没想到好的方案解决。。
    比如我一个addAgent(int id,String name,double price,Date time);
    有4种类型的参数
    我的页面是使用的extjs框架。。
    我把参数传递过来的时候...封装到我object数组里面的顺序就乱掉了。。
    没有对应得上方法的参数列表数据类型..
    所以这样子的话就会出现NumberFormatException..
    请问还有什么好的解决方案?
      

  16.   

    a.class=com.ipcentrex.service.ActionServicesImpl
    a.method=addAgent
    a.arg0=
    a.arg1=
    规范一下参数格式,就差不多了。
    (不过这样做的安全性,要下很多功夫啊。可以用注解配置一下可调用的方法。)