Java Web下访问外部jar,实例后的Object类型转化的问题

2014-11-24 02:45:25 · 作者: · 浏览: 0
为了把问题说清楚,假设了如下的实验环境、测试过程和问题。

一、实验环境:

1.存在一个Java Project,工程名为JarTest.(将其导出jar文件为test.jar)
内有两个类,一个为抽象父类A,一个为子类B,代码如下。

package cn.edu.sdu;
public abstract class A {
	public String name = "";
	public abstract String process();
}

package cn.edu.sdu;
public class B extends A {
	public int id;
	
	public String getName(){
		return name;
	}
	
	public void setName(String name){		
		this.name = name;
	}
	public int getId() {
		return id;
	}




	public void setId(int id) {
		this.id = id;
	}




	@Override
	public String process() {
		// TODO Auto-generated method stub
		return this.id+""+this.name;
	}


}




2.在Eclipse中存在一个Dynamic Web Project,工程名为Test。把上面导出的test.jar文件拷贝到Test工程的WebContent目录下。另本工程还有如下class、Servlet,xml和index.jsp。代码如下。


1)抽象类A
package cn.edu.sdu;
public abstract class A {
	public String name = "";
	public abstract String process();
}

2)Servlet文件,负责访问jar文件,创建B类的对象,并转化成A类。
import java.io.IOException;
import java.io.PrintWriter;
import java.net.URL;
import java.net.URLClassLoader;


import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;


import cn.edu.sdu.A;


/**
 * Servlet implementation class HelloWorldServlet
 */
@WebServlet("/HelloWorldServlet")
public class HelloWorldServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;


    /**
     * Default constructor. 
     */
    public HelloWorldServlet() {
        // TODO Auto-generated constructor stub
    }


	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		response.setContentType("text/html;charset=gb2312");
		PrintWriter out = response.getWriter();
		out.println("");
		out.println("");
		out.println("动态使用jar");		
		
		String jarPath = "http://localhost:8080/Test/test.jar";
		String classPath = "cn.edu.sdu.B";


		URLClassLoader uload;
		Object pya;
		try {
			A a = null;
			uload = new URLClassLoader(new URL[]{new URL(jarPath)});
			a = (A)uload.loadClass(classPath).newInstance();				
			out.println("Web 下访问jar
"); out.println(a.getClass()); out.println("
成功创建了A的Object"); } catch (Exception e) { e.printStackTrace(); out.println("Web下访问jar创建Object出现了错误!
"+e.toString()+"
"); } out.println(""); out.println(""); } /** * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) */ protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub doGet(request,response); } }

3)配置servlet的web.xml文件,在WEB-INF的根目录下。
  

  
  
    
    
     Hello
     
    
     HelloWorldServlet
     
   


  
   
  
    
    
     Hello
     
    
     /http://blog.csdn.net/cnlht/article/details/hello
     
     



  

4)index.jsp文件,web下默认访问的页面。
<%@ page language="java" contentType="text/html; charset=GB18030"
    pageEncoding="GB18030"%>






  
Insert title here


	链接Servlet


二、执行过程

1.运行web 后,访问index.jsp后,如下图的错误提示。

\


点击链接后,访问servlet,如下图。有错误,没有成功,不能将B转化成A。

\


console界面的提示如下图。

\


2、如果在工程内添加一个Test类,代码如下图。< http://www.2cto.com/kf/ware/vc/" target="_blank" class="keylink">vc3Ryb25nPjwvcD48cD48c3Ryb25nPta00NC94bn7yse/ydLUvatC16q7r7PJQaGjPC9zdHJvbmc+PC9wPjxwPjwvcD48cHJlIGNsYXNzPQ=="brush:java;">import java.net.URL; import java.net.URLClassLoader; import cn.edu.sdu.A; public class Test { public static void main(String[] args){ String jarPath = "http://localhost:8080/Test/test.jar"; String classPath = "cn.edu.sdu.B"; URLClassLoader uload; Object pya; try { A a = null; uload = new URLClassLoader(new URL[]{new URL(jarPath)}); a = (A)uload.loadClass(classPath).newInstance(); System.out.println("Web 下访问jar"); System.out.println(a.getClass()); System.out.println("成功创建了A的Object"); } catch (Exception e) { e.printStackTrace(); System.out.println("Web下访问jar创建Object出现了错误!"+e.toString()); } } }

    棣   糙 椐V… http://www.2cto.com/kf/ware/Java/Java Application 直接执行,可以访问jar并创建B的Object后,并转化成A的Object?

2、为什么Java Web的项目下,不能将jar创建的B的Object后不能转化成A的Object?

3、如何实现第二个问题,在Web下访问外部Jar,创建的B的Object转化成A的Object?