Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Spring、MVC和重用模型部分的策略_Java_Spring_Spring Mvc - Fatal编程技术网

Java Spring、MVC和重用模型部分的策略

Java Spring、MVC和重用模型部分的策略,java,spring,spring-mvc,Java,Spring,Spring Mvc,我正在努力理解什么是重用某些代码的最佳策略。通常,我在Spring中的控制器为: @Controller public class PageX1{ @Autowired HeaderService header; @Autowired CatalogService catalog; @RequestMapping("/test1") public String controller(Map<String, Object> model) {

我正在努力理解什么是重用某些代码的最佳策略。通常,我在Spring中的控制器为:

@Controller
public class PageX1{
  @Autowired
  HeaderService header;

  @Autowired
  CatalogService catalog;

  @RequestMapping("/test1")
  public String controller(Map<String, Object> model)  {             

    setHeaderObjectsIntoModel(model, "a param");
    setCatalogObjectsInyoModel(model, "another param", 1212, "more params");
  }

   private setHeaderObjectsIntoModel(Map<String, Object> model, String aParam){
     Object value = header.getObjectWithParam(aParam);
     model.put("key", value);  
   }

   ....
}
@控制器
公共类第1页{
@自动连线
HeaderService头;
@自动连线
目录服务目录;
@请求映射(“/test1”)
公共字符串控制器(映射模型){
setHeaderObjectsIntoModel(模型,“参数”);
setCatalogObjectsInyoModel(模型,“另一个参数”,1212,“更多参数”);
}
私有SetHeaderObject对象模型(映射模型,字符串APRAM){
对象值=header.getObjectWithParam(aParam);
模型。put(“键”,值);
}
....
}
我可能需要在另一个控制器中重用与服务S1相关的部件,例如

@Controller
public class PageX2{
  @Autowired
  HeaderService s;

  @RequestMapping("/test2")
  public String controller(Map<String, Object> model)  {
    setHeaderObjectsIntoModel(model, "a new param");
  }
}
@控制器
公共类第2页{
@自动连线
校长服务;
@请求映射(“/test2”)
公共字符串控制器(映射模型){
setHeaderObjectsIntoModel(模型,“一个新参数”);
}
}
S2也是一样,一次又一次。 我不想重复代码。我有一些想法,但我认为没有什么好的(比如有一个用
@Component
注释的类,该类实现了一个旨在处理模型的接口,但我应该使参数通用,并且我希望使其特定以最小化错误)

正确的方法应该是什么?
任何例子都非常受欢迎

您有两个选择。第一个选项,您可以拥有一个基本控制器,该控制器提供将由您的控制器继承的通用功能

public abstract class AbstractPage{

   @Autowired
   private HeaderService s;

   protected Object retrieveObjectWithParam(String param){
      return s.getObjectWithParam(param);
   }
}

@Controller
public class PageX1 extends AbstractPage{

  @RequestMapping("/test1")
  public String controller(Map<String, Object> model)  { 
    Object headerParam = retrieveObjectWithParam("a param");
    model.put("key" , headerParam);
  }
}
@ControllerAdvice
public class PageAdvice{

    @Autowired
    private HeaderService s;

   @ModelAttribute("headerParam")
   public Object retriveHeaderParm(){
      return s.getObjectWithParam("a param");
   }
}

你想在多个控制器之间共享模型属性吗?这是可能的,想想标题上的类别吧。我没有回答你的问题,还有,回答我的评论。你想在不同的控制器之间共享一些模型参数吗?我想你需要提供一个更具体的例子;很难确切地说出您要重用哪种代码。头服务?这个问题仍然太模糊,难以清楚地解决。您可能对带有
@modeldattribute
@ControllerAdvice
或类似Groovy traits的东西感兴趣。很抱歉,我不得不在工作中完成一些代码。因此,控制器建议解决方案非常好。我想知道如何将参数传递给使用@ModelAttribute的方法,以便根据当前控制器计算值