如何使用servlet和Ajax?

我对web应用和servlet非常陌生,我有以下问题:

每当我在servlet中打印某些内容并通过webbrowser调用它时,它都会返回一个包含该文本的新页面。有没有一种方法可以使用Ajax打印当前页面中的文本

事实上,关键词是;ajax":异步JavaScript和XML。然而,在过去几年中,它更多地是异步JavaScript和JSON。基本上,让JS执行一个异步HTTP请求,并根据响应数据更新HTMLDOM树

因为它相当于一个让它在所有浏览器(尤其是Internet Explorer和其他浏览器)中都能正常工作,这是一项繁琐的工作,有很多JavaScript库,它们在单个函数中简化了这一点,并尽可能多地掩盖了特定于浏览器的错误/怪癖,例如jQuery原型http://mootools.net/“rel=“noreferrer”>Mootools。由于jQuery现在最流行,我将在下面的示例中使用它

以纯文本形式返回字符串的启动示例

创建一个如下所示的/some.jsp(注意:此答案中的代码片段并不期望jsp文件被放置在子文件夹中,如果这样做,请相应地将servlet URL从&someservlet"更改为${pageContext.request.contextPath}/someservlet";为了简洁起见,代码片段中省略了它):

<!DOCTYPE html>
<html lang=""&燃气轮机;
<头>
<标题>因此,问题4112686&lt/标题>
<脚本src="http://code.jquery.com/jquery-latest.min.js"&燃气轮机&lt/脚本>
<脚本>
$(文档)。。。
$.get("someservlet",函数(responseText){//在"someservlet"的URL上执行Ajax get请求,并使用Ajax响应文本执行以下函数。。。
$(“somediv”).text(responseText);//找到ID为“somediv”的HTML DOM元素,并使用响应文本设置其文本内容。
});
});
&lt/脚本>
&lt/头>
<车身>
<按钮id="somebutton&quot&燃气轮机;按此处&lt/按钮>
<div id="somediv“&燃气轮机&lt/部门>
&lt/车身>
&lt/html>

使用doGet()方法创建一个servlet,如下所示:

@override
受保护的void doGet(HttpServletRequest请求,HttpServletResponse响应)抛出ServletException,IOException{
字符串文本=“一些文本”;;
response.setContentType("text/plain);//设置响应的内容类型,以便jQuery知道它可以期望什么。
response.setCharacterEncoding("UTF-8");//你想统治世界,是吗?
response.getWriter().write(text);//写入响应体。
}

将此servlet映射到/someservlet/someservlet/*的URL模式上,如下所示(显然,URL模式由您自由选择,但您需要相应地修改JS代码示例中的someservletURL):

package com.example;
@WebServlet(“someservlet/*”)
公共类SomeServlet扩展了HttpServlet{
// ...
}

或者,当您还没有使用与Servlet 3.0兼容的容器(Tomcat 7、Glassfish 3、JBoss AS 6等或更新版本)时,请以老式方式将其映射到web.xml(另请参见我们的Servlets wiki页面):

<servlet>
<servlet名称>someservlet&lt/servlet名称>
<servlet类>SomeServlet&lt/servlet类>
&lt/servlet>
<servlet映射>
<servlet名称>someservlet&lt/servlet名称>
<url模式&gt/someservlet/*&lt/url模式>
&lt/servlet映射>

现在打开http://localhost:8080/context/test.jsp 在浏览器中,然后按按钮。您将看到div的内容通过servlet响应得到更新

返回列表<字符串&gt作为JSON

使用JSON代替纯文本作为响应格式,您甚至可以更进一步。它允许更多的动态。首先,您希望有一个在Java对象和JSON字符串之间转换的工具。它们也有很多(参见本页概述)。我个人最喜欢的是谷歌Gson。下载JAR文件并将其放入您的WEB应用程序的/WEB-INF/lib文件夹中

下面是一个显示List<字符串&gt作为<ul&gt&书信电报;李&gt。servlet:

@override
受保护的void doGet(HttpServletRequest请求,HttpServletResponse响应)抛出ServletException,IOException{
List<String>List=新数组列表<>();
列表。添加(“项目1”);
列表。添加(“项目2”);
列表。添加(“第3项”);
字符串json=new Gson().toJson(列表);
setContentType(“application/json”);
响应。setCharacterEncoding(“UTF-8”);
response.getWriter().write(json);
}

JS代码:

$(文档)。在(”单击“,”somebutton“,”函数(){//当对ID为“somebutton”的元素调用HTML DOM“单击”事件时,执行以下函数。。。
$.get("someservlet",函数(responseJson){//在"someservlet"的URL上执行Ajax get请求,并使用Ajax响应JSON执行以下函数。。。
var$ul=$(“ul&gt”).appendTo($(“somediv”);//创建HTML<ul>元素并将其附加到ID为“somediv”的HTML DOM元素;。
$.each(responseJson,function(index,item){//遍历JSON数组。
$("li>).text(item).appendTo($ul);//创建HTML<li>元素,使用当前迭代的项设置其文本内容,并将其附加到<ul>。
});
});
});

请注意,当您将响应内容类型设置为application/JSON时,jQuery会自动将响应解析为JSON,并直接将JSON对象(responseJson)作为函数参数提供给您。如果您忘记设置它或依赖默认值text/plaintext/html,那么responseJson参数不会给您一个JSON对象,而是一个普通字符串,您需要手动摆弄JSON.parse()之后,如果您首先将内容类型设置正确,则完全不需要这样做

返回Map<字符串,字符串&gt作为JSON

下面是另一个显示Map<字符串,字符串&gt作为<选项&gt:

@override
受保护的void doGet(HttpServletRequest请求,HttpServletResponse响应)抛出ServletException,IOException{
Map<String,String>options=newlinkedhashmap<>();
期权。看跌期权(“value1”、“label1”);
期权。看跌期权(“value2”、“label2”);
期权。看跌期权(“value3”、“label3”);
字符串json=new Gson().toJson(选项);
setContentType(“application/json”);
响应。setCharacterEncoding(“UTF-8”);
response.getWriter().write(json);
}

和JSP:

$(文档)。在(”单击“,”somebutton“,”函数(){//当对ID为“somebutton”的元素调用HTML DOM“单击”事件时,执行以下函数。。。
$.get("someservlet",函数(responseJson){//在"someservlet"的URL上执行Ajax get请求,并使用Ajax响应JSON执行以下函数。。。
var$select=$(“someselect”);//查找ID为“someselect”的HTML DOM元素;。
$select.find("option).remove();//查找标记名为"option"的所有子元素并将其删除(只是为了防止再次按下按钮时出现重复选项)。
$.each(responseJson,function(key,value){//迭代JSON对象。
$("option>).val(key).text(value).appendTo($select);//创建HTML<option>元素,使用当前迭代的键设置其值,使用当前迭代的项设置其文本内容,最后将其附加到<select>。
});
});
});

<选择id="someselect&quot&燃气轮机&lt/选择>

返回列表<实体&gt作为JSON

下面是一个显示List&lt;产品&gt</a中的code>&lt;表&gt其中产品类具有属性长id字符串名和<c

发表评论