将JSP文件加载到Javascript中以实现Fragments

时间:2013-06-25 09:44:20

标签: javascript jquery spring jsp

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

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

但这是在第二行抛出“未捕获的SyntaxError:意外的令牌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";
    }       
}

displaySearch.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>

searchSites.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);
        }
    });
}

2 个答案:

答案 0 :(得分:1)

您应该删除JSP标记

var html =  'searchSites.jsp';
$('#contentbox').load(html);

答案 1 :(得分:1)

load方法应该提供一个url,该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,如下所示,并且WEB-INF目录的根目录中有一个fragment.jsp文件:

<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应该显示哪个视图。再一次有很多方法可以做到这一点,但最常见的一种方法是在方法的末尾返回一个与视图(.jsp)对应的String。通常会注册视图解析程序,以避免在返回的String中硬编码视图文件的名称。返回的StringViewResolver解析,并返回相关的视图。

如果您想在处理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";
}