如何设置控制器类的变量名,以便所有模型视图都可以访问该变量值?

时间:2016-04-22 05:32:40

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

我在我的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'

3 个答案:

答案 0 :(得分:2)

您的权利,春天的简单方法,可以防止您的控制器请求方法中的代码重复。您正在寻找有关方法的@ModelAttributehttp://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();
}

当这个"语言"您希望将其提取到@ModelAttribute

的其他@Controllers也需要@ControllerAdvice

答案 1 :(得分:1)

您可以使用@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"属性。

答案 2 :(得分:0)

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

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