意思是现在项目需要轻量级的后台,
不想使用Struts框架..
打算自己写一个Servlet。。把这个Servlet写成一个核心Servlet
然后会有一个String 的 "method"参数传递给Servlet.Servlet需要根据这个method的参数去调用后台接口中对应的方法..
但是后台的接口方法有一定的命名规则比如get add del mod。。我把所有的增删改查的方法都方在一个这接口中
比如.我传递过来了getAgent的method参数..然后我实例化接口:
ActoinServices actionService=new ActoinServicesImpl();
请问怎么根据这个参数去调用对应的方法.
不想使用Struts框架..
打算自己写一个Servlet。。把这个Servlet写成一个核心Servlet
然后会有一个String 的 "method"参数传递给Servlet.Servlet需要根据这个method的参数去调用后台接口中对应的方法..
但是后台的接口方法有一定的命名规则比如get add del mod。。我把所有的增删改查的方法都方在一个这接口中
比如.我传递过来了getAgent的method参数..然后我实例化接口:
ActoinServices actionService=new ActoinServicesImpl();
请问怎么根据这个参数去调用对应的方法.
其实这些就是用反射实现的,没什么特别的,我自己也实现过,很简单的。
我动态的执行方法时候怎么去动态的给不同的方法参数赋值
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我是写不全了。
spring也没有实现,但是实现起来似乎也不困难。
同样还是反射嘛。
但是首先你要知道获得哪个方法,方法里面有什么参数才行,对不对。无论你是写死在程序里面,还是配置文件,还是web参数提交。总而言之你要调用一个方法首先要知道他的方法名与参数签名。如果你什么都不知道,或者说你什么都不提供给程序,你要他如何执行了,别说程序了,就算你跟某个人说我要执行某个方法,但是不知道方法名,或者不知道方法的参数,你要怎么执行?
如果人家要再加一个insert方法呢?你再加个if else么?
谁跟你说反射不可以的?自己去看看sun的教程吧
这个的确可以实现
别人只是写一个伪代码而已,你可以把方法的信息全部配置在xml文件里面,程序运行的时候解析xml做你想做的事,这个也不难
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]
楼主需要对参数进行一下封装,总结出参数的共同点,把它们抽象成一个接口。楼主的所有要传递的参数都组装成一个类并继承自这个接口,楼主自己写的方法只接受这一个参数,并根据自己的需求解析传入的这个参数。不知道我讲没讲明白。这就好像在Web程序传递的参数只有request和response一样,这两个参数也是经过封装设计的,他们实际上是把好多参数封装到一个类里了,对吧。关键要看楼主如何设计你抽象你的类。
把代码放出来大家给点意见吧。。
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();
}
调用方法的时候也可以正确的转回数据类型
但是还有一个问题我一直没想到好的方案解决。。
比如我一个addAgent(int id,String name,double price,Date time);
有4种类型的参数
我的页面是使用的extjs框架。。
我把参数传递过来的时候...封装到我object数组里面的顺序就乱掉了。。
没有对应得上方法的参数列表数据类型..
所以这样子的话就会出现NumberFormatException..
请问还有什么好的解决方案?
a.method=addAgent
a.arg0=
a.arg1=
规范一下参数格式,就差不多了。
(不过这样做的安全性,要下很多功夫啊。可以用注解配置一下可调用的方法。)