从JavaScript调用一个Java servlet
我正在尝试使用MVCdevise模式创build一个Web应用程序。 对于GUI部分,我想使用JavaScript。 并为控制器Java Servlets。
现在我从来没有真正使用JavaScript,所以我很难搞清楚如何从JavaScript调用Java Servlet以及如何获得Servlet的响应。
有人可以帮我吗?
所以你想发起Ajax调用servlet? 为此,您需要JavaScript中的XMLHttpRequest
对象。 这是一个Firefox兼容的例子:
<script> var xhr = new XMLHttpRequest(); xhr.onreadystatechange = function() { if (xhr.readyState == 4) { var data = xhr.responseText; alert(data); } } xhr.open('GET', 'myservlet', true); xhr.send(null); </script>
然而,这是非常冗长的,而不是真正的crossbrowser兼容。 为了发布Ajax请求和遍历HTML DOM树的最佳交叉浏览器兼容的方式,我build议抓住jQuery 。 这是在jQuery上面的重写:
<script src="jquery-1.11.1.min.js"></script> <script> $.get('myservlet', function(data) { alert(data); }); </script>
无论哪种方式,服务器上的Servlet应映射到/myservlet
的url-pattern
(可以根据自己的喜好进行更改),并至less执行doGet()
,并将数据写入响应,如下所示:
String data = "Hello World!"; response.setContentType("text/plain"); response.setCharacterEncoding("UTF-8"); response.getWriter().write(data);
这应该显示Hello World!
在JavaScript警报中。
你当然也可以使用doPost()
,但是你应该在xhr.open()
使用'POST'
,或者在jQuery中使用$.post()
而不是$.get()
。
然后,要显示HTML页面中的数据,您需要操作HTML DOM 。 例如,你有一个
<div id="data"></div>
在您想要显示响应数据的HTML中,您可以这样做,而不是第一个示例的alert(data)
:
document.getElementById("data").firstChild.nodeValue = data;
在jQuery示例中,您可以以更简洁和更好的方式进行操作:
$('#data').text(data);
为了更进一步,您希望有一个容易访问的数据格式来传输更复杂的数据。 常用的格式是XML和JSON。 最后一个是最优选的,因为它更加简洁,可以非常简单的方式在Java和JavaScript中使用。 在Java中,您可以使用Google Gson将完整的Java对象转换为JSON,反之亦然。
List<Product> products = productDAO.list(); // Product is just a Javabean with properties `id`, `name` and `description`. String json = new Gson().toJson(products); response.setContentType("application/json"); response.setCharacterEncoding("UTF-8"); response.getWriter().write(json);
在JavaScript中,您可以使用jQuery的$.getJSON()
来“立即”获取它。 让我们把它显示在一个<table>
。
$.getJSON('myservlet', function(data) { var table = $('<table>').appendTo($('#data')); $.each(data, function(i, product) { var row = $('<tr>').appendTo(table); $('<td>').text(product.id).appendTo(row); $('<td>').text(product.name).appendTo(row); $('<td>').text(product.description).appendTo(row); }); });
另见 :
- Java / JSP / JSF和JavaScript
- JavaScript教程
- JSON教程
- jQuery教程
这里的代码将使用AJAXdynamic地将文本打印到HTML5文档(Ajax代码类似于书籍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>
编辑
我刚刚在networking编程的时候就写了上面的答案。 我让它站立,但JavaScript部分应该肯定是在jQuery,而不是原始的JavaScript的10倍。
我真的build议你使用jQuery的JavaScript调用和JSR311的一些实现,如泽西岛的服务层,这将委派给你的控制器。
这将帮助您处理HTTP调用和数据序列化的所有底层逻辑,这是一个很大的帮助。
对不起,我读的不是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>
- Rails,deviseauthentication,CSRF问题
- 通过variables在jQuery AJAX成功callback函数
- Access-Control-Allow-Origin不允许$ http.get,但$ .ajax是
- jQuery在通过AJAX加载内容后不起作用
- 我如何发布MVC中的项目列表
- 如何更改浏览器地址栏,而无需重新加载页面 – HTML / Javascript
- 如果JSF页面受j_security_check保护,则不会在Ajax请求上抛出ViewExpiredException
- HTML – 更新\更新页面内容,而不刷新\重新加载页面
- 有可能通过一些debugging器,如WebKit,FireBug或IE8开发工具debuggingdynamic加载JavaScript?