2011-01-21 67 views
1

嗨,只是想问一个在Spring MVC控制器的设计问题。 请求URL将有多个参数,例如。 type = v1 & par2 = v2 & par3 = v3 & par4 = v4。在4个参数中,“类型”将决定交易模式,其他参数将作为每笔交易的输入。代码设计在春天mvc控制器

如何组织控制器代码? 传统上,你可能会写一些像下面,

if (type.equals('1')) 
{ 
    callMode1(par2,par3, par4); 
} 
else if (type.equals('2') 
{ 
    callMode2(par2, par3, par4); 
} 
else if (type.equals('3')) 
{ 
    callMode3(par2, par3, par4); 
} 

callMode1 - callMode2是在控制器的私有方法。

想知道是否有更好的方法在这里写代码?

在此先感谢!

+0

你是什么意思'交易模式'。你想通过http参数改变tx隔离吗? – AngerClown 2011-01-21 02:52:47

回答

3

您应该为每个“类型”创建一个请求处理方法。每种方法都需要@RequestMapping注释。

的RequestMapping注解提供称为params一个属性:

抽象字符串[] PARAMS

映射请求的参数, 缩小主映射。用于任何环境

相同格式:“myParam = myvalue的”风格 表达式的 序列,具有请求仅 如果每个这样的参数被发现 到具有给定的值进行映射。可以通过使用“!=” 运算符来否定表达式 ,如在“myParam!= myValue”中一样。 “myParam”风格表达式也支持 ,此类参数 将出现在请求中(允许 有任何值)。最后, “!myParam”样式表达式指示 指定的参数不是 应该出现在请求中。

然后你就可以用这种方式实现:

@Controller 
@RequestMapping(what ever you have in common) 
class Handler { 

    @RequestMapping(params={"type=1"}) 
    public void mode1() { 
    ... 
    } 

    @RequestMapping(params={"type=2"}) 
    public void mode2() { 
    ... 
    } 
} 
+0

谢谢你的工作。在这里没有定义的其他场景如何?即。 'type'是一个意想不到的值? – Koolala 2011-01-23 23:02:39

1

查看使用@RequestMapping注释将三种模式方法分离为公共请求方法。例如:

@RequestMapping(value="/type/1") 
public void mode1() { 
    ... 
} 

@RequestMapping(value="/type/2") 
public void mode2() { 
    ... 
} 

@RequestMapping(value="/type/3") 
public void mode3() { 
    ... 
} 

你需要改变你的网址/类型/ 1/...等,但那么你就可以能够访问你的其他变量的方法参数。在Spring文档中阅读整个MVC页面以获取其他想法。祝你好运!

0

我觉得这是一个很好的使用情况的枚举:

public enum Type { 
    T1 { 
     @Override 
     public void call(String par1, String par2, String par3) { 
      callMode1(par1, par2, par3); 
     } 
    }, 
    T2 { 
     @Override 
     public void call(String par1, String par2, String par3) { 
      callMode2(par1, par2, par3); 
     } 
    }, 
    T3 { 
     @Override 
     public void call(String par1, String par2, String par3) { 
      callMode3(par1, par2, par3); 
     } 
    }, 

    public abstract void call(String par1, String par2, String par3); 

    public static Type valueOfNumber(String number) { 
     return valueOf("T" + number); 
    } 

} 

然后,控制器将只是获得相应的键入并调用呼叫:

Type t = Type.valueOfNumber(type); 
t.call(par1, par2, par3);