【问题标题】:Loading a jsp page using JQuery使用 JQuery 加载 jsp 页面
【发布时间】:2013-09-14 15:29:27
【问题描述】:

我的页面中有一个特定的 div,我想在其中加载所有子页面(为此我使用 JQuery)。在加载它们之前,我需要在服务器中进行一些操作,所以我调用了我的 servlet,在完成所有操作之后,我想加载 .jsp 页面......但我不知道如何。

responseText 为:

/SAJ/WebContent/WEB-INF/views/administracion/semestres/semestreIndex.jsp

(我的项目结构中存储想要的.jsp的路径)

我得到它在div中写responseText:

<div id="content" class="testDiv" >

使用这个:

function load() {
    $.ajax({
        type: "POST",
        url: "/SAJ/pages/semestre",
        success: function(responseText) {
            $('#content').text(responseText); 
        }
    });
}

但我不知道如何加载整个页面。我的第一个想法是这样做:

function load() {
    $.ajax({
        type: "POST",
        url: "/SAJ/pages/semestre",
        success: function(responseText) {
            $('#content').load(responseText); 
        }
    });
}

但我在 Chrome 的控制台中收到 404 错误:

GET http://localhost:8080/SAJ/WebContent/WEB-INF/views/administracion/semestres/semestreIndex.jsp 404 (Not Found)

我想不是我使用了错误的路线?但是我怎样才能找到哪一个是正确的呢?我只是按照我的项目结构:

Servlet 代码:

protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{
    try {
        Action action = ((ActionFactory) getServletContext().getAttribute("actions")).getAction(request);
        String view = action.execute(request, response);
        if(view.equals("index")){
            request.getRequestDispatcher("/WEB-INF/" + view + ".jsp").forward(request, response);
        }else{
            response.getWriter().write("/SAJ/WebContent/WEB-INF/" + view + ".jsp");
        }
    } catch (Exception e) {
        throw new ServletException("Executing action failed.", e);
    }
}

servlet 调用的操作:

public class SemestreListarAction implements Action{

    public String execute(HttpServletRequest request, HttpServletResponse response) throws Exception{
    request.setAttribute("test", "HELLO WORLD!");
    System.out.println("I'm nice so I did some stuff for you!");

        return "views/administracion/semestres/semestreIndex";
    }
}

web.xml

<servlet>
    <servlet-name>Redirector</servlet-name>
    <servlet-class>com.saj.controller.Redirector</servlet-class>
    <load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
    <servlet-name>Redirector</servlet-name>
    <url-pattern>/pages/*</url-pattern>
</servlet-mapping>

来电者:

<a href="#" onclick="load()">Load</a>

【问题讨论】:

  • 您是否尝试过使用.html()
  • 是的,我得到了与我的第一个测试相同的结果(使用 .text()),因为我的请求返回的是带有 jsp' 路径的文本而不是 html 页面。
  • .getScript() 呢?
  • 使用 $('#content').getScript(responseText);给出:未捕获的类型错误:对象 [object Object] 没有方法“getScript”。但是我为什么要使用那个,我不是要加载脚本而是加载jsp页面。

标签: jquery jsp servlets


【解决方案1】:

让我们承认你有这个 div:

<div id='result'></div>

尝试像这样使用.load()

function load(jsp_path) {

    $("#result").load(jsp_path);

}

【讨论】:

  • 这就是我在调用时正在做的事情:function(responseText) { $('#content').load(responseText); } 因为 responseText 是 jsp_path?
  • 请也发布您的 servlet 代码,并告诉我您调用 ajax 的页面是什么
  • 我发布了我的 servlet 代码,我确信它被正确调用了,因为我在服务器的控制台中获得了测试打印,并且 .text() 和 .html() 也给出了预期的输出。但是我不知道为什么 .load() 没有。调用者是 index.jsp(屏幕中显示的另一个文件,位于 /WEB-INF 目录中)。
  • 好的,我认为问题是你的路径localhost:8080/SAJ/WebContent/WEB-INF/views/administracion/…,你有404错误,你可以从浏览器访问它吗?
  • 不,我不能。然而,我不知道正确的路径应该是什么,我不应该遵循项目结构吗?
【解决方案2】:

好吧,在终于能够加载一些东西之后,我发现因为一切都是如何配置的,唯一需要加载的是索引。为了纠正这个问题,我改变了我的逻辑。

首先我只使用 Load 函数请求页面:

function Load() {
$.ajaxSetup({
    data: { load: '/semestre' }
});

$('#content').load("#/views/administracion/semestres/semestreIndex.jsp"); //jsp's path
}

然后更改我的 servlet(因此它重定向到 jsp 所在的正确路径)和 actionFactory 以使用参数 load 而不是 request.getPathInfo()

Servlet:

protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    try {
        Action action = ((ActionFactory) getServletContext().getAttribute("actions")).getAction(request);
        String view = action.execute(request, response);
        request.getRequestDispatcher("/WEB-INF/" + view + ".jsp").forward(request, response);           
    } catch (Exception e) {
        throw new ServletException("Executing action failed.", e);
    }
}

动作工厂:

public Action getAction(HttpServletRequest request) {
    Action action = actions.get(request.getParameter("load"));

    if(action == null)
        return new DefaultAction();
    else
        return action;
}

总之,问题出在路径和我的逻辑上。在我的情况下,不需要使用 $ajax 和 $load,因为 $load 本身就是一个 http 请求,所以我可以执行逻辑,然后在同一个调用中加载具有正确值的页面。路径中的问题是由于缺少“#”。

我想知道是否有办法更改请求路径,以便我可以删除“加载”参数,此外现在一切正常。

【讨论】:

    【解决方案3】:

    这里的一个关键是,确保你的jsp不在web-inf目录下,将它移动到与web-inf相同的级别或与web-inf同级的目录。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-06-27
      • 2019-08-18
      • 2015-09-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-14
      • 2018-12-20
      相关资源
      最近更新 更多