无法同时使用Spring MVC在HTML中同时正确打印ArrayList和表单

问题描述 投票:0回答:1

我在尝试在同一HTML中同时打印表单和数组时遇到问题。

这是我的用法课堂:


public class usuario {

    private String user_id;
    private String createdAt;
    private String address;
    private String latitude;
    private String longitude;
    private String birthday;
    private String email;
    private String user_idp;
    private ArrayList pedido;
    private String phoneNunmber;
    private Integer edad;
    public String nombre;
    private String confirmationCode;
    private String promotions;

    public String ciudad;

    public String getCiudad() {
        return ciudad;
    }

    public void setCiudad(String ciudad) {
        this.ciudad = ciudad;
    }

    public String getPromotions() {
        return promotions;
    }

    public void setPromotions(String promotions) {
        this.promotions = promotions;
    }

    public String getConfirmationCode() {
        return confirmationCode;
    }

    public void setConfirmationCode(String confirmationCode) {
        this.confirmationCode = confirmationCode;
    }

    public String getNombre() {
        return nombre;
    }

    public void setNombre(String nombre) {
        this.nombre = nombre;
    }

    public Integer getEdad() {
        return edad;
    }

    public void setEdad(Integer edad) {
        this.edad = edad;
    }

    public String getPhoneNunmber() {
        return phoneNunmber;
    }

    public void setPhoneNunmber(String phoneNunmber) {
        this.phoneNunmber = phoneNunmber;
    }

    public String getUser_idp() {
        return user_idp;
    }

    public void setUser_idp(String user_idp) {
        this.user_idp = user_idp;
    }

    public ArrayList getPedido() {
        return pedido;
    }

    public void setPedido(ArrayList pedido) {
        this.pedido = pedido;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public String getBirthday() {
        return birthday;
    }

    public void setBirthday(String birthday) {
        this.birthday = birthday;
    }

    public String getUser_id() {
        return user_id;
    }

    public void setUser_id(String user_id) {
        this.user_id = user_id;
    }

    public String getCreatedAt() {
        return createdAt;
    }

    public void setCreatedAt(String createdAt) {
        this.createdAt = createdAt;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    public String getLatitude() {
        return latitude;
    }

    public void setLatitude(String latitude) {
        this.latitude = latitude;
    }

    public String getLongitude() {
        return longitude;
    }

    public void setLongitude(String longitude) {
        this.longitude = longitude;
    }



}

这是我的控制器代码:

@Controller
public class GreetingController {


    @GetMapping("/allusers")
    public String greetingForm(Model model) throws ParseException{
        tablausuario tu = new tablausuario();
        ArrayList<usuario> user = tu.listausuarios();
        Collections.sort(user, (o1, o2) -> o2.getCreatedAt().compareTo(o1.getCreatedAt())); //tabla ordenada
        model.addAttribute("TodosLosUsuarios", user);        
        return "greeting";
    }

    @PostMapping("/allusers")
    public String greetingSubmit(Model model, HttpServletRequest request, @ModelAttribute usuario users) {
        String ciudad = request.getParameter("ciudad");
        tablausuariofilterbycity tufc = new tablausuariofilterbycity();
        ArrayList<usuario> userbycity = tufc.listausuariosfiltradosporciudad(ciudad);
        model.addAttribute("TodosLosUsuarios", userbycity);
        return "result";
    }

}


这是我的HTML“问候”



        <div class="container">
            <h2>Listado de usuarios </h2> 
            <p th:text=" ${TodosLosUsuarios.size()} "></p>    
            <div id="capa"> </div> 
            <h1>Form</h1>
            <form action="#" th:action="@{/allusers}" th:object="${TodosLosUsuarios}" method="post">
                <p>Message: <input type="text" th:field="*{ciudad}" /></p>
                <p><input type="submit" value="Submit" /> <input type="reset" value="Reset" /></p>
            </form>

            <input type="text" id="myInput" onkeyup="myFunction()" placeholder="Buscar por ciudad..">
            <table id="myTable" class="table table-bordered">
                <thead>
                    <tr>
                        <th>Nombre</th>
                        <th>Email</th>
                        <th>Teléfono</th>
                        <th>Día creado</th>
                        <th>Edad</th>
                        <th>Confirmado</th>
                        <th>Promocion</th>
                        <th>Direccion</th>

                    </tr>
                </thead>
                <tbody  th:each="usuariosTotales: ${TodosLosUsuarios}" >
                    <tr>
                        <td th:text=" ${usuariosTotales.getNombre()} " ></td>
                        <td th:text=" ${usuariosTotales.getEmail()} " ></td>
                        <td th:text=" ${usuariosTotales.getPhoneNunmber()} " ></td>
                        <td th:text=" ${usuariosTotales.getCreatedAt()} " ></td>
                        <td th:text=" ${usuariosTotales.getEdad()} " ></td>
                        <td th:text=" ${usuariosTotales.getConfirmationCode()} " ></td>
                        <td th:text=" ${usuariosTotales.getPromotions()} " ></td>
                        <td th:text=" ${usuariosTotales.getAddress()} " ></td>

                    </tr>

                </tbody>
            </table>
        </div>


    </div>

我确定问题出在以下形式:


    <form action="#" th:action="@{/allusers}" th:object="${TodosLosUsuarios}" method="post">
        <p>Message: <input type="text" th:field="*{ciudad}" /></p>
        <p><input type="submit" value="Submit" /> <input type="reset" value="Reset" /></p>
    </form>

如果不是“用户”,我使用“新用法”


        model.addAttribute("TodosLosUsuarios", user);        

我使用


        model.addAttribute("TodosLosUsuarios", new usuario());        

该窗体有效,但我无法读取ArrayList,但出现此错误:


Caused by: org.attoparser.ParseException: Error during execution of processor 'org.thymeleaf.spring5.processor.SpringInputGeneralFieldTagProcessor' (template: "greeting" - line 10, col 40)
    at org.attoparser.MarkupParser.parseDocument(MarkupParser.java:393)
    at org.attoparser.MarkupParser.parse(MarkupParser.java:257)
    at org.thymeleaf.templateparser.markup.AbstractMarkupTemplateParser.parse(AbstractMarkupTemplateParser.java:230)
    ... 48 more
Caused by: org.thymeleaf.exceptions.TemplateProcessingException: Error during execution of processor 'org.thymeleaf.spring5.processor.SpringInputGeneralFieldTagProcessor' (template: "greeting" - line 10, col 40)
    at org.thymeleaf.processor.element.AbstractAttributeTagProcessor.doProcess(AbstractAttributeTagProcessor.java:117)
    at org.thymeleaf.processor.element.AbstractElementTagProcessor.process(AbstractElementTagProcessor.java:95)
    at org.thymeleaf.util.ProcessorConfigurationUtils$ElementTagProcessorWrapper.process(ProcessorConfigurationUtils.java:633)
    at org.thymeleaf.engine.ProcessorTemplateHandler.handleStandaloneElement(ProcessorTemplateHandler.java:918)
    at org.thymeleaf.engine.TemplateHandlerAdapterMarkupHandler.handleStandaloneElementEnd(TemplateHandlerAdapterMarkupHandler.java:260)
    at org.thymeleaf.templateparser.markup.InlinedOutputExpressionMarkupHandler$InlineMarkupAdapterPreProcessorHandler.handleStandaloneElementEnd(InlinedOutputExpressionMarkupHandler.java:256)
    at org.thymeleaf.standard.inline.OutputExpressionInlinePreProcessorHandler.handleStandaloneElementEnd(OutputExpressionInlinePreProcessorHandler.java:169)
    at org.thymeleaf.templateparser.markup.InlinedOutputExpressionMarkupHandler.handleStandaloneElementEnd(InlinedOutputExpressionMarkupHandler.java:104)
    at org.attoparser.HtmlElement.handleStandaloneElementEnd(HtmlElement.java:79)
    at org.attoparser.HtmlMarkupHandler.handleStandaloneElementEnd(HtmlMarkupHandler.java:241)
    at org.attoparser.MarkupEventProcessorHandler.handleStandaloneElementEnd(MarkupEventProcessorHandler.java:327)
    at org.attoparser.ParsingElementMarkupUtil.parseStandaloneElement(ParsingElementMarkupUtil.java:96)
    at org.attoparser.MarkupParser.parseBuffer(MarkupParser.java:706)
    at org.attoparser.MarkupParser.parseDocument(MarkupParser.java:301)
    ... 50 more
Caused by: org.springframework.beans.NotReadablePropertyException: Invalid property 'ciudad' of bean class [java.util.ArrayList]: Bean property 'ciudad' is not readable or has an invalid getter method: Does the return type of the getter match the parameter type of the setter?
    at org.springframework.beans.AbstractNestablePropertyAccessor.getPropertyValue(AbstractNestablePropertyAccessor.java:622)
    at org.springframework.beans.AbstractNestablePropertyAccessor.getPropertyValue(AbstractNestablePropertyAccessor.java:612)
    at org.springframework.web.servlet.support.BindStatus.<init>(BindStatus.java:158)
    at org.springframework.web.servlet.support.RequestContext.getBindStatus(RequestContext.java:903)
    at org.thymeleaf.spring5.context.webmvc.SpringWebMvcThymeleafRequestContext.getBindStatus(SpringWebMvcThymeleafRequestContext.java:227)
    at org.thymeleaf.spring5.util.FieldUtils.getBindStatusFromParsedExpression(FieldUtils.java:306)
    at org.thymeleaf.spring5.util.FieldUtils.getBindStatus(FieldUtils.java:253)
    at org.thymeleaf.spring5.util.FieldUtils.getBindStatus(FieldUtils.java:227)
    at org.thymeleaf.spring5.processor.AbstractSpringFieldTagProcessor.doProcess(AbstractSpringFieldTagProcessor.java:174)
    at org.thymeleaf.processor.element.AbstractAttributeTagProcessor.doProcess(AbstractAttributeTagProcessor.java:74)
    ... 63 more

java html spring forms thymeleaf
1个回答
0
投票

错误堆栈清楚地指出了问题所在:

Caused by: org.attoparser.ParseException: Error during execution of processor 'org.thymeleaf.spring5.processor.SpringInputGeneralFieldTagProcessor' (template: "greeting" - line 10, col 40)
Caused by: org.springframework.beans.NotReadablePropertyException: Invalid property 'ciudad' of bean class [java.util.ArrayList]: Bean property 'ciudad' is not readable or has an invalid getter method: Does the return type of the getter match the parameter type of the setter?

您正在尝试将一个模型属性用于两个实际元素:用于用户列表和表单。如果要将参数名为“ TodosLosUsuarios”的用户列表传递给模型,则不能对表单使用相同的表单,表单仅用于创建和传递单个对象(用户)。

尝试向模型添加另一个属性:

model.addAttribute("TodosLosUsuarios", user);        
model.addAttribute("newUser", new usuario());     

然后在greeting模板中,将对象的名称替换为“ newUser”:

   <form action="#" th:action="@{/allusers}" th:object="${newUser}" method="post">
        <p>Message: <input type="text" th:field="*{ciudad}" /></p>
        <p><input type="submit" value="Submit" /> <input type="reset" value="Reset" /></p>
    </form>

所以您的控制器应如下所示:

    @Controller
    public class GreetingController {


        @GetMapping("/allusers")
        public String greetingForm(Model model) throws ParseException{
            tablausuario tu = new tablausuario();
            ArrayList<usuario> user = tu.listausuarios();
            Collections.sort(user, (o1, o2) -> o2.getCreatedAt().compareTo(o1.getCreatedAt())); //tabla ordenada
            model.addAttribute("TodosLosUsuarios", user);
            model.addAttribute("newUser", new usuario());        
            return "greeting";
        }

        @PostMapping("/allusers")
        public String greetingSubmit(Model model, HttpServletRequest request, @ModelAttribute usuario newUser) {
            String ciudad = request.getParameter("ciudad");
            tablausuariofilterbycity tufc = new tablausuariofilterbycity();
            ArrayList<usuario> userbycity = tufc.listausuariosfiltradosporciudad(ciudad);
            model.addAttribute("TodosLosUsuarios", userbycity);
            return "result";
        }

    }
© www.soinside.com 2019 - 2024. All rights reserved.