从 javascript 调用 java servlet

IT技术 java javascript ajax web-applications servlets
2021-01-28 21:49:09

我正在尝试使用 MVC 设计模式创建一个 Web 应用程序。对于 GUI 部分,我想使用 JavaScript。而对于控制器 Java Servlets。

现在我从来没有真正使用过 JavaScript,所以我很难弄清楚如何从 JavaScript 调用 Java Servlet 以及如何从 Servlet 获取响应。

有人可以帮我吗?

6个回答

那么您想对servlet 发出Ajax调用吗?为此,您需要XMLHttpRequestJavaScript 中对象。这是一个与 Firefox 兼容的示例:

<script>
    var xhr = new XMLHttpRequest();
    xhr.onreadystatechange = function() {
        if (xhr.readyState == 4) {
            var data = xhr.responseText;
            alert(data);
        }
    }
    xhr.open('GET', '${pageContext.request.contextPath}/myservlet', true);
    xhr.send(null);
</script>

然而,这是非常冗长的并且不是真正的跨浏览器兼容。对于触发ajaxical请求和遍历HTML DOM树的最佳跨浏览器兼容方式,我建议使用jQuery这是在 jQuery 中对上述内容的重写:

<script src="http://code.jquery.com/jquery-latest.min.js"></script>
<script>
    $.get('${pageContext.request.contextPath}/myservlet', function(data) {
        alert(data);
    });
</script>

无论哪种方式,服务器上的 Servlet 都应该映射到url-patternof /myservlet(您可以根据自己的喜好进行更改),并且至少已doGet()实现并将数据写入响应,如下所示:

String data = "Hello World!";
response.setContentType("text/plain");
response.setCharacterEncoding("UTF-8");
response.getWriter().write(data);

这应该显示Hello World!在 JavaScript 警报中。

您可以当然也可以使用doPost(),但你应该使用'POST'xhr.open()或使用$.post(),而不是$.get()在jQuery的。

然后,要在 HTML 页面中显示数据,您需要操作HTML DOM例如,你有一个

<div id="data"></div>

在您想要显示响应数据的 HTML 中,您可以这样做而不是alert(data)第一个示例:

document.getElementById("data").firstChild.nodeValue = data;

在 jQuery 示例中,您可以以更简洁和漂亮的方式执行此操作:

$('#data').text(data);

为了更进一步,您需要一种易于访问的数据格式来传输更复杂的数据。常见的格式是 XML 和 JSON。有关它们的更详细示例,请前往如何使用 Servlets 和 Ajax?

我照你说的做了。但是 servlet 返回其中的 html 代码作为响应。警报(数据)在浏览器警报中显示 html 代码
2021-03-29 21:49:09

这里的代码将使用 AJAX 将文本动态打印到 HTML5 文档中(Ajax 代码类似于 book Internet & WWW (Deitel)):

Javascript代码:

var asyncRequest;    
function start(){
    try
    {
        asyncRequest = new XMLHttpRequest();
        asyncRequest.addEventListener("readystatechange", stateChange, false);
        asyncRequest.open('GET', '/Test', true);    //   /Test is url to Servlet!
        asyncRequest.send(null);
    }
    catch(exception)
   {
    alert("Request failed");
   }
}

function stateChange(){
if(asyncRequest.readyState == 4 && asyncRequest.status == 200)
    {
    var text = document.getElementById("text");         //  text is an id of a 
    text.innerHTML = asyncRequest.responseText;         //  div in HTML document
    }
}

window.addEventListener("load", start(), false);

Servlet Java 代码:

public class Test extends HttpServlet{
@Override
public void doGet(HttpServletRequest req, HttpServletResponse resp)
    throws IOException{
        resp.setContentType("text/plain");
        resp.getWriter().println("Servlet wrote this! (Test.java)");
    }
}

HTML 文件

 <div id = "text"></div>

编辑

当我刚接触网络编程时,我在上面写了答案。我让它站着,但 javascript 部分绝对应该在 jQuery 中,它比原始 javascript 容易 10 倍。

我真的建议您将jquery用于 javascript 调用和 JSR311 的一些实现,例如用于服务层的jersey,这将委托给您的控制器。

这将帮助您处理处理 HTTP 调用和数据序列化的所有底层逻辑,这是一个很大的帮助。

对不起,我读的是jsp而不是javascript。您需要执行以下操作(请注意,这是一个相对 url,并且可能会因该 javascript 所在文档的 url 不同而有所不同):

document.location = 'path/to/servlet';

web.xml 中的 servlet 映射如下所示:

<servlet-mapping>
    <servlet-name>someServlet</servlet-name>
    <url-pattern>/path/to/servlet*</url-pattern>
</servlet-mapping>
不是来自 JavaScript,而是这种级别的琐碎东西更接近于控制器而不是视图。
2021-04-11 21:49:09
   function callServlet()


{
 document.getElementById("adminForm").action="./Administrator";
 document.getElementById("adminForm").method = "GET";
 document.getElementById("adminForm").submit();

}

<button type="submit"  onclick="callServlet()" align="center"> Register</button>