Ответ 1
Spring имеет мощный встроенный StringUtils класс
Обратите внимание на следующий массив, содержащий набор id
String [] idArray = new String [] {"0", "1", "2", "0", "5", "2"}
И вы хотите удалить дубликаты ссылок. Просто сделайте это
idArray = StringUtils.removeDuplicateStrings(idArray);
Теперь idArray будет содержать { "0", "1", "2", "5" }.
И многое другое.
Можно ли использовать класс Controller без объявления их в файле контекста веб-приложения?
Да, просто поместите @Component в его объявление (@Controller не работает должным образом)
package br.com.spring.view.controller
@Component
public class PlayerController extends MultiActionController {
private Service service;
@Autowired
public PlayerController(InternalPathMethodNameResolver ipmnr, Service service) {
this.service = service;
setMethodNameResolver(ipmnr);
}
// mapped to /player/add
public ModelAndView add(...) {}
// mapped to /player/remove
public ModelAndView remove(...) {}
// mapped to /player/list
public ModelAndView list(...) {}
}
Итак, в файле контекста веб-приложения введите
<beans ...>
<context:component-scan base-package="br.com.spring.view"/>
<context:annotation-config/>
<bean class="org.springframework.web.servlet.mvc.support.ControllerClassNameHandlerMapping">
<property name="order" value="0"/>
<property name="caseSensitive" value="true"/>
</bean>
<bean class="org.springframework.web.servlet.mvc.multiaction.InternalPathMethodNameResolver"/>
</beans>
Больше ничего
Проверка в динамических формах?
Используйте следующие
public class Team {
private List<Player> playerList;
}
Итак, в Team validator поставьте
@Component
public class TeamValidator implements Validator {
private PlayerValidator playerValidator;
@Autowired
public TeamValidator(PlayerValidator playerValidator) {
this.playerValidator = playerValidator;
}
public boolean supports(Class clazz) {
return clazz.isAssignableFrom(Team.class);
}
public void validate(Object command, Errors errors) {
Team team = (Team) command;
// do Team validation
int index = 0;
for(Player player: team.getPlayerList()) {
// Notice code just bellow
errors.pushNestedPath("playerList[" + index++ + "]");
ValidationUtils.invokeValidator(playerValidator, player, errors);
errors.popNestedPath();
}
}
}
Наследование в веб-формах?
Использовать ServlerRequestDataBinder вместе со скрытым флагом формы
public class Command {
private Parent parent;
}
public class Child extends Parent { ... }
public class AnotherChild extends Parent { ... }
И в вашем контроллере сделайте следующее
public class MyController extends MultiActionController {
public ModelAndView action(HttpServletRequest request, HttpServletResponse response, Object command) {
Command command = (Command) command;
// hidden form flag
String parentChildType = ServletRequestUtils.getRequiredStringParameter(request, "parentChildType");
// getApplicationContext().getBean(parentChildType) retrieves a Parent object from a application context file
ServletRequestDataBinder binder =
new ServletRequestDataBinder(getApplicationContext().getBean(parentChildType));
// populates Parent child object
binder.bind(request);
command.setParent((Parent) binder.getTarget());
}
Spring имеет встроенный класс сканера ClassPathScanningCandidateComponentProvider. Вы можете использовать его для поиска аннотаций, например.
ClassPathScanningCandidateComponentProvider scanner =
new ClassPathScanningCandidateComponentProvider(<DO_YOU_WANT_TO_USE_DEFAULT_FILTER>);
scanner.addIncludeFilter(new AnnotationTypeFilter(<TYPE_YOUR_ANNOTATION_HERE>.class));
for (BeanDefinition bd : scanner.findCandidateComponents(<TYPE_YOUR_BASE_PACKAGE_HERE>))
System.out.println(bd.getBeanClassName());
Spring имеет полезный org.springframework.util.FileCopyUtils класс. Вы можете скопировать загруженный файл с помощью
public ModelAndView action(...) throws Exception {
Command command = (Command) command;
MultiPartFile uploadedFile = command.getFile();
FileCopyUtils.copy(uploadedFile.getBytes(), new File("destination"));
Если вы используете контроллер на основе аннотаций (Spring 2,5+) или простой MVC Spring, вы можете использовать WebBindingInitializer для регистрации глобальных редакторов свойств. Что-то вроде
public class GlobalBindingInitializer implements WebBindingInitializer {
public void initBinder(WebDataBinder binder, WebRequest request) {
binder.registerCustomEditor(Date.class, new CustomDateEditor(new SimpleDateFormat("dd/MM/yyyy", true);
}
}
Итак, в вашем файле контекста веб-приложения объявите
<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
<property name="webBindingInitializer">
<bean class="GlobalBindingInitializer"/>
</property>
</bean>
Таким образом, любой контроллер на основе аннотаций может использовать любой редактор свойств, объявленный в GlobalBindingInitializer.
И так далее...