4

我正在使用 SringMVC,并且正在寻找一种简单的解决方案来将 JSP 加载到另一个 JSP 文件的 div 框中。我听说过使用 Tiles,但我更喜欢使用 ajax/jquery。任何人都可以帮助我吗?我现在正试图让这个工作两天......我目前的方法是这样的:

$(document).ready(function() {
    var html =  '<jsp:include page="searchSites.jsp"/>';
    $('#contentbox').load(html);
});

但这会在第二行引发“Uncaught SyntaxError: Unexpected token ILLEGAL”错误。我也试过 c:import 但这也不起作用。非常感谢您的帮助!

编辑:

@Controller
@RequestMapping("/search")
public class SearchController {

    @Autowired private SiteService siteService;
    @Autowired private SystemService systemService;

    @RequestMapping(value = "")
    public String displaySearch(Model model) {
        return "displaySearch";
    }

    @RequestMapping(value = "sites", method = RequestMethod.POST )
    public String displaySites(Model model, @RequestParam String searchStr) {
        List<RSCustomerSiteViewDTO> sites = siteService.getSitesByName(searchStr);
        model.addAttribute("sites", sites);
        return "searchSites";
    }

    @RequestMapping(value = "systems", method = RequestMethod.POST)
    public String displaySystems(Model model, @RequestParam String searchStr) {
        List<RSServicedSystemViewDTO> systems = systemService.getSystemsByName(searchStr);
        model.addAttribute("systems", systems);
        return "searchSystems";
    }       
}

显示搜索.jsp

<html>
<head>
<title>Site</title>
<script src="http://code.jquery.com/jquery-1.9.1.js"></script>
<link rel="stylesheet" href="<c:url value="resources/css/style.css" />" />
<script>
    $(document).ready(function() {
        var html =  '/crsp/search/sites';
        $('#contentbox').load(html);
    });

</script>
</head>
<body>
    <div id="content">
        <div id="searchdiv">
            <form method="POST" action="search/sites">
                <input type=text name=searchStr placeholder="Search Site..."
                    id="searchSite" class="search" />
            </form>
            <form method="POST" action="search/systems">
                <input type=text name=searchStr placeholder="Search System..."
                    id="searchSystem" class="search" />
            </form>
        </div>
        <div id="contentbox">


        </div>
    </div>
</body>
</html>

搜索站点.jsp

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%@ page session="false"%>
<table>
    <tr id="header">
        <td>Name</td>
        <td>Customer</td>
        <td>City</td>
        <td>Region</td>
    </tr>
    <c:forEach var="site" items='${sites}' varStatus="loopStatus">
        <tr class="${loopStatus.index % 2 == 0 ? 'even' : 'odd'}">
            <td>${site.siteName}</td>
            <td>${site.customerName}</td>
            <td>${site.siteCity}</td>
            <td>${site.regionName}</td>
        </tr>
    </c:forEach>
</table>

编辑:我走近了。我必须从表单中触发这样的东西,而不是到目前为止我得到的动作,然后它会起作用:建议?

function searchSites(searchStr) {
    $.ajax({
        type: "POST",
        url: "sites?searchStr=",
        success: function(data) {
            $("#contentbox").html(data);
        }
    });
}
4

2 回答 2

1

load 方法应提供一个与您的控制器方法之一的映射相对应的 url。

控制器

@Controller
@RequestMapping("/site")
public class MyController{

   @RequestMapping("/search")
   public String getFragment(){
       return "fragment";
   }
}

Javascript

$(document).ready(function() {
    var html =  "/contextRoot/site/search"; //you may need to use jstl c:url for this
    $('#contentbox').load(html);
});

配置

请注意此示例,假设您ViewResolver在调度程序配置文件中有如下设置,并且fragment.jsp您的 WEB-INF 目录的根目录中有一个文件:

<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/" />
<property name="suffix" value=".jsp" />
</bean>

Spring MVC 中请求处理的基本概念是请求“以某种方式”映射到控制器方法。Spring MVC 提供了各种方法来处理这个 url、请求类型、参数存在、参数值等......但基本上归结为哪个控制器/方法应该处理这个请求。这通常使用@RequestMapping.

找到方法后发生数据绑定,这意味着请求参数作为参数提供给方法。再一次,有多种方法可以将参数与参数匹配,包括路径变量、模型属性等......

接下来执行方法的主体,这几乎是自定义的,您提供实现。

下一部分是您似乎陷入困境的地方。 控制器方法接下来告诉 Spring 应该显示什么视图。再次,有很多方法可以做到这一点,但最常见的一种是String在与视图 (.jsp) 对应的方法的末尾返回 a。通常会注册一个视图解析器,以避免在返回的String. 返回String的由 解析ViewResolver并返回关联的视图。

displaySearch.jsp如果您想在处理请求后为您服务,要回答您的后续问题,search/systems只需返回该 viewName。

@RequestMapping(value = "systems", method = RequestMethod.POST)
public String displaySystems(Model model, @RequestParam String searchStr) {
    List<RSServicedSystemViewDTO> systems = systemService.getSystemsByName(searchStr);
    model.addAttribute("systems", systems);
    return "displaySearch";
} 
于 2013-06-25T10:01:21.797 回答
1

您应该删除 JSP 标记

var html =  'searchSites.jsp';
$('#contentbox').load(html);
于 2013-06-25T09:45:57.183 回答