【问题标题】:code design in spring mvc controllerspring mvc控制器中的代码设计
【发布时间】:2011-01-21 01:00:45
【问题描述】:

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

您将如何组织控制器代码? 传统上,您可以编写如下内容,

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 是控制器中的私有方法。

只是想知道这里有没有更好的方法来编写代码?

提前致谢!

【问题讨论】:

  • “交易模式”是什么意思。您是否尝试通过 http 参数更改 tx 隔离?

标签: java spring spring-mvc


【解决方案1】:

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

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

抽象字符串[] 参数

映射请求的参数, 缩小主映射。

任何环境都采用相同的格式:a “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() {
     ...
  }
}

【讨论】:

  • 谢谢这很好用。此处未定义的其他场景如何? IE。 'type' 是一个意外的值?
  • 阅读了 javadoc,我应该使用 @RequestMapping({}) 来进行其他未定义的请求映射。 :)
【解决方案2】:

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

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

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

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

您需要将 URL 更改为 /type/1/... 等,但随后您将能够访问其他变量作为方法参数。阅读 Spring 文档中的整个 MVC 页面以了解其他想法。祝你好运!

【讨论】:

    【解决方案3】:

    我发现这是一个很好的枚举用例:

    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);
    

    【讨论】:

      猜你喜欢
      • 2011-07-13
      • 2013-10-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-01
      相关资源
      最近更新 更多