鍍金池/ 問答/Java  Linux/ servlet路徑問題

servlet路徑問題

代碼一:

package com.main.service;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;

import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import java.io.PrintWriter;


public class ReadData {
    
         public static void main(String[] args) {
                 try {
                     testSaxReader("person");
                     System.out.println("---------");
                     testSaxReader("隸屬度");
                 } catch (Exception e) {
                     e.printStackTrace();
                 }
                 
             }
              public static void testSaxReader(String item) throws DocumentException, FileNotFoundException {
                  SAXReader saxReader = new SAXReader();
                  System.out.println("工程路徑:"+System.getProperty("user.dir"));//問題所在
                  FileInputStream file = new FileInputStream("src/0625.xml");
                  Document doc = saxReader.read(file);
                  Element menu = doc.getRootElement();
                  System.out.println(menu.getName());
                  org.dom4j.Node person=menu.selectSingleNode("/Menu//Item[@Title='"+item+"']");
                  String nodeValue = person.getText();
                  System.out.println(nodeValue);
                  File fp=new File("./data/"+item+".txt");
                  PrintWriter pfp= new PrintWriter(fp);
                  pfp.print(nodeValue);
                  pfp.close();
                  
              }
    
}

代碼一有main方法,System.out.println("工程路徑:"+System.getProperty("user.dir"));打印出來的結(jié)果是工程路徑:E:\workspace\outer\javaConnectR,是我項(xiàng)目的路徑。

代碼二:

package com.main.service;


import java.awt.Graphics;
import java.awt.GraphicsConfiguration;
import java.awt.GraphicsDevice;
import java.awt.GraphicsEnvironment;
import java.awt.HeadlessException;
import java.awt.Image;
import java.awt.MediaTracker;
import java.awt.Toolkit;
import java.awt.Transparency;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;


import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JFrame;

import org.rosuda.REngine.REXP;
import org.rosuda.REngine.Rserve.RConnection;

import com.main.util.Rservel;

public class Execute extends JFrame{
private static final long serialVersionUID=1L;
static Image img;
public REXP getRobj() throws Exception{
    System.out.println("getRobj()");
    
    RConnection c=Rservel.getRConnection();
    c.eval("library(RColorBrewer)");
    c.eval("H <- c(7,12,28,3,41)");
    c.eval("colors<-brewer.pal(5,'Set1')");
    c.parseAndEval(" barplot(H,rep(1,5),col=colors);dev.off()");
    xp=c.parseAndEval("r=readBin('test.jpg','raw',3000*3000);unlink('test.jpg');r");
    return xp;
}
    
    
    public void createPlot(REXP xp, JFrame f,String path)throws Exception{
        
        try {
            Image image=Toolkit.getDefaultToolkit().createImage(xp.asBytes());
            BufferedImage bufferedImage=toBufferedImage(image);
            System.out.println("工程路徑:"+System.getProperty("user.dir"));
           ImageIO.write(bufferedImage, "JPG", new File(path+"/outImg/98.jpg"));//
          
       } catch (IOException e) {
           e.printStackTrace();
       }
    }

    public  BufferedImage toBufferedImage(Image image) {  
        if (image instanceof BufferedImage) {  
            return (BufferedImage)image;  
         }  
         image = new ImageIcon(image).getImage();  
         BufferedImage bimage = null;  
         GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();  
        try {  
             
            int transparency = Transparency.OPAQUE;   
             GraphicsDevice gs = ge.getDefaultScreenDevice();  
             GraphicsConfiguration gc = gs.getDefaultConfiguration();  
             bimage = gc.createCompatibleImage(  
             image.getWidth(null), image.getHeight(null), transparency);  
         } catch (HeadlessException e) {  
         }  
        
        if (bimage == null) {   
            int type = BufferedImage.TYPE_INT_RGB;   
             bimage = new BufferedImage(image.getWidth(null), image.getHeight(null), type);  
         }  
         Graphics g = bimage.createGraphics();  
         g.drawImage(image, 0, 0, null);  
         g.dispose();  
        
        return bimage;  
    } 

}


 

package com.main.web;

import java.io.IOException;
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 org.rosuda.REngine.REXP;
import org.rosuda.REngine.Rserve.RConnection;
import org.rosuda.REngine.Rserve.RserveException;

import com.main.service.Execute;

/**
 * Servlet implementation class ExecuteR
 */
@WebServlet("/ExecuteR")
public class ExecuteR extends HttpServlet {
    private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public ExecuteR() {
        super();
        // TODO Auto-generated constructor stub
    }

    /**
     * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String RSentences=request.getParameter("data");//這個(gè)例子必須到頁(yè)面點(diǎn)擊
        //System.out.println(filePath);
        String path=getServletContext().getRealPath("/");
        System.out.println("servlet路徑:"+path);
        Execute wc=new Execute();
        REXP xp;
        try {
            xp = wc.getRobj();
            wc.createPlot(xp,wc,path)
        } catch (Exception e) {
            e.printStackTrace();
        }
        
        
    }

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }

}

代碼二:沒有main方法,是一個(gè)java類,通過servlet調(diào)用System.out.println("工程路徑:"+System.getProperty("user.dir"));打印出來結(jié)果是工程路徑:E:\BE\eclipse\eclipse,是我安裝eclipse的路徑,不是項(xiàng)目路徑;代碼String path=getServletContext().getRealPath("/");打印出來結(jié)果是:servlet路徑:E:\workspace\eclipse_jee_mars2\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps\javaConnectR\

1.請(qǐng)問為什么會(huì)有這樣的區(qū)別??
2.我希望代碼二里的ImageIO.write(bufferedImage, "JPG", new File(path+"/outImg/98.jpg"));new File里的路徑是和代碼一System.getProperty("user.dir"));打印出來的路徑E:\workspace\outer\javaConnectR一致,為項(xiàng)目路徑。請(qǐng)問該怎么解決??

回答
編輯回答
乖乖噠
  1. user.dir 指向的是你啟動(dòng) JVM 的地方,你可以看看這里

代碼一是你從工程路徑下啟動(dòng)的,但是代碼二你的 Servlet 是被容器 (Tomcat等等)加載進(jìn) JVM 的,而此時(shí) user.dir 指的是這些容器的路徑,這方面你需要了解一下容器是怎樣運(yùn)行的。

  1. 你要分清楚:開發(fā)環(huán)境、上線環(huán)境。

你在 E:\workspace\outer\javaConnectR 寫代碼,這是開發(fā)環(huán)境,但是當(dāng)你打包成 .war 時(shí),它會(huì)被容器解壓到一個(gè)目錄,比如你代碼二中輸出的 E:\workspace\...\wtpwebapps\javaConnectR\,此時(shí)它無論如何也不可能按你所想去讀到開發(fā)時(shí)的路徑,因?yàn)榇a二實(shí)際運(yùn)行的時(shí)候文件已經(jīng)不在你開發(fā)的路徑上了。

2017年10月25日 09:02
編輯回答
薄荷糖

我就用通俗的話來說一下吧:

  1. System.out.println("工程路徑:"+System.getProperty("user.dir"));這段代碼由JVM執(zhí)行,因此輸出的是類路徑getServletContext().getRealPath("/");是由Tomcat執(zhí)行,在Eclipse下配置Tomcat,Tomcat會(huì)將代碼默認(rèn)輸出到另外的文件夾中(當(dāng)然了,該路徑是可以配置的)。

它倆輸出的結(jié)果不同主要是因?yàn)閳?zhí)行的主體不一致,JVM和Tocmat

  1. 你想要的是將圖片輸出到項(xiàng)目路徑對(duì)吧?可以在配置文件中配置,然后讀取就行啦。寫個(gè)properties,devProjectPath=http://localhost:8080/xxx,devProjectPath=http://localhost:8080/xxxproductionProjectPath=http://www.xxxx.com

水平有限,如果有錯(cuò)的地方請(qǐng)指出

2018年8月30日 19:24