简体   繁体   中英

How to Include a file outside the application (war) using jsp include

I am using "jsp:include" to include a static file in one of my jsp files. It works fine when the static html file is located inside the application folder. However if its kept outside the application folder it is not included in the JSP file.

Note: I have created a context for the folder where the static file is saved and I m able to view the html file with direct url.

Please help..

I have solved this problem using the c:import tag.

To define the dynamic URL I have used the bean:define tag. Thank you friends for the suggestions and help.

You can only use jsp:include for resources inside your web application context. You will need to either use java.io.File or similar to load from a file system path, or ClassLoader.getResource to load a resource from the classpath.

Added benefit of the <c:import> method is that you can set the encoding using the charEncoding attribute. You can't do this with either <%@include%> or <jsp:include> statements.

I using a class that have a method to get content from URL: Ex: http://link.inet.vn/seo-website/inet.html

public class URLReader
{
    public URLReader()
    {
        in = null;
        out = null;
        requestType = null;
        headers = null;
        content = null;
        headers = new Hashtable();
    }

    public void doGet(String server, String uri, int port)
    {
        try{
            Socket client = new Socket(server, port);
            client.setKeepAlive(true);
            in = new DataInputStream(client.getInputStream());
            out = new DataOutputStream(client.getOutputStream());
            out.writeBytes("GET " + uri + " HTTP/1.0\r\n");
            out.writeBytes("Host: " + server + "\r\n");
            out.writeBytes("Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */*\r\n");
            out.writeBytes("Accept-Language: en-us\r\n");
            out.writeBytes("Accept-Encoding: gzip, deflate\r\n");
            out.writeBytes("User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)\r\n");
            out.writeBytes("Connection: Keep-Alive\r\n");
            out.writeBytes("Content-Length: 0\r\n\r\n");
            out.flush();
            parseRequest();
            out.close();
            in.close();
            client.close();        
        }catch(Exception e){
            System.out.println(e.getMessage());
        }

        return;
    }

    public byte[] getContent()
    {
        return content;
    }

    public String getHeader(String name)
    {
        String key = (String)headers.get(name);
        return key;
    }

    public Hashtable getHeaders()
    {
        return headers;
    }

    public String getRequestType()
    {
        return requestType;
    }

    public static void main(String args[]) throws IOException
    {
        URLReader reader = new URLReader();

        reader.doGet("link.inet.vn", "/seo-website/inet.html", 80);
        if(reader.getContent() != null)
            System.out.println(new String(reader.getContent(),"UTF-8"));

    }

    private boolean parseRequest()
    {
        byte match[];
        int index;
        String line;
        match = (new byte[] {
            13, 10, 13, 10
        });
        index = 0;
        line = "";
        int i;
        try{
            while((i = in.read()) >= 0) 
            {
                if(i == match[index] && index <= 3)
                    index++;
                else
                    index = 0;
                if(index == 4)
                {
                    content = readHTTPContent();
                    break;
                }
                line = line + (char)i;
                if(line.length() > 2 && i == 10)
                {
                    int pos = line.indexOf(':');
                    if(pos != -1)
                    {
                        String name = line.substring(0, pos);
                        String value = line.substring(pos + 1, line.length()).trim();
                        setHeader(name, value);
                    } else
                    {
                        setRequestType(line.substring(0, line.length()).trim());
                    }
                    line = "";
                }
            }

            return true;
        }catch(Exception e){
            System.out.println(e.getMessage());
            return false;
        }                
    }

    private byte[] readHTTPContent()
        throws IOException
    {
        ByteArrayOutputStream baosContent = new ByteArrayOutputStream();
        int contentLength = 0;
        try {
            contentLength = Integer.parseInt( (String) headers.get("content-length"));
        } catch (Exception ex) {
            contentLength = 1024 * 1024;
        }
        int bytesToRead = 0;
        int bytesRead   = 0;
        int totalBytesRead = 0;
        int bufferSize = 1024;
        byte[] buffer = new byte[bufferSize];

        if (contentLength < bufferSize) {
            bytesToRead = contentLength;
        } else {
            bytesToRead = bufferSize;
        }
        do {
            try {
                bytesRead = in.read(buffer, 0, bytesToRead);
            } catch (InterruptedIOException e) {
                /* comms read timeout expired, no problem */
                System.out.println("Timeout reading from socket");
            }
            if (bytesRead == -1) {
                in.close();
               // throw new IOException("Connection was closed by client.");
                break;
            } else if (bytesRead > 0) {
                //////////////////////////////////////
                baosContent.write(buffer, 0, bytesRead);
                //////////////////////////////////////
                totalBytesRead += bytesRead;
            }
            // Left bytes to read
            if (contentLength - totalBytesRead > bufferSize) {
                bytesToRead = bufferSize;
            } else {
                bytesToRead = contentLength - totalBytesRead;
            }
        } while (totalBytesRead < contentLength);

        return baosContent.toByteArray();        
    }


    public void saveToFile(byte data[], String filename)
    {
        try{
            File f = new File(filename);
            FileOutputStream fout = new FileOutputStream(f);
            fout.write(data);
            fout.close();
        }catch(Exception e){
            System.out.println(e.getMessage());
        }        
        return;
    }


    private void setHeader(String key, String value)
    {
        headers.put(key.toLowerCase(), value);
    }

    private void setRequestType(String s)
    {
        requestType = new String(s);
    }

    private byte content[];
    private Hashtable headers;
    private DataInputStream in;
    private DataOutputStream out;
    private String requestType;
}

Just out of interest - what is the reason for wanting to do this? - there may be an alternative approach.

I suspect that you want to have some configuration that is independent of the WAR file, and is unique to each environment that the WAR is deployed to.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM