Avatar billede henrik_40 Juniormester
17. juli 2005 - 22:39 Der er 15 kommentarer og
1 løsning

Billede v.hj.a. JSP

Hej
Jeg sidder og roder med Jacob Nordfalks bog "webprogrammering med JSP". I bogens kap2 er et lille eksempel på at konstruere et billede med jsp-kode. Filen kan hentes her:
http://javabog.dk/JSP/kode/kapitel_02/billede.jsp
<%@ page import="java.awt.*,java.awt.image.*,com.sun.image.codec.jpeg.*" %>
<%@ page contentType="image/jpeg" %>

<%
    // opret billede <title>Billede</title>
    BufferedImage billede = new BufferedImage(300, 100, BufferedImage.TYPE_INT_RGB);
    Graphics2D g = billede.createGraphics();

    //g.setRenderingHint( // s&#65533; evt. tegnevink til trappeudj&#65533;ning (antialias)
    //    RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);

    // udfyld baggrund
    g.setColor(Color.white);
    g.fillRect(0,0,300, 100);

    // tegn ramme
    g.setColor(Color.red);
    g.drawRect(15, 15, 270, 70);

    // tegn nogle andre ting
    g.setColor(Color.black);
    g.fillOval(5,20,250,30);
    g.setColor(Color.green);
    g.drawLine(10,10,280,40);

    // skriv tekst, ud fra parameter eller sessionsattribut "billedtekst"
    String tekst = request.getParameter("billedtekst");
    if (tekst==null) tekst = (String) session.getAttribute("billedtekst");
    if (tekst==null) tekst = "Hej grafiske verden!"; // standardtekst
    g.drawString(tekst,50,40);

    // f&#65533;dig med at tegne, frigiv grafik-objektet
    g.dispose();

    // og konvert&#65533; billede til JPG-format og send billedet
    ServletOutputStream sos = response.getOutputStream();
    JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(sos);

  // S&#65533; kvaliteten af det genererede JPG-billede
  JPEGEncodeParam param = JPEGCodec.getDefaultJPEGEncodeParam(billede);
  param.setQuality(0.90f,false); // 0.75 er standardkvalitet
  encoder.setJPEGEncodeParam(param);

    encoder.encode(billede);
%>

Jeg har forsøgt at køre filen lokalt på min pc ved Tomcat. Jeg får fejlmeddelelsen:

description The server encountered an internal error () that prevented it from fulfilling this request.

exception

javax.servlet.ServletException
    org.apache.jasper.runtime.PageContextImpl.doHandlePageException(PageContextImpl.java:825)
    org.apache.jasper.runtime.PageContextImpl.handlePageException(PageContextImpl.java:758)
    org.apache.jsp.billede_jsp._jspService(billede_jsp.java:95)
    org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:94)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:856)..... osv...

Ved at lægge filen ud på min hjemmeside (www.henrikhartig.dk/billede.jsp) får jeg en anderledes fejlmeddelse:


500 Servlet Exception

java.lang.NoClassDefFoundError
    at java.lang.Class.forName0(Native Method)
    at java.lang.Class.forName(Class.java:141)
    at java.awt.GraphicsEnvironment.getLocalGraphicsEnvironment(GraphicsEnvironment.java:62)
    at java.awt.image.BufferedImage.createGraphics(BufferedImage.java:1041)
    at _billede__jsp._jspService(/billede.jsp:7)
    at com.caucho.jsp.JavaPage.service(JavaPage.java:75)
    at com.caucho.jsp.Page.subservice(Page.java:506)
    at com.caucho.server.http.FilterChainPage.doFilter(FilterChainPage.java:182)
    at com.caucho.server.http.Invocation.service(Invocation.java:315)
    at com.caucho.server.http.CacheInvocation.service(CacheInvocation.java:135)
    at com.caucho.server.http.RunnerRequest.handleRequest(RunnerRequest.java:346)
    at com.caucho.server.http.RunnerRequest.handleConnection(RunnerRequest.java:274)
    at com.caucho.server.TcpConnection.run(TcpConnection.java:139)
    at java.lang.Thread.run(Thread.java:534)



Håber nogen kan hjælpe mig.
/henrik
Avatar billede arne_v Ekspert
17. juli 2005 - 22:44 #1
min erfaring er at det er håbløst at bruge en JSP side til at generere binære data med

brug en servlet !
Avatar billede arne_v Ekspert
17. juli 2005 - 22:45 #2
et (primitivt) eksempel på en sådan servlet:

package test;

import java.awt.*;
import java.awt.image.*;
import java.io.*;
import java.net.*;

import javax.servlet.*;
import javax.servlet.http.*;

import com.sun.image.codec.jpeg.*;

public class Blue extends HttpServlet {
    public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("image/jpeg");
      BufferedImage bi = new BufferedImage(100, 100, BufferedImage.TYPE_INT_RGB);
      Graphics g = bi.getGraphics();
      g.setColor(Color.WHITE);
      g.fillRect(0, 0, 100, 100);
      g.setColor(Color.BLUE);
      g.fillOval(20, 20, 60, 60);
      try {
        JPEGImageEncoder ecd = JPEGCodec.createJPEGEncoder(response.getOutputStream());
        ecd.encode(bi);
      } catch (FileNotFoundException e) {
        e.printStackTrace();
      } catch (ImageFormatException e) {
        e.printStackTrace();
      } catch (IOException e) {
        e.printStackTrace();
      }
    }
}
Avatar billede arne_v Ekspert
17. juli 2005 - 22:47 #3
JPEGImageEncoder ecd = JPEGCodec.createJPEGEncoder(response.getOutputStream());
        ecd.encode(bi);

kan iøvrigt erstattes af

        ImageIO.write(bi, "JPEG", response.getOutputStream());

i alle nyere Java versioner (og så undgår man at referere til de udokumenterede
SUN klasser)
Avatar billede henrik_40 Juniormester
18. juli 2005 - 10:38 #4
Jeg har ikke prøvet at lave en servlet, men har dog forstået at en servlet er en javaklasse, som kreere et html-dokument (modsat jsp, som er indlejret javakode i et html-dokument).

Egentlig ville jeg følge http://javabog.dk's eksempel, for at ende op med mit eget lille billede som dette:
http://javabog.dk:8080/JSP/kode/kapitel_02/billede_med_avatar.jsp
Jeg så ville lægge på min hjemmeside.

Som sagt har jeg ikke lavet servlet, men skulle jeg følge dit eksempel, må jeg lige have be/afkræftet om det er sådan jeg gør:
1) Filen til dit programeksempel skal hedde test.class.
2) I WEB-INF mappen laves et web.xml-dokument:
  <web-app>
    <servlet>
      <servlet-name>Min første servlet</servlet-name>
      <servlet-class>test</servlet-class>
    </servlet>

    <servlet-mapping>
      <servlet-name>Min første servlet</servlet-name>
      <url-patterne>/servlet/test</url-pattern>
    </servlet-mapping>


Eftersom billedet skal indgå i et html-dokument, mener du så stadig at servlet er den bedste løsning? Opretter servlet ikke et "helt" html-dokument?
Ellers kan vi gå tilbage til mit oprindelige spørgsmål - hvad, som er galt med min jsp-fil?
Sikkert dumme spørgsmål, men jeg ved jo heller intet om servlet.
Avatar billede arne_v Ekspert
18. juli 2005 - 11:02 #5
package test;

...

public class Blue extends HttpServlet {

kræver en fil:

WEB-INF/classes/test/Blue.class

og en WEB-INF/web.xml med:

    <servlet>
      <servlet-name>Min første servlet</servlet-name>
      <servlet-class>test.Blue</servlet-class>
    </servlet>

    <servlet-mapping>
      <servlet-name>Min første servlet</servlet-name>
      <url-patterne>/Blue</url-pattern>
    </servlet-mapping>

eller noget tilsvarende
Avatar billede arne_v Ekspert
18. juli 2005 - 11:05 #6
uanset hvad du gør så må modellen jo være:

et eller andet genererer HTML som indeholder:

<IMG SRC="enellerandenurl">

enellerandenurl skal så returnere et billede

(og det sådan set uanset om det er JSP eller servlet eller ASP eller PHP eller ...)
Avatar billede arne_v Ekspert
18. juli 2005 - 11:07 #7
Der er ikke noget galt med din JSP andet end at der er stor sandsynelighed for
at JSP kompileren vil begynde at sende linieskift inden du starte med at sende
binære data

du kan evt. prøve:

<%@ page import="java.awt.*,java.awt.image.*,com.sun.image.codec.jpeg.*" %><%@ page contentType="image/jpeg" %><%
    // opret billede <title>Billede</title>
    BufferedImage billede = new BufferedImage(300, 100, BufferedImage.TYPE_INT_RGB);
    ...

og se om det hjælper
Avatar billede arne_v Ekspert
18. juli 2005 - 11:11 #8
jeg skal iøvrigt lige sige at alt dette relaterer sig til java web apps
generelt og muligvis er årsagen til dit Tomcxat problem

dit web hotel Resin problem skyldes noget helt andet - jeg kan forestille
mig 2 muligheder:

1)  der er problemer fordi det er en Linux box og man kan ikke bruge AWT uden
    X på Linux

2)  det kører på en ikke SUN Java og den kan ikke finde SUN JPGE klasserne

der findes løninger på #1

#2 bør kunne løses ved at omskrive som beskrevet 17/07-2005 22:47:53
Avatar billede trp79 Nybegynder
18. juli 2005 - 19:31 #9
-->henrik_h
må man spørge hvilket webhotel, der ligger bag din hjemmeside? hvis der er altså er et...? Jeg kan iøvrigt oplyse, at Dansite, som jeg selv har, hoster jsp/servlet på en freebsd server, og ikke har tilpasset det sådan, at der er mulighed for at bruge AWT klasserne. Det skulle der dog komme.... siger de!
Avatar billede henrik_40 Juniormester
18. juli 2005 - 20:57 #10
Jeg har Dansite. Så er det vel derfor det ikke virker? Jeg gør i min oprindelige kode brug af AWT (<%@ page import="java.awt.*,java.awt....)
Avatar billede henrik_40 Juniormester
18. juli 2005 - 22:25 #11
arne_v ->
Jeg har fået nogle muligheder at tænke over. Problemet ligger tilsyneladende i AWT-klassen (18/07-2005 11:11:58).
Hvis du vil have point, så læg et svar.
Avatar billede arne_v Ekspert
18. juli 2005 - 22:30 #12
ok
Avatar billede arne_v Ekspert
18. juli 2005 - 22:32 #13
tricksene er

-Djava.awt.headless=true

og

http://www.eteks.com/pja/en/
Avatar billede henrik_40 Juniormester
18. juli 2005 - 22:36 #14
tak, ser spændende ud.
Avatar billede arne_v Ekspert
18. juli 2005 - 22:39 #15
det er ret nemt hvis det er ens egen server

på et web hotel, så ...
Avatar billede trp79 Nybegynder
20. juli 2005 - 18:50 #16
Jeg har skrevet lidt frem og tilbage med Dansite om headless, dog som sagt uden resultat.. men jo flere der ønsker det jo bedre :) Du kan følge med i hvorvidt headless er sat til true på dansite her: http://www.ausumnet.dk/headless/
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester