【问题标题】:Passing value via URL to controller from JSP in Spring MVC在 Spring MVC 中通过 URL 从 JSP 向控制器传递值
【发布时间】:2017-10-16 13:22:41
【问题描述】:

创建了一个应用程序。页面 A 显示一个包含值列表的下拉列表。如果用户点击特定帐户,将显示图表。我们在帐户下拉列表右侧有类似的按钮。这些是单独的 JSP。如果用户单击页面 A,则选定的帐户名称应移动到这 4 个 jsp 页面。我已经通过 URL 尝试过。但没有得到。请帮忙。

JSP 1

<a id="priorityCallAnalysis" class="item"> <button type ="button" onclick="getPriorityCall()">Priority </button> </a>
<form:form action="somepage" method="post" commandName="somedata"
                id="taskDetails" enctype="multipart/form-data">
                <div class="row">
                    <div class="col-md-4">
                        <div class="form-group">
                            <label>Choose Account*</label>
                            <form:select path="accountName" class="form-control"
                                id="accountName" onchange="getDashboard()">

                                <form:option value="" label="--select--"></form:option>
                                <c:forEach items="${accountList}" var="accountName">
                                    <form:option value="${accountName}" label="${accountName}"></form:option>
                                </c:forEach>


                            </form:select>
                        </div>
                    </div>
                </div>
                </form:form>

function getPriorityCall()
{
    var accountName = $("#accountName").val();
    alert(accountName);
    window.location="priorityCall.html?accountName="+accountName+"";
} 

控制器

@RequestMapping(value="/priorityCall")
    public ModelAndView priorityCall(Map<String, Object> model,@RequestParam ("accountName") String accName)
    {
        System.out.println("entry");
        SampleBean template = new SampleBean ();
        model.put("template ", template );
        List<String> accountList = Service.getAccountList();
        model.put("accountList", accountList);
        model.put("accName", accName);

        return new ModelAndView("analByPrior","","");
    }

JSP : analByPrior

<form:form action="#" method="post" commandName="somedata"
                id="taskDetails" enctype="multipart/form-data">
                <div class="row">
                    <div class="col-md-4">
                        <div class="form-group">
                            <label>Choose Account*</label>
                            <form:select path="accountName" class="form-control"
                            id="accountName" onchange="getAssignmentGroups()">
                            <form:option value="" label="--select--"></form:option>
                            <c:forEach items="${accountList}" var="accName">
                        <form:option value="${accName}" selected="true"> ${accName}</form:option>
                            </c:forEach>

                        </form:select>
                        </div>
                    </div>
                </div>
            </form:form>

更新 单击优先级按钮时,会调用此控制器,而不是 PriorityCall.. 我不知道你..

@RequestMapping("/priorityCallAnalysis")
    public String someAction(@ModelAttribute("accountName") TicketInfo data, Map<String, Object> map,
                                    HttpServletRequest request) {

        TicketInfo somedata = new TicketInfo();
            map.put("somedata",somedata);
            System.out.println(somedata);
           System.out.println("acc=" + request.getParameter("accountName"));

           /* do some process and send back the data */
            map.put("somedata", data);
            map.put("accountName", request.getParameter("accountName"));

            return "analysisByPriority";
       }

【问题讨论】:

  • 只是检查一下,在javascript 代码中,priorityCall url 是priorityCall.html,而在控制器中,@RequestMapping 值只是/priorityCall,没有.html 后缀。对吗?
  • 我认为是的。我们可以过得很好。 @jlumietu
  • 您是否测试过从js 函数中删除.htmlsuffix,只调用"priorityCall?accountName="+accountName+""?我会测试一下,因为这是尝试的最简单的解决方案...
  • 现在试过了..不工作..这个流程首先是正确的吗??...我很困惑..完全...
  • 当您调用 window.location 时,您需要在 url 中为您提供上下文路径,例如 '//priorityCall/' + "?accountName=" + accountName 并且没有 html,作为 window .location 将替换浏览器中的 url。

标签: java ajax spring jsp spring-mvc


【解决方案1】:

首先在 .jsp 文件中可以使用全局变量来存储上下文路径,并在所有相对路径中使用该变量作为前缀。

<script>var context = "${pageContext.request.contextPath}"</script>

现在在您的 js 函数中使用上下文路径并调用控制器。

function getPriorityCall(){
  var accountName = $("#accountName").val();
  alert("contextPath: "+context); // will print your {appName}
  window.location=context+"/priorityCall?accountName="+accountName;
}

所以您的 URI 在您的请求调用中如下所示。

http://localhost:8080/{appName}/priorityCall?accountName={acountName}

PS:

  • 使用此${pageContext.request.contextPath} 的好处是,如果您稍后更改应用名称,则无需在视图中更改它。它会自动获取最新的 contextPath。
  • 如果您使用的是 Firefow 浏览器,请安装 firebug 插件并使用它来验证您的请求。所以你可以用参数验证你的 URI。(如果它的 chrome 使用 Inspect Element 来验证 URI)

【讨论】:

  • 几乎所有人都可以……但只有一件事。 window.location 不会执行 POST 请求,而是执行 GET 请求
  • @jlumietu 感谢您的输出。很高兴知道这一点,我会据此更新答案
  • 你是用tomcat做服务器吗?部署到服务器的 .war 文件名是什么? .war 文件名和 appName 应该相似。也用于在 jsp 中选择 selectedAccName。您需要先在控制器中将其设置为模型。 model.put("selectedAccName", accountName);然后在 jsp 中,您必须在循环 accountList 时获取此值并将其与每个数组列表值进行比较。当两个值相等时,为该选项设置 selected=“true” 属性。对于其他情况,填充不带选定属性的选项。
  • 1.如何找到战争文件名?.. 2. 在 priorityCall 中,我将值作为 accountName 传递,并将其设置为控制器中的模型,如 model.put("accountName", accountName);然后我也收到404错误。请帮助@Neero
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-03
  • 1970-01-01
  • 1970-01-01
  • 2012-12-08
  • 1970-01-01
相关资源
最近更新 更多