Java 测试servlet时在浏览器输出上获取字符串
我正在运行下面的servlet,在我的浏览器上得到了一些奇怪的输出。程序运行正常,没有任何错误,但出于某种原因,Java 测试servlet时在浏览器输出上获取字符串,java,tomcat,servlets,Java,Tomcat,Servlets,我正在运行下面的servlet,在我的浏览器上得到了一些奇怪的输出。程序运行正常,没有任何错误,但出于某种原因,out.println行的输出(Add_To_Queue(“abc”、“xyz”、“pqr”)正在显示 以java字符串的形式,代码如下所示: protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
out.println行的输出(Add_To_Queue(“abc”、“xyz”、“pqr”)代码>正在显示
以java字符串的形式,代码如下所示:
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
try {
out.println("<!DOCTYPE> html"); // HTML 5
out.println("<html><head>");
out.println("<meta http-equiv='Content-Type' content='text/html; charset=UTF-8'>");
out.println(Test_Servlet("abc","xyz","pqr"));
out.println("<head><title>TEST SERVLET API Call</title></head>");
out.println("<body>");
out.println("<h3>TEST SERVLET</h3>");
// Tabulate the request information
out.println("</body></html>");
}
finally {
out.close(); // Always close the output writer
}
}
public static Object Test_Servlet(String FirstString,String Secondstring,String ThirdString) throws IOException {
String accessKey = "myaccesskey";
String secretKey = "mysecretkey";
String uRLCppList = "http://myurl.com";
String method = "POST";
java.util.Date currentTime = new java.util.Date();
SimpleDateFormat sdf = new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss z");
// Give it to me in GMT time.
sdf.setTimeZone(TimeZone.getTimeZone("GMT"));
String dateTimeString = sdf.format(currentTime);
String signature = generateSignature(method, secretKey, dateTimeString);
String authorization = accessKey + ":" + signature;
Map<String, String> params = new HashMap<String, String>();
params.put("Content of first String", FirstString);
params.put("Content of Second String", Secondstring);
params.put("Content of Third String", ThirdString);
String[] result = sendHttpRequest(uRLCppList, "POST", params, dateTimeString, authorization);
return result;
}
我使用JDK 8、ApacheTomcat 6和Netbeans 7.4进行部署。我怀疑,在Test\u Servlet
方法中定义的变量result
中返回的结果没有在web浏览器上正确显示
SendHttpRequest方法的附加代码:
public static String[] sendHttpRequest(String requestUrl, String method, Map<String, String> params, String dateTimeString, String authorization) throws IOException {
List<String> response = new ArrayList<String>();
StringBuffer requestParams = new StringBuffer();
if (params != null && params.size() > 0) {
Iterator<String> paramIterator = params.keySet().iterator();
while (paramIterator.hasNext()) {
String key = paramIterator.next();
String value = params.get(key);
requestParams.append(URLEncoder.encode(key, "UTF-8"));
requestParams.append("=").append(URLEncoder.encode(value, "UTF-8"));
requestParams.append("&");
}
}
URL url = new URL(requestUrl);
URLConnection urlConn = url.openConnection();
urlConn.setRequestProperty("accept", "application/json");
urlConn.setRequestProperty("datetime", dateTimeString);
urlConn.setRequestProperty("authorization", authorization);
urlConn.setUseCaches(false);
// the request will return a response
urlConn.setDoInput(true);
if ("POST".equals(method)) {
// set request method to POST
urlConn.setDoOutput(true);
} else {
// set request method to GET
urlConn.setDoOutput(false);
}
if ("POST".equals(method) && params != null && params.size() > 0) {
OutputStreamWriter writer = new OutputStreamWriter(urlConn.getOutputStream());
writer.write(requestParams.toString());
writer.flush();
}
// reads response, store line by line in an array of Strings
BufferedReader reader = new BufferedReader(new InputStreamReader(urlConn.getInputStream()));
String line = "";
while ((line = reader.readLine()) != null) {
response.add(line);
}
reader.close();
return (String[]) response.toArray(new String[0]);
}
公共静态字符串[]sendHttpRequest(字符串请求URL、字符串方法、映射参数、字符串dateTimeString、字符串授权)引发IOException{
列表响应=新建ArrayList();
StringBuffer requestParams=新的StringBuffer();
if(params!=null&¶ms.size()>0){
迭代器paramIterator=params.keySet().Iterator();
while(parameterator.hasNext()){
String key=paramIterator.next();
字符串值=params.get(键);
append(URLEncoder.encode(键,“UTF-8”);
requestParams.append(“=”).append(urlcoder.encode(值,“UTF-8”);
requestParams.append(“&”);
}
}
URL=新URL(请求URL);
URLConnection urlConn=url.openConnection();
setRequestProperty(“接受”、“应用程序/json”);
setRequestProperty(“datetime”,dateTimeString);
urlConn.setRequestProperty(“授权”,授权);
urlConn.setUseCaches(false);
//请求将返回一个响应
urlConn.setDoInput(true);
如果(“POST”。等于(方法)){
//将请求方法设置为POST
urlConn.setDoOutput(真);
}否则{
//设置要获取的请求方法
urlConn.setDoOutput(假);
}
if(“POST.equals(method)&¶ms!=null&¶ms.size()>0){
OutputStreamWriter writer=新的OutputStreamWriter(urlConn.getOutputStream());
writer.write(requestParams.toString());
writer.flush();
}
//读取响应,在字符串数组中逐行存储
BufferedReader=新的BufferedReader(新的InputStreamReader(urlConn.getInputStream());
字符串行=”;
而((line=reader.readLine())!=null){
响应。添加(行);
}
reader.close();
return(String[])response.toArray(新字符串[0]);
}
您的测试\u Servlet
方法正在返回一个字符串数组。对数组调用toString()
的结果是得到的字符串,其中包括类型和对象Id
不确定要做什么,但可以通过迭代返回的数组来输出字符串
html [Ljava.lang.String;@430bc84a
html
来自out.println(“html”)代码>需要关闭标记的位置
[Ljava.lang.String;@430bc84a
是字符串数组的默认toString,告诉您引用存在的位置。[-表示数组,下面的类型恰好是java.lang.String。这是JVM级别的输出
我会这样做:
String resultStr=”“;
for(字符串s:结果){
//格式-无论您希望如何,这会将每个元素分隔为一个空格
结果TR+=s+“”;
}
返回结果TR
如果要将结果放入表或其他内容中,可以返回数组并使用相同的for循环将每个元素封装到标记中。选择权在您,并且可以正常工作。打印数组时会发生这种情况,是的。您希望发生什么?另外,您的DOCTYPE错误。@immibis我希望得到JSON响应我想对于您所指的DOCKTYPE,在html
中包含
,对吗?我为sendHttpRequest
方法添加了额外的代码,其中调用了toString
方法writer.write(requestParams.toString());
,您认为这可能是问题所在吗?我为sendHttpRequest
方法添加了额外的代码,其中调用了toString
方法writer.write(requestParams.toString());
,您认为这可能是问题所在吗?Servlets不会自动将您的响应转换为JSON,您必须手动转换。您发送请求的方式不会改变您的响应的格式。一种快速而肮脏的检查方法是使用GSON
将您的响应序列化为JSON。更好的解决方案是可以使用Jersey或RESTEasy等工具。这些工具提供了一个健壮的框架,包括自动序列化/反序列化。谢谢你的回答。我还有几个问题。1)你认为行urlConn.setRequestProperty(“接受”,“应用程序/json”)是否;
在我的代码中接受JSON格式,该格式可用于在浏览器上显示JSON响应?2)如果我必须使用您建议的脏方法,我可以在哪里使用GSON
在我的代码中?Accept
头通知服务器客户端将接受何种数据格式。由服务器对数据进行编码其中一种格式的ata。要使用GSON
编辑doGet
读取输出.println(GSON.toJson(Test_Servlet(“abc”、“xyz”、“pqr”);
。必须先实例化GSON
对象。
html [Ljava.lang.String;@430bc84a