【问题标题】:Passing an object from view page to Spring controller将对象从视图页面传递到 Spring 控制器
【发布时间】:2013-08-30 12:58:27
【问题描述】:

我需要将一个复杂对象从视图页面传递给 Spring 控制器。我正在尝试使用模型属性(查看页面是使用 Thymeleaf 和 HTML 构建的)。

我的问题是,对象作为字符串而不是实际对象传递,这会导致控制器端出现强制转换异常。在下面,例如“类别”是一个复杂的对象,其中包含一个列表、一个数组、一个字符串和其他对象作为变量。类别作为字符串而不是对象本身传递。如何将此对象传递给控制器​​?

@Controller
public class QController extends WZController{

    @RequestMapping(value = "/refreshfacets")
    public String refreshfacets(HttpServletRequest request, HttpServletResponse response, Model model,
            @ModelAttribute("refreshFacetsRequest") refreshFacetsRequestDTO refreshfacetsrequest) throws Exception {
        Map<String, Object> responseMap = new HashMap<String, Object>();
        ProductSearchResult productsearchresult = new ProductSearchResult();
        //super.refreshFacets(request, response, model, productsearchresult);
        return XXXX;
    }
}
public class refreshFacetsRequestDTO {

    private static final long serialVersionUID = 1L;

    private Category category;
    private String state;
    private String program;
    private String subject;
    private String year;
    private String price;

    // Constructor, getter, setter methods;
}
<div th:remove="tag">
    <form method="post" id="form1" th:action="@{/refreshfacets}" th:object="${refreshFacetsRequest}">
    <input type="hidden" id="category" name="category" th:if="${category}" th:value="${category}"/>
    <input type="text" id="state" name="state" th:if="${state}" th:value="${state}"/>
    <input type="text" id="program" name="program" th:if="${program}" th:value="${program}"/>
    <input type="text" id="subject" name="subject" th:if="${subject}" th:value="${subject}"/>
    <input type="submit" th:attr="onsubmit=${'doAjaxPost()'}"></input>  
    </form>
</div>

请就此提出建议。传递对象的模型属性以外的任何其他选项也可以。如果是这样,请详细说明您的其他选择。

【问题讨论】:

  • 我不知道 th:object 是做什么的,但是 spring 模型属性对象只适用于 spring:form 标签。
  • @BhashitParikh th 前缀用于 Thymeleaf。我们可以假设 OP 使用的是ThymeleafViewResolver。模型属性最终出现在请求属性中,因此它们也在那里可用。
  • @SotiriosDelimanolis 你能帮我解决这个问题吗...模型属性作为字符串传递,我希望它是对象...

标签: javascript json spring spring-mvc thymeleaf


【解决方案1】:

您似乎想将Thymeleaf 的选择器表达式与th:object="${refreshFacetsRequest}" 一起使用。其符号是*{someField}。相应地改变你的元素

<input type="hidden" id="category" name="category" th:if="*{category}" th:value="*{category}"/>

以上将解析为${refreshFacetsRequest.category}

编辑

从 View 到 Controller,您所做的是让您的浏览器向 HTTP 服务器(您的 servlet 容器)发送一个 HTTP 请求。这里没有对象的概念。名称为 category&lt;input&gt; 字段将作为 HTTP POST 中的请求参数传递。

Spring 通常足够聪明,可以将请求参数转换为对象,但它需要一些信息。 Category 是枚举吗?如果是,Spring 将尝试使用Category.valueOf(requestParam) 来转换它。如果它是一个类,它将尝试使用名称与Category 类的字段匹配的其他请求参数来实例化它并将其设置在您使用@ModelAttribute 声明的refreshFacetsRequestDTO 对象中。

我不太明白你所说的检索值是一个字符串值i是什么意思。是否出现错误消息?

【讨论】:

  • 不..你误解了我的问题..对不起我的英语不好..当将值从控制器传递到视图页面但我想将值从视图页面传递到控制器时,你的答案有效..那里${category} 将从请求属性类别中检索值并将其存储在可以在控制器中检索的 ${refreshFacetsRequest} 模型属性中。这是我的想法。我的概率是检索到的值是字符串值而不是对象本身(类别对象)...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-03-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-06
相关资源
最近更新 更多