Spring mvc - 如何在不同的控制器中使用或发送相同的对象?

时间:2017-06-08 21:08:45

标签: java spring jsp spring-mvc

问题解决了,谢谢你们;)我编写了代码,看到了底部

我是一个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>&nbsp;</div>    

        <table>
            <thead>
                <tr>
                    <th>| Marca </th>
                    <th>| Modello |</th>
                    <th> Targa |</th>
                        &nbsp;
                        &nbsp;
              
                </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具有第一辆汽车牌照的价值!理论上它应该具有所选汽车的价值 ......有什么建议吗?

1 个答案:

答案 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);
}