我想提交一个包含reflexive
列的表单:
@RequestMapping(value = "/ajaxElaborationActivite", method = RequestMethod.GET)
@ResponseBody
public ModelAndView ajaxElaborationActivite(HttpServletRequest request, HttpSession session) {
ModelAndView modelView = new ModelAndView("elaboration/elaborationActivite");
Integer pta_pta_code = Integer.parseInt(request.getParameter("pta_pta_code"));
modelView.addObject("action", request.getContextPath().concat("/elaboration/insertActivite"));
modelView.addObject("responsables", structureDao.list());
Pta activite = new Pta();
activite.setParent(ptaDao.get(pta_pta_code));
activite.setOwner(Integer.parseInt(String.valueOf(session.getAttribute("user_code"))));
modelView.addObject("activite_formulaire", activite);
return modelView;
}
实体:
@Entity
@Table(name = "pta")
public class Pta {
@Id()
@SequenceGenerator(name="s_pta", sequenceName="s_pta", allocationSize=1)
@GeneratedValue(strategy=GenerationType.SEQUENCE, generator="s_pta")
@Column(name="pta_code")
private Integer code;
@Column(name="pta_intitule")
@Lob
private String lib;
@Column(name="pta_desc")
@Lob
private String descr;
@Column(name="owner")
private Integer owner;
@Column(name="creation")
@DateTimeFormat(pattern = "dd/MM/yyyy")
private Date creation;
@Column(name="modification")
@DateTimeFormat(pattern = "dd/MM/yyyy")
private Date modification;
@ManyToOne
@JoinColumn(name = "class_pta_code")
private ClassePta classePta;
@ManyToOne
@JoinColumn(name = "pta_pta_code")
private Pta parent;
@ManyToOne
@JoinColumn(name = "struct_code")
private Structure structure;
@ManyToOne
@JoinColumn(name = "exer_code")
private Exer exercice;
@ManyToOne
@JoinColumn(name = "cdmt_code")
private Cdmt cdmt;
@ManyToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
@JoinTable(name = "pta_pnd" , joinColumns = {@JoinColumn(name = "pta_code")} , inverseJoinColumns = {@JoinColumn(name = "pnd_code")} )
private Set<Pnd> pnds = new HashSet<Pnd>();
@ManyToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
@JoinTable(name = "pta_programme" , joinColumns = {@JoinColumn(name = "pta_code")} , inverseJoinColumns = {@JoinColumn(name = "prog_code")} )
private Set<Pmo> pmos = new HashSet<Pmo>();
@ManyToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
@JoinTable(name = "pta_effet_pmo" , joinColumns = {@JoinColumn(name = "pta_code")} , inverseJoinColumns = {@JoinColumn(name = "obj_code")} )
private Set<Objectif> effets_pmo = new HashSet<Objectif>();
@ManyToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
@JoinTable(name = "pta_produit_pmo" , joinColumns = {@JoinColumn(name = "pta_code")} , inverseJoinColumns = {@JoinColumn(name = "obj_code")} )
private Set<Objectif> produits_pmo = new HashSet<Objectif>();
@ManyToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
@JoinTable(name = "pta_objectif_ddp" , joinColumns = {@JoinColumn(name = "pta_code")} , inverseJoinColumns = {@JoinColumn(name = "obj_code")} )
private Set<Objectif> ddps = new HashSet<Objectif>();
public Pta() {
super();
}
public Pta(Integer code) {
super();
}
// getters and setters
}
形式:
<form:form cssClass="form-horizontal" servletRelativeAction="${action}" method="post" commandName="activite_formulaire">
<form:hidden path="code"/>
<form:hidden path="parent"/>
<form:hidden path="owner"/>
<div class="form-group col-sm-12">
<label class="col-sm-3 control-label">Code</label>
<div class="col-sm-9">
<form:input path="lib" cssClass="validate[required] col-sm-4" />
</div>
</div>
<div class="form-group col-sm-12">
<label class="col-sm-3 control-label">Libellé</label>
<div class="col-sm-9">
<form:textarea path="descr" cssClass="validate[required] col-sm-9" style="padding-left: 1px;" />
</div>
</div>
<div class="form-group col-sm-12">
<label class="col-sm-3 control-label">Responsable</label>
<div class="col-sm-9">
<form:select path="structure" cssClass="col-sm-4">
<form:option value="" label=" -- Sélectionner -- "/>
<form:options items="${responsables}" itemValue="code" itemLabel="lib" />
</form:select>
</div>
</div>
</form:form>
<script type="text/javascript">
$(document).ready(function() {
$("#activite_formulaire").validationEngine();
});
</script>
以下是处理帖子的方法:
@RequestMapping(value = "/insertActivite", method = RequestMethod.POST)
public ModelAndView insertActivite(@ModelAttribute("activite_formulaire") Pta pta, @RequestParam String structure, @RequestParam String parent,
HttpServletRequest request, HttpSession session) {
if (session.getAttribute("user_code") != null) { // test session expirée , ou utilisateur non connecté
Integer pta_code = ptaDao.insert(pta, exerDao.getExerciceEncours().getExerCode(), structure, "", 2, Integer.parseInt(parent));
// trace
Menu menuEncours = menuDao.getMenuTrace(request.getServletPath());
menuEncours.setEnv(env);
String trace_txt = env.getProperty("pta.trace.ajout.activite");
trace_txt = trace_txt.replace("%s", pta.getLib());
menuDao.insertTrace(String.valueOf(session.getAttribute("user_code")), menuEncours.getId(), trace_txt);
// fin trace
ModelAndView modelView = new ModelAndView("redirect:/elaboration/");
return modelView;
} else {
ModelAndView modelView = new ModelAndView("redirect:/");
modelView.addObject("es", "1");
return modelView;
}
}
在运行时,我得到:The request sent by the client was syntactically incorrect
那有什么不对?
答案 0 :(得分:0)
我找到了:解决方案是不在控制器中设置父级,但只是将数据传递给JSP:
_
所以在JSP中:
@RequestMapping(value = "/ajaxElaborationActivite", method = RequestMethod.GET)
@ResponseBody
public ModelAndView ajaxElaborationActivite(HttpServletRequest request, HttpSession session) {
ModelAndView modelView = new ModelAndView("elaboration/elaborationActivite");
Integer pta_pta_code = Integer.parseInt(request.getParameter("pta_pta_code"));
modelView.addObject("action", request.getContextPath().concat("/elaboration/insertActivite"));
modelView.addObject("responsables", structureDao.list());
Pta activite = new Pta();
activite.setOwner(Integer.parseInt(String.valueOf(session.getAttribute("user_code"))));
modelView.addObject("parent", pta_pta_code); // here it is
modelView.addObject("activite_formulaire", activite);
return modelView;
}
在控制器处理表单提交的方法中:
<form:form cssClass="form-horizontal" servletRelativeAction="${action}" method="post" commandName="activite_formulaire">
<form:hidden path="code"/>
<input type="hidden" name="ascendant" value="${parent}"/> // here it is , it is mandatory to set the input name to be different to the entity's attribute name
<form:hidden path="owner"/>
<fieldset id="resume"><legend>Résumé du PTA</legend>
<div class="form-group col-sm-12">
<label class="col-sm-3 control-label">Intitulé</label>
<div class="col-sm-9">
<span class="col-sm-12">${fieldset.lib}</span>
</div>
</div>
</fieldset>
<div class="form-group col-sm-12">
<label class="col-sm-3 control-label">Code</label>
<div class="col-sm-9">
<form:input path="lib" cssClass="validate[required] col-sm-4" style="padding-left: 1px;" />
</div>
</div>
<div class="form-group col-sm-12">
<label class="col-sm-3 control-label">Libellé</label>
<div class="col-sm-9">
<form:textarea path="descr" cssClass="validate[required] col-sm-9" style="padding-left: 1px;" />
</div>
</div>
<div class="form-group col-sm-12">
<label class="col-sm-3 control-label">Responsable</label>
<div class="col-sm-9">
<form:select path="structure" cssClass="col-sm-4">
<form:option value=""/>
<form:options items="${responsables}" itemValue="code" itemLabel="lib" />
</form:select>
</div>
</div>
</form:form>