java - 为什么我的Ajax调用刷新页面? (即再次调用servlet)

标签 java ajax rest glassfish jax-rs

我正在使用 Java 学习 RESTful Web 服务。 我的环境使用 Netbean 和 GlassFish v3。

我有一个页面 URL /inventoryList,该 URL 映射到 web.xml 中的 InventoryApp.java servlet

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/j2ee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
    version="2.4">
    <servlet>
        <servlet-name>inventory servlet</servlet-name>
        <servlet-class>local.test.servlet.InventoryApp</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>inventory servlet</servlet-name>
        <url-pattern>/inventoryList</url-pattern>
    </servlet-mapping>
</web-app>

在servlet中,它从DB中获取库存商品信息列表并显示到JSP页面。

inventory.jsp

<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
   "http://www.w3.org/TR/html4/loose.dtd">
<%@ taglib prefix="c" uri="http://java.sun.com/jstl/core_rt" %>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>JSP Page</title>

        <script type="text/javascript">

        function ajaxGet(inventoryId) {
            alert(inventoryId);
            var xmlHttp = new XMLHttpRequest();
            xmlHttp.onreadystatechange = function() {

                alert('sigh');

                if(xmlHttp.readyState == 4 && xmlHttp.status == 200) {
                    alert('ready 4');
                    alert('After ready4 ===> ' + xmlHttp.responseText);

                    displayInventoryHtml(xmlHttp);

                }
            }
            var url = "resources/inventory/" + inventoryId;
            xmlHttp.open("GET", url, true);
            xmlHttp.send(null);
        }

        function displayInventoryHtml(responseAjax) {
            document.getElementById('inventoryItem').innerHTML = responseAjax.responseText;
        }

        </script>

    </head>
    <body>
        <h1>Inventory page</h1>

        <table border="1" cellspacing="1" cellpadding="5">
            <th>id</th>
            <th>amount</th>
            <c:forEach items="${inventoryList}" var="inv" >
                <tr>
                    <td>${inv.id}</td>
                    <td><a href="" onclick="ajaxGet(${inv.id})">${inv.amount}</a></td>
                </tr>
            </c:forEach>
        </table>
        <hr />
        <div id="inventoryItem">
        </div>


    </body>
</html>

如您所见,inventory.jsp 将成功输出库存项目列表。

到目前为止一切顺利。

这里,我将库存金额值的输出作为 Ajax 调用的链接。

<td><a href="" onclick="ajaxGet(${inv.id})">${inv.amount}</a></td>

它调用HTTP GET方法REST服务(代码如下所示)将获取指定id(数据库主id)的库存数据,我将Ajax响应文本放入div (id=inventoryItem)

InventoryResource.java

package local.test.jaxrs;

import java.util.List;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.UriInfo;
import javax.ws.rs.Consumes;
import javax.ws.rs.DELETE;
import javax.ws.rs.PUT;
import javax.ws.rs.Path;
import javax.ws.rs.GET;
import javax.ws.rs.POST;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import local.test.dao.InventoryDao;
import local.test.session.Inventory;

@Path("/inventory")
public class InventoryResource {
    @Context
    private UriInfo context;

    /** Creates a new instance of InventoryResource */
    public InventoryResource() {
    }


    @Path("{inv_id}")
    @GET
    @Produces("text/html")
    public String getJson(@PathParam("inv_id") String inventory_id) {
        System.out.println("GET is being handled");

        Inventory invBean = new Inventory(Integer.valueOf(inventory_id));
        InventoryDao invDao = new InventoryDao();
        List<Inventory> inv = invDao.findById(invBean);

        String html = "<b>" + inv.get(0).getId() + "</b><br /><b>" + inv.get(0).getAmount() + "</b><br />";

        return html;

    }
}//end class

当我测试这段代码时,一切正常。 Ajax成功获取数据并插入到HTML DIV标签中,库存数据显示半秒后消失。

使用firebug并查看glassfish v3服务器日志,我认为最后,它再次调用InventoryApp.java servlet,这导致页面重定向到/inventoryList

我知道 Ajax 是部分请求,不应导致页面刷新。

我已经在这几天了,有人能给我提示发生了什么事吗? 我不确定像我一样将 servlet 和 web.xml 与 REST 混合起来是否可行。

仅供引用,我的InventoryApp.java servlet 代码

package local.test.servlet;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import local.test.dao.InventoryDao;
import local.test.session.Inventory;


@WebServlet(name="InventoryApp", urlPatterns={"/InventoryApp"})
public class InventoryApp extends HttpServlet {

    /** 
     * Processes requests for both HTTP <code>GET</code> and <code>POST</code> methods.
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");
        PrintWriter out = response.getWriter();
        try {

        } finally { 
            out.close();
        }
    } 

    // <editor-fold defaultstate="collapsed" desc="HttpServlet methods. Click on the + sign on the left to edit the code.">
    /** 
     * Handles the HTTP <code>GET</code> method.
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        InventoryDao invDao = new InventoryDao();
        List<Inventory> invList =  invDao.findAll();

        //this list looks ok...
        System.out.println("================= do get servelt ===" + invList.get(0));

        request.setAttribute("inventoryList", invList);
        request.getRequestDispatcher("inventory.jsp").forward(request, response);

        //processRequest(request, response); //commented not sure what it is..
    } 
}//end class

最佳答案

<a href="" onclick="ajaxGet(${inv.id})">${inv.amount}</a>

删除href属性

<a onclick="ajaxGet(${inv.id})">${inv.amount}</a>

或者取消点击事件的推广

<a href="" onclick="ajaxGet(${inv.id}); return false;">${inv.amount}</a>

关于java - 为什么我的Ajax调用刷新页面? (即再次调用servlet),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4476212/

相关文章:

java - 如何获取 SWT Tray 或 TrayItem 位置

javascript - AJAX 多图像 uploader 出错

c# - .NET Core API - 为什么嵌套模型中的文件属性接收 null?

java - 在 LinearLayout 中将左侧图像移至右侧

Java 将十六进制转换为带符号的 8 位代码

java - 将kafka与jpa一起使用时的良好做法

java - Spring Boot Bean 验证@NotEmpy 不起作用

javascript - Post Ajax 函数返回 true 或 false

javascript - Base64 限制未显示

java - API Rest Call 中禁止访问 403