在applet 中代码如下:
public static void sendNetObjectResult(String url, ArrayList pointList){
try{
URL mapServer = new URL(url);
URLConnection s = mapServer.openConnection();
s.setUseCaches(false);
s.setDoOutput(true);
ObjectOutputStream bw = new ObjectOutputStream(s.getOutputStream());
bw.writeObject(pointList);
bw.flush();
DataInputStream in = new DataInputStream(s.getInputStream());
String result = in.readUTF();
System.out.println("result:"+result);
in.close();
bw.close();
}catch(Exception e){
}
}在servlet中 代码如下:
public static ArrayList getNetObjectResult(HttpServletRequest request, HttpServletResponse response) {
ArrayList pointArray = null;
try {
ObjectInputStream ois = new ObjectInputStream(request.getInputStream());
pointArray = (ArrayList) ois.readObject();
DataOutputStream out = new DataOutputStream(response.getOutputStream());
out.writeUTF("success");
out.flush();
ois.close();
out.close();
return pointArray;
}catch(Exception e){
e.printStackTrace();
}
return null;
} 运行后 结果抛出异常:
java.io.StreamCorruptedException: invalid stream header
at java.io.ObjectInputStream.readStreamHeader(ObjectInputStream.java:753
)
at java.io.ObjectInputStream.<init>(ObjectInputStream.java:268)
at tp.util.UtilTools.getNetObjectResult(UtilTools.java:39)
at tp.web.MapperServlet.renderMap(MapperServlet.java:215)
at tp.web.MapperServlet.service(MapperServlet.java:94)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:90)
at com.caucho.server.dispatch.ServletFilterChain.doFilter(ServletFilterC
hain.java:99)
at tp.web.EncodingFilter.doFilter(EncodingFilter.java:31)
at com.caucho.server.dispatch.FilterFilterChain.doFilter(FilterFilterCha
in.java:70)
at com.caucho.server.webapp.WebAppFilterChain.doFilter(WebAppFilterChain
.java:163)
at com.caucho.server.dispatch.ServletInvocation.service(ServletInvocatio
n.java:208)
at com.caucho.server.http.HttpRequest.handleRequest(HttpRequest.java:259
)
at com.caucho.server.port.TcpConnection.run(TcpConnection.java:341)
at com.caucho.util.ThreadPool.runTasks(ThreadPool.java:467)
at com.caucho.util.ThreadPool.run(ThreadPool.java:408)
at java.lang.Thread.run(Thread.java:595)请问高手 这是哪里出了问题呢?
public static void sendNetObjectResult(String url, ArrayList pointList){
try{
URL mapServer = new URL(url);
URLConnection s = mapServer.openConnection();
s.setUseCaches(false);
s.setDoOutput(true);
ObjectOutputStream bw = new ObjectOutputStream(s.getOutputStream());
bw.writeObject(pointList);
bw.flush();
DataInputStream in = new DataInputStream(s.getInputStream());
String result = in.readUTF();
System.out.println("result:"+result);
in.close();
bw.close();
}catch(Exception e){
}
}在servlet中 代码如下:
public static ArrayList getNetObjectResult(HttpServletRequest request, HttpServletResponse response) {
ArrayList pointArray = null;
try {
ObjectInputStream ois = new ObjectInputStream(request.getInputStream());
pointArray = (ArrayList) ois.readObject();
DataOutputStream out = new DataOutputStream(response.getOutputStream());
out.writeUTF("success");
out.flush();
ois.close();
out.close();
return pointArray;
}catch(Exception e){
e.printStackTrace();
}
return null;
} 运行后 结果抛出异常:
java.io.StreamCorruptedException: invalid stream header
at java.io.ObjectInputStream.readStreamHeader(ObjectInputStream.java:753
)
at java.io.ObjectInputStream.<init>(ObjectInputStream.java:268)
at tp.util.UtilTools.getNetObjectResult(UtilTools.java:39)
at tp.web.MapperServlet.renderMap(MapperServlet.java:215)
at tp.web.MapperServlet.service(MapperServlet.java:94)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:90)
at com.caucho.server.dispatch.ServletFilterChain.doFilter(ServletFilterC
hain.java:99)
at tp.web.EncodingFilter.doFilter(EncodingFilter.java:31)
at com.caucho.server.dispatch.FilterFilterChain.doFilter(FilterFilterCha
in.java:70)
at com.caucho.server.webapp.WebAppFilterChain.doFilter(WebAppFilterChain
.java:163)
at com.caucho.server.dispatch.ServletInvocation.service(ServletInvocatio
n.java:208)
at com.caucho.server.http.HttpRequest.handleRequest(HttpRequest.java:259
)
at com.caucho.server.port.TcpConnection.run(TcpConnection.java:341)
at com.caucho.util.ThreadPool.runTasks(ThreadPool.java:467)
at com.caucho.util.ThreadPool.run(ThreadPool.java:408)
at java.lang.Thread.run(Thread.java:595)请问高手 这是哪里出了问题呢?
public static void sendNetObjectResult(String url, ArrayList pointList)在servlet中获得 ArrayList 的数据 应该跟applet序列化没什么关系把如果有关系 应该怎样处理呢?
因此,ArrayList本身实现了Serializable没有问题,但是List中存放的对象,假如是你自己定义的,没有实现Serializable,那么也是不行的,序列化后的内容将不能反序列化,会出现上面的序列化文件头部不能识别的错误。
Double[] doubleArray = new Double[2];
doubleArray[0] = new Double(e.getX());
doubleArray[1] = new Double(e.getY());
pointList.add(doubleArray);你说这样有没有问题呢?
import com.mapinfo.mapj.MapJ;
import com.mapinfo.mapxtreme.client.MapXtremeImageRenderer;
import com.mapinfo.util.DoublePoint;
import com.mapinfo.util.DoubleRect;
import com.mapinfo.xmlprot.mxtj.ImageRequestComposer;
import java.awt.Color;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.*;
import tp.util.UtilTools;;
public class MapperServlet extends HttpServlet
{
private static String m_mapPath = "";
private static String m_fileToLoad = "";
private static String m_mxtURL = "";
private boolean m_debug = false;
private int m_mapWidth = 500;
private int m_mapHeight = 350;
public final int NO_TOOL = 0; //取消操作
public final int ZOOM_IN_TOOL = 1; //普通放大
public final int ZOOM_OUT_TOOL = 2; //普通缩小
public final int PAN_TOOL = 3; //平移
private final int Rect_TOOL = 4; //矩形拉框放大
public final int DISTANCE_TOOL = 5; //测距离
private final int DrawPoints_TOOL = 11; //画点
private final int DrawPolygons_TOOL = 13; //画多边形
public static final int NUM_OF_COLORS = 256;
public static final Color BACKGROUND_COLOR = Color.WHITE; public MapperServlet(){
} public void init(ServletConfig config)
throws ServletException {
super.init(config);
String strParam = getInitParameter("mappath");
if(strParam != null){
m_mapPath = strParam;
}
strParam = getInitParameter("filetoload");
if(strParam != null){
m_fileToLoad = strParam;
}
strParam = getInitParameter("mapxtremeurl");
if(strParam != null && strParam.length() > 0){
m_mxtURL = strParam;
}
strParam = getInitParameter("mapwidth");
if(strParam != null){
m_mapWidth = Integer.valueOf(strParam).intValue();
}
strParam = getInitParameter("mapheight");
if(strParam != null){
m_mapHeight = Integer.valueOf(strParam).intValue();
}
strParam = getInitParameter("debug");
if(strParam != null && strParam.equalsIgnoreCase("true")){
m_debug = true;
}
} public void service(HttpServletRequest req, HttpServletResponse res)
throws ServletException, IOException {
HttpSession session = req.getSession(true);
String reqParam = ""; //获得request请求的临时变量
if(req.getParameter("init") != null) {
reqParam = req.getParameter("mapwidth");
if (reqParam != null) {
m_mapWidth = Integer.parseInt(reqParam);
}
reqParam = req.getParameter("mapheight");
if (reqParam != null) {
m_mapHeight = Integer.parseInt(reqParam);
}
res.setContentType("text/html");
PrintWriter out = new PrintWriter(res.getOutputStream());
String thisServletName = HttpUtils.getRequestURL(req).toString();
out.println(res.encodeURL(thisServletName));
out.close();
} else {
if(m_debug){
debugSession(req, session);
}
try {
renderMap(session, req, res);
}
catch(ServletException se) {
log(se.getMessage());
throw se;
}
catch(IOException ioe) {
log(ioe.getMessage());
throw ioe;
}
catch(Exception e) {
log(e.getMessage());
}
}
}
throws Exception {
MapJ myMap = new MapJ();
myMap.setDeviceBounds(new DoubleRect(0.0D, 0.0D, m_mapWidth, m_mapHeight));
try {
if(m_fileToLoad.endsWith(".gst")) {
myMap.loadGeoset(m_fileToLoad, m_mapPath, null);
} else {
myMap.loadMapDefinition(m_fileToLoad);
}
}
catch(Exception e) {
log("Can't load geoset: " + m_fileToLoad + "\n");
throw e;
}
return myMap;
} private void renderMap(HttpSession session, HttpServletRequest req, HttpServletResponse res)
throws Exception
{
Double xStr = null; //精度临时变量
Double yStr = null; //纬度临时变量
Double ptx1 = null; // 测距离起点x坐标
Double pty1 = null; // 测距离起点y坐标
Double ptx2 = null; // 测距离终点x坐标
Double pty2 = null; // 测距离终点x坐标
int tool = 0; //体图工具栏对应变量
String reqParam = ""; //获得request请求的临时变量
if((reqParam = req.getParameter("tool")) != null) {
tool = Integer.valueOf(reqParam).intValue();
}
MapJ myMap = (MapJ)session.getAttribute("mapinfo.mapj");
if(myMap == null){
myMap = initMapJ();
}
if(tool != NO_TOOL) {
DoublePoint newpoint = myMap.getCenter();
double newZoom = myMap.getZoom();
if((reqParam = req.getParameter("ptx")) != null) {
xStr = new Double(reqParam);
}
if((reqParam = req.getParameter("pty")) != null) {
yStr = new Double(reqParam);
}
if(xStr != null && yStr != null) {
DoublePoint screenpoint = new DoublePoint(xStr.doubleValue(), yStr.doubleValue());
newpoint = myMap.transformScreenToNumeric(screenpoint);
}
if(tool == ZOOM_IN_TOOL) {
newZoom /= 2D;
myMap.setZoomAndCenter(newZoom, newpoint);
}
if(tool == ZOOM_OUT_TOOL) {
newZoom *= 2D;
myMap.setZoomAndCenter(newZoom, newpoint);
}
if(tool == PAN_TOOL) {
myMap.setZoomAndCenter(newZoom, newpoint);
}
if (tool == DISTANCE_TOOL) {
if ((reqParam = req.getParameter("ptx1")) != null) {
ptx1 = new Double(reqParam);
}
if ((reqParam = req.getParameter("pty1")) != null) {
pty1 = new Double(reqParam);
}
if ((reqParam = req.getParameter("ptx2")) != null) {
ptx2 = new Double(reqParam);
}
if ((reqParam = req.getParameter("pty2")) != null) {
pty2 = new Double(reqParam);
}
if (ptx1 != null && pty1 != null && ptx2 != null && pty2 != null) {
DoublePoint firstPoint = new DoublePoint(ptx1.doubleValue(), pty1.doubleValue());
DoublePoint secondPoint = new DoublePoint(ptx2.doubleValue(), pty2.doubleValue());
firstPoint = myMap.transformScreenToNumeric(firstPoint);
secondPoint = myMap.transformScreenToNumeric(secondPoint);
double distance = myMap.sphericalDistance(firstPoint, secondPoint);
UtilTools.sendNetDoubleResult(String.valueOf(distance), res);
}
}
if (tool == Rect_TOOL) {
reqParam = req.getParameter("Zoom");
Double zoom = null;
if (reqParam != null) {
zoom = new Double(reqParam);
newZoom /= zoom.doubleValue();
}
if ((reqParam = req.getParameter("ptx")) != null) {
ptx1 = new Double(reqParam);
}
if ((reqParam = req.getParameter("pty")) != null) {
pty1 = new Double(reqParam);
}
DoublePoint screenpoint = new DoublePoint(ptx1.doubleValue(), pty1.doubleValue());
newpoint = myMap.transformScreenToNumeric(screenpoint);
myMap.setZoomAndCenter(newZoom, newpoint);
}
if (tool == DrawPoints_TOOL){
CMapXtremeExtendFunction functionTool = new CMapXtremeExtendFunction();
functionTool.DrawPoints(myMap,newpoint,"Annotations","小车") ;
functionTool.createLabelFeature(myMap,"Annotations");
}
if (tool == DrawPolygons_TOOL){
ArrayList pointList = UtilTools.getNetObjectResult(req,res);
CMapXtremeExtendFunction functionTool = new CMapXtremeExtendFunction();
DoublePoint[] pointArray = new DoublePoint[pointList.size()];
for(int i=0; i<pointList.size(); i++){
pointArray[i] = new DoublePoint();
pointArray[i].set((double[])pointList.get(i));
}
functionTool.DrawPolygons(myMap, pointArray, pointList.size(), "Annotations");
session.setAttribute("mapinfo.mapj", myMap);
return;
}
if(m_debug) {
log("tool: " + tool + " setting zoom to: " + newZoom + " at: " + newpoint);
}
}
try {
MapXtremeImageRenderer rr = new MapXtremeImageRenderer(m_mxtURL);
rr.render(ImageRequestComposer.create(myMap, 256, BACKGROUND_COLOR, "image/gif"));
rr.toStream(res.getOutputStream());
}
catch(Exception e) {
log(e.getMessage());
throw e;
}
session.setAttribute("mapinfo.mapj", myMap);
} private void debugSession(HttpServletRequest req, HttpSession session) {
log("Request and Session Data:");
log("Session ID in Request: " + req.getRequestedSessionId());
log("Session ID in Request from Cookie: " + req.isRequestedSessionIdFromCookie());
log("Session ID in Request from URL: " + req.isRequestedSessionIdFromURL());
log("Valid Session ID: " + req.isRequestedSessionIdValid());
log("Session Data:");
log("New Session: " + session.isNew());
log("Session ID: " + session.getId());
log("Creation Time: " + session.getCreationTime());
log("Last Accessed Time: " + session.getLastAccessedTime());
}}
再根据 reqParam 的值来决定程序的流转啊 实在是不好办啊