我正在尝试使用 MVC 设计模式创建一个 Web 应用程序。对于 GUI 部分,我想使用 JavaScript。而对于控制器 Java Servlets。
现在我从来没有真正使用过 JavaScript,所以我很难弄清楚如何从 JavaScript 调用 Java Servlet 以及如何从 Servlet 获取响应。
有人可以帮我吗?
我正在尝试使用 MVC 设计模式创建一个 Web 应用程序。对于 GUI 部分,我想使用 JavaScript。而对于控制器 Java Servlets。
现在我从来没有真正使用过 JavaScript,所以我很难弄清楚如何从 JavaScript 调用 Java Servlet 以及如何从 Servlet 获取响应。
有人可以帮我吗?
那么您想对servlet 发出Ajax调用吗?为此,您需要XMLHttpRequest
JavaScript 中的对象。这是一个与 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-pattern
of /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?
这里的代码将使用 AJAX 将文本动态打印到 HTML5 文档中(Ajax 代码类似于 book Internet & WWW (Deitel)):
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);
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)");
}
}
<div id = "text"></div>
当我刚接触网络编程时,我在上面写了答案。我让它站着,但 javascript 部分绝对应该在 jQuery 中,它比原始 javascript 容易 10 倍。
对不起,我读的是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>
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>