故事
我有一个表示用户访问级别的select控件。我正在寻找一种国际化的方法。应该从消息资源加载标签,并且应该按原样使用该值。我使用一个带有标签和值属性的简单SelectOption类在控制器中准备我的所有下拉列表。这样,我的选择看起来与所有jsp的一致。
问题
我找到了一些例子,但它们基于jsp中的逻辑。开发人员遍历他的标签并使用消息资源手动构造选项标签。虽然这有效,但必须有更好的方法。我还发现了一些评论,即Spring 3将支持选项标签的国际化,但我找不到具体的内容。
控制器逻辑
Collection<SelectOption> optionList = new ArrayList<SelectOption>();
optionList.add(new SelectOption("-SELECT-", "-"));
optionList.add(new SelectOption("Administrator", "ADMIN"));
optionList.add(new SelectOption("Editor", "EDIT"));
bean.setFilterUserAccessLevelOptionList(optionList);
JSP逻辑
<form:select path="filterUserAccessLevel" items="${bean.filterUserAccessLevelOptionList}" itemLabel="label" itemValue="value"/>
问题
=== 2012-01-15 ==================================== ==========================
仍然试图使用一个让我们的想法来解决问题。
控制器
@Controller
public class UserController {
@Autowired
private UserService userService;
@Autowired
SelectOptionListBuilder listBuilder;
@RequestMapping("/userIndex/{pageNumber}")
public ModelAndView getUserList(@PathVariable Integer pageNumber, @ModelAttribute("userIndexBean") UserIndexBean phantomBean, Locale locale, Model model) {
UserIndexBean bean = new UserIndexBean();
// prepare filter form
Collection<SelectOption> optionList = listBuilder.getUserAccessLevelOptionList(true, SortOrder.NONE, locale);
bean.setFilterUserAccessLevelOptionList(optionList);
SelectOptionListBuilderImpl
@Component
public class SelectOptionListBuilderImpl implements SelectOptionListBuilder, MessageSourceAware {
private MessageSource messageSource;
@Override
public void setMessageSource(MessageSource messageSource) {
this.messageSource = messageSource;
}
@Override
public List<SelectOption> getUserAccessLevelOptionList(boolean addSelectPrompt, SortOrder sortOrder, Locale locale) {
List<SelectOption> optionList = new ArrayList<SelectOption>();
if(addSelectPrompt) {
optionList.add(new SelectOption(messageSource.getMessage("common.selectPromptLabel", null, locale), "-"));
}
messageSource mapping
<bean id="messageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
<property name="basename" value="/WEB-INF/i18n/messages" />
<property name="defaultEncoding" value="UTF-8"/>
<property name="UseCodeAsDefaultMessage" value="true"/>
</bean>
异常
org.springframework.context.NoSuchMessageException: No message found under code 'common.selectPromptLabel' for locale 'en_CA'
答案 0 :(得分:1)
当我需要在jsp之外的Controller中进行这样的操作时,我一直在制作我的Controllers MessageSourceAware。然后Spring会在交换时注入一个新的MessageSource,你可以像Spring那样查询它。在您的示例中,您将执行以下操作:
@Controller
public class someController implements MessageSourceAware {
private MessageSource messageSource;
@Override
public void setMessageSource(MessageSource messageSource) {
this.messageSource = messageSource;
}
@RequestMapping
// Pass in the locale from the LocaleResolver
public void someMapping(Locale locale){
optionList.add(new SelectOption(
messageSource.getMessage("userAccessLevelAdministratorLabel", null, locale),
"ADMIN"))
}
}
答案 1 :(得分:1)
看一下spring roo项目。他们通过创建tagx
标记来解决此类问题。这个标签执行你已经描述的标签(它包含一个litte逻辑来加载来自ressources的消息并构建选项标签)。但是因为逻辑只有一次,你可以在jspx
文件中使用像普通标签这样的标签,感觉就像一个标签,可以做你想要的。