Используйте flex-box на контейнере, который будет содержать как 'form', так и '.stuff' div.
Используйте justify-content для выравнивания контента в соответствии с вашими потребностями. Проверьте включенный фрагмент кода.
#border {
border: 5px solid #101010;
background-color: white;
position: relative;
margin: auto;
width: 700px;
padding: 0px 15px 0px 15px;
}
.block {
position: relative;
border: 1px solid black;
border-style: none none solid none;
padding: 0px 0px 10px 0px;
overflow-x: hidden;
overflow-y: auto;
}
.flex-container
{
display: flex;
justify-content: space-between;
}
.stuff {
border: 2px solid black;
margin: 0% 0% 0% 0%;
right: 10px;
bottom: 0;
line-height: 0;
}
form {
margin: 0% 0% 5px 0%;
border: 2px solid black;
float: left;
}
<div id="border">
<div class="block">
<h3>header1</h3>
<div class="flex-container">
<form>
<input name="A" type ="radio">1<br>
<input name="A" type ="radio">2<br>
<input name="A" type ="radio">3
</form>
<div class="stuff">
<h4>stuff</h4>
<input type="range" min="0" max="100" value="50">
<input type="checkbox">Check
</div>
</div>
</div>
<div class="block">
<h3>header2</h3>
<div class="flex-container">
<form>
<input name="B" type ="radio">1<br>
<input name="B" type ="radio">2<br>
<input name="B" type ="radio">3<br>
<input name="B" type ="radio">4<br>
<input name="B" type ="radio">5
</form>
<div class="stuff">
<h4>stuff</h4>
<input type="range" min="0" max="100" value="50">
<input type="checkbox">Check
</div>
</div>
<div class="block">
<h3>header3</h3>
<div class="flex-container">
<form>
<input name="C" type ="radio">this is a really really really really really really really really really really really long line
</form>
<div class="stuff">
<h4>stuff</h4>
<input type="range" min="0" max="100" value="50">
<input type="checkbox">Check
</div>
</div>
</div>
</div>
Ключом ко всему этому этого является PropertyEditor.
Необходимо определить PropertyEditor для класса Завтрака и затем настроить ServletDataBinder с помощью registerCustomEditor в initBinder методе контроллера.
пример:
public class BreakfastPropertyEditor extends PropertyEditorSupport{
public void setAsText(String incomming){
Breakfast b = yourDao.findById( Integer.parseInt(incomming));
setValue(b);
}
public String getAsText(){
return ((Breakfast)getValue()).getId();
}
}
обратите внимание необходимость в некоторой пустой проверке и т.д. но Вы получаете идею. В Вашем контроллере:
public BreakfastFooBarController extends SimpleFormController {
@Override
protected void initBinder(HttpServletRequest request, ServletRequestDataBinder binder) {
binder.registerCustomEditor(Breakfast.class, new BreakfastPropertyEditor(yourDao));
}
}
вещи не упустить:
надеюсь, это поможет.
Редактирование (в ответ на комментарий): Это выглядит немного странным в данном примере, потому что BreakfastSelectCommand не похож на объект, я не уверен, каков фактический сценарий, который Вы имеете. Скажите, что это - объект, например, как Person
с a breakfast
свойство затем formBackingObject()
метод загрузил бы объект Человека из PersonDao
и возвратите его как команду. Обязательная фаза затем изменила бы свойство завтрака в зависимости от выбранного значения, такого, что команда, которая прибывает в onSubmit
имеет свойство завтрака все настроенные.
В зависимости от реализации Ваших объектов ДАО, называя их дважды или пытаясь загрузить тот же объект дважды на самом деле не означает, что Вы получите два выполняемые SQL-оператора. Это применяется особенно для Спящего режима, где это гарантирует, что возвратит тот же объект, который находится в, он - сессия для данного идентификатора, таким образом выполняя разрешение обязательной попытке загрузиться Breakfast
выбор даже через него не изменился, не должен приводить ни к каким неуместным издержкам.