今天在写一个jsp页面请求一个rest接口,并把返回的json串返回的过程中出现了一个很奇怪的问题——jsp返回的json串前面多出来了一个null。直接调用rest接口并没有这样的情况,跟同事请教以后发现是因为字符串在声明的时候赋值为null了,在后面再对字符串进行拼接的时候就在开始位置出现了null,解决办法有两个:
- 使用String类型的话再声明的时候赋值为空串。再进行字符串拼接,示例如下:
String result = "";
result += line;
- 使用StringBuffer或者StringBuilder,拼接的时候使用append方法,示例如下:
StringBuilder sb = new StringBuilder();
sb.append(line);
下面是截取的打印有null的代码,可能的原因是,vm在进行拼接的时候,如果之前声明为null的会把null放在最前面进行拼接。
String content = null;
String line;
String result = "";
String url = "http://localhost:8133/xxxxx/rest/xxxx/";
String method = request.getParameter("callMethod");
if ("queryKeyKpiValues".equals(method)) {
url += "queryKeyKpiValues";
URL postUrl = new URL(url);
HttpURLConnection connection = (HttpURLConnection) postUrl.openConnection();
connection.setDoInput(true);
connection.setDoOutput(true);
connection.setRequestMethod("POST");
connection.setUseCaches(false);
connection.setInstanceFollowRedirects(true);
connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
connection.connect();
DataOutputStream outputStream = new DataOutputStream(connection
.getOutputStream());
String keyKpiType = request.getParameter("keyKpiType");
if (keyKpiType != null) {
content = "keyKpiType=" + URLEncoder.encode(keyKpiType, "utf-8");
}
String timeType = request.getParameter("timeType");
if (timeType != null) {
content += "?timeType=" + URLEncoder.encode(timeType,"utf-8");
}
outputStream.writeBytes(content);
outputStream.flush();
outputStream.close(); // flush and close
BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream(), "UTF-8"));
while ((line = reader.readLine()) != null) {
result += line;
}
reader.close();
connection.disconnect();
out.print(result);
}
在迁移一个老应用的时候又遇到了另外一个问题。
错误信息: Unable to compile class for JSP: An error occurred at line: 27 in the jsp file: /kpi/kpiBasicConf.jsp The type java.lang.CharSequence cannot be resolved. It is indirectly referenced from required .class files 24: for (int i = 0; i < l.size(); i++) { 25: Code code = l.get(i); 26: JSONArray arr2 = new JSONArray(); 27: arr2.put(code.getConfigID()); 28: arr2.put(code.getConfigName()); 29: arr.put(arr2); 30: } Stacktrace:
Stack Trace is :
org.apache.jasper.JasperException: Unable to compile class for JSP:
An error occurred at line: 27 in the jsp file: /kpi/kpiBasicConf.jsp
The type java.lang.CharSequence cannot be resolved. It is indirectly referenced from required .class files
24: for (int i = 0; i < l.size(); i++) {
25: Code code = l.get(i);
26: JSONArray arr2 = new JSONArray();
27: arr2.put(code.getConfigID());
28: arr2.put(code.getConfigName());
29: arr.put(arr2);
30: }
错误原因是因为低版本的tomcat不兼容jdk8。包括tomcat6和一些早期版本的tomcat7.