【问题标题】:How to set variable name of controller class so that all modelview can access that variable value?如何设置控制器类的变量名,以便所有模型视图都可以访问该变量值?
【发布时间】:2016-04-22 05:32:39
【问题描述】:

我在我的 wab 站点中使用 Spring-Mvc,用户可以在其中更改我的语言 项目运行良好我只需要改进我的编码我不需要 对spring-mvc了解太多

我的控制器类的源代码如下

@Controller
public class ContentController {

    @RequestMapping("/index")
    public ModelAndView sriWap(){

        Locale locale2 = LocaleContextHolder.getLocale();
        String lang_name = locale2.getDisplayLanguage();

        ModelAndView modelAndView = new ModelAndView();
        modelAndView.addObject("language",lang_name);
        modelAndView.setViewName("sriWap");
        return modelAndView;
    }

    @RequestMapping("/contentCat")
    public ModelAndView content_cat_desc(){
    Locale locale2 = LocaleContextHolder.getLocale();
        String lang_name = locale2.getDisplayLanguage();

        ModelAndView modelAndView = new ModelAndView();
        modelAndView.addObject("language",lang_name);
        modelAndView.setViewName("content_cat_desc");
        return modelAndView;
    }
    @RequestMapping("/content")
    public ModelAndView content(){
    Locale locale2 = LocaleContextHolder.getLocale();
        String lang_name = locale2.getDisplayLanguage();

        ModelAndView modelAndView = new ModelAndView();
        modelAndView.addObject("language",lang_name);
        modelAndView.setViewName("content");
        return modelAndView;
    }

}

如您所见,我在所有方法中编写相同的代码来获取 选择的语言

Locale locale2 = LocaleContextHolder.getLocale();
String lang_name = locale2.getDisplayLanguage();

我不想在上面写的所有方法中都写上面的代码 只编码一次,以便所有方法都可以使用 'lang_name'

【问题讨论】:

    标签: java spring spring-mvc model-view-controller local


    【解决方案1】:

    你的权利,在 spring 中哪里是一种简单的方法,它可以防止代码在你的控制器请求方法中重复。你在找@ModelAttribute关于一个方法:http://docs.spring.io/autorepo/docs/spring/current/spring-framework-reference/html/mvc.html#mvc-ann-modelattrib-methods

    因此,您必须将此代码重复提取到单个方法中,并使用 @ModelAttribute 进行注释,如下所示:

    @ModelAttribute("language")
    public String getLocaleLanguage() {
        Locale locale = LocaleContextHolder.getLocale();
        return locale.getDisplayLanguage();
    }
    

    当其他 @Controllers 也需要这种“语言”@ModelAttribute 时,您希望将其提取到 @ControllerAdvice

    【讨论】:

    • @ControllerAdvice 共享数据是可接受的方法。但是使用@ModelAttribute 方法创建父类要容易得多,并从该父类继承所有控制器。
    【解决方案2】:

    你可以使用@ModelAttribute注解。

    @Controller
    public class ContentController {
    
        @ModelAttribute
        public void addCommon(Model model){
            Locale locale2 = LocaleContextHolder.getLocale();
            String lang_name = locale2.getDisplayLanguage(); 
            model.addAttribute("language",lang_name);       
    
            //... add another common attributes
        }
    
        @RequestMapping("/index")
        public ModelAndView sriWap(){
            return new ModelAndView("sriWap");
        }
    
        ....
    }
    

    Spring 会自动为每个映射方法的模型添加"language" 属性。

    【讨论】:

      【解决方案3】:

      您可以将属性作为实例变量并使用 init 方法来初始化它的值。

       @PostConstruct
       public void init() {
       locale2 = LocaleContextHolder.getLocale();
       lang_name = locale2.getDisplayLanguage();     
       }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2022-08-16
        • 2015-06-25
        • 2015-09-20
        • 2021-11-27
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多