问题解决了,谢谢你们;)我编写了代码,看到了底部
我是一个Spring新手,我对使用我已经通过Spring MVC中的不同控制器创建的对象感到有点困惑。我写了一个简单的项目,允许用户插入一些汽车的详细信息(品牌,型号和车牌号),并查看提交的记录列表(加上重置所有操作和选择性删除单个记录)。现在我也想编辑记录的值,但事情对我来说很难......
VeicoloController.java
@Controller
@RequestMapping("/veicolo")
@SessionAttributes("veicoli")
public class VeicoloController {
@Autowired VeicoloValidator veicoloValidator;
@GetMapping({"", "lista"})
public String lista() {
return "/veicolo/lista_veicoli";
}
@GetMapping("inserisci_veicolo")
public ModelAndView inserisci(){
return new ModelAndView("veicolo/inserisci_veicolo", "modelVeicolo", new Veicolo());
}
@PostMapping("save")
public ModelAndView salvaVeicolo(@ModelAttribute("modelVeicolo") Veicolo veicolo, BindingResult bindingResult,Model model)
{
System.out.println("Veicolo = " + veicolo);
veicoloValidator.validate(veicolo, bindingResult);
if (bindingResult.hasErrors()){
return new ModelAndView("veicolo/inserisci_veicolo");
}
else{
Set<Veicolo> veicoli;
if (!model.containsAttribute("veicoli")){
veicoli = new HashSet<>();
model.addAttribute("veicoli", veicoli);
}
else{
veicoli = (Set<Veicolo>) model.asMap().get("veicoli");
}
veicoli.add(veicolo);
return new ModelAndView("veicolo/lista_veicoli");
}
}
现在,这里有我有问题的控制器:
我使用此控制器编辑行,使用车牌号作为唯一元素来检索特定车辆对象并通过查询字符串从jsp传递(我稍后会显示)。通过这种方式,我可以在编辑表格中显示车辆属性(并隐藏无法修改的车牌号码)
@GetMapping("modifica")
public ModelAndView modificaVeicolo(@RequestParam("targa")String targa, Model model){
Set<Veicolo> veicoli = (Set<Veicolo>)model.asMap().get("veicoli");
Veicolo veicoloMod = null;
for(Veicolo v:veicoli){
if(v.getTarga().equalsIgnoreCase(targa)){
veicoloMod = v;
break;
}
model.addAttribute(veicoloMod);
}
return new ModelAndView("veicolo/modifica_veicolo", "modelVeicolo", veicoloMod);
}
这就是我尝试更新控制器的方法,我真的不知道如何使用我之前控制器中的对象给我(我想)我需要的所有汽车信息
@PostMapping("update")
public ModelAndView updateVeicolo(@ModelAttribute("modelVeicolo")Veicolo veicolo, BindingResult bindingResult,Model model)
{
// Veicolo veicoloToUpdate = (Veicolo)model.asMap().get("veicoli");
veicoloValidator.validate(veicolo, bindingResult);
if (bindingResult.hasErrors())
{
return new ModelAndView("veicolo/modifica_veicolo");
}
else
{
Set<Veicolo> veicoli =(Set<Veicolo>)model.asMap().get("veicoli");
veicoli.add(veicolo);
}
return new ModelAndView("veicolo/lista_veicoli");
}
modifica_veicolo.jsp
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<%@taglib prefix="form" uri="http://www.springframework.org/tags/form"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Modifica il veicolo</title>
</head>
<body>
<h1>Modifica il veicolo</h1>
<br>
<br>
<form:form method="POST" action="${pageContext.request.contextPath}/veicolo/update" commandName="modelVeicolo" ModelAttribute="modelVeicolo">
<table>
<tr>
<p class="errorLine">
<form:errors path="marca" cssStyle="color: #ff0000"/>
</p>
<td><form:label path="marca">Marca</form:label></td>
<td><form:input path="marca" /></td>
</tr>
<tr>
<p class="errorLine">
<form:errors path="modello" cssStyle="color: #ff0000"/>
</p>
<td><form:label path="modello">Modello</form:label></td>
<td><form:input path="modello"/></td>
</tr>
<td><form:input type="hidden" path="targa" value="${veicolo.targa}" /></td>
<tr>
<td colspan="3">
<input type="submit" value="Submit"/>
</td>
</tr>
</table>
</form:form>
<br>
<br>
<a href="${pageContext.request.contextPath}/">Torna alla Home</a>
</body>
</html>
和lista_veicoli.jsp(从列表中可以编辑记录)
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Lista veicoli</title>
</head>
<body>
<h1>Lista Veicoli</h1>
<br>
<br>
<c:if test="${veicoli == null || veicoli.isEmpty()}">
Nessun veicolo registrato.
</c:if>
<div> </div>
<table>
<thead>
<tr>
<th>| Marca </th>
<th>| Modello |</th>
<th> Targa |</th>
</tr>
</thead>
<c:forEach var="veicolo" items="${veicoli}">
<tr>
<td>
${veicolo.marca}
</td>
<td>
${veicolo.modello}
</td>
<td>
${veicolo.targa}
</td>
<td>
<a href="${pageContext.request.contextPath}/veicolo/modifica?targa=${veicolo.targa}" > modifica </a>
</td>
<td>
<a href="${pageContext.request.contextPath}/veicolo/rimuovi?targa=${veicolo.targa}" > elimina </a>
</td>
</tr>
</c:forEach>
</table>
<br>
<br>
<p><a href="${pageContext.request.contextPath}/">Torna alla Home</a> |</p>
<p><a href="${pageContext.request.contextPath}/veicolo/reset">Cancella Lista</a> |</p>
<p><a href="${pageContext.request.contextPath}/veicolo/inserisci_veicolo">Inserisci un altro veicolo</a> |</p>
</body>
</html>
我现在陷入困境,如果我点击更新按钮什么都没发生,我怀疑事情可以做得比这更好。我需要你的帮助:'(
另外,很抱歉这篇长篇文章!
编辑: 好吧,我改变了这个控制器,它似乎工作,但只插入第一个记录!
@PostMapping("update")
public ModelAndView updateVeicolo(@ModelAttribute("modelVeicolo")Veicolo veicolo,
BindingResult bindingResult,Model model)
{
veicoloValidatorNoTarga.validate(veicolo, bindingResult);
if (bindingResult.hasErrors())
{
return new ModelAndView("veicolo/modifica_veicolo");
}
else
{
Set<Veicolo> veicoli =(Set<Veicolo>)model.asMap().get("veicoli");
Veicolo daInserire = veicolo;
Veicolo daRimuovere = null;
for(Veicolo v : veicoli)
{
if(v.getTarga().equalsIgnoreCase(veicolo.getTarga())){
daRimuovere = v;
break;
}
}
veicoli.remove(daRimuovere);
veicoli.add(daInserire);
}
return new ModelAndView("veicolo/lista_veicoli");
}
如果我想编辑该集合的第二个或更多元素,则会发生异常。它说“HTTP状态500 - 请求处理失败;嵌套异常是java.lang.IllegalArgumentException:模型对象不能为空”。 实际上在线路上的modificaVeicolo控制器
for(Veicolo v:veicoli){
if(v.getTarga().equalsIgnoreCase(targa)){
veicoloMod = v;
break;
}
targa值是第二辆或第三辆(等)汽车的正确值,但v具有第一辆汽车牌照的价值!理论上它应该具有所选汽车的价值 ......有什么建议吗?
答案 0 :(得分:1)
关键点::如果您选择使用存储对象的HashSet,则Class必须覆盖equals和hashcode!
1.Veicolo.java
覆盖equlas和hashcode
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Veicolo veicolo = (Veicolo) o;
return targa.equals(veicolo.getTarga());
}
@Override
public int hashCode() {
final int PRIME = 31;
int result = 1;
result = PRIME * result + getTarga().hashCode();
return result;
}
2.VeicoloController.updateVeicolo()
更新对象删除并添加
@PostMapping("update")
public ModelAndView updateVeicolo(@ModelAttribute("modelVeicolo") Veicolo veicolo, BindingResult bindingResult,
Model model) {
// Veicolo veicoloToUpdate = (Veicolo)model.asMap().get("veicoli");
veicoloValidator.validate(veicolo, bindingResult);
if (bindingResult.hasErrors()) {
return new ModelAndView("veicolo/modifica_veicolo");
} else {
Set<Veicolo> veicoli = (Set<Veicolo>) model.asMap().get("veicoli");
if (veicoli.contains(veicolo)) {
veicoli.remove(veicolo);
veicoli.add(veicolo);
}
}
return new ModelAndView("veicolo/lista_veicoli");
}
3.VeicoloController.modificaVeicolo()
将model.addAttribute移动到循环
中
@GetMapping("modifica")
public ModelAndView modificaVeicolo(@RequestParam("targa") String targa, Model model) {
Set<Veicolo> veicoli = (Set<Veicolo>) model.asMap().get("veicoli");
Veicolo veicoloMod = null;
for (Veicolo v : veicoli) {
if (v.getTarga().equalsIgnoreCase(targa)) {
veicoloMod = v;
model.addAttribute(veicoloMod);
break;
}
}
return new ModelAndView("veicolo/modifica_veicolo", "modelVeicolo", veicoloMod);
}