Web-TorMedlem sedan nov. 200011 794 inlägg
Det här funkar fint:
<% out.println("Hello World"); %>
Men det här funkar inte:
<%=out.println("Hello World")%>
Jag får följande fel:
[b]500 Servlet Exception[/b]
Note: sun.tools.javac.Main has been deprecated.
/jsp/test/test2.jsp:20: Incompatible type for method. Can't convert void
to java.lang.Object.
out.print((out.println("Hello World")));
^
ChainsawMedlem sedan sep. 20001 282 inlägg
println() returnerar inget objekt. Om du skriver ett '=' så försöker den att anropa objektets .toString()-metod. Eftersom println() är void, så finns inget att anropa. Därför går det inte.
Web-TorMedlem sedan nov. 200011 794 inlägg
Som du kanske märker är jag ny på JSP. ;)
I det här inlägget hittade jag den här koden:
<html>
<head>
<title>test</title>
</head>
<body>
<h1><%=out.println("Hello World")%></h1>
</body>
</html>
Den är alltså fel, eller?
ViktorMedlem sedan aug. 20021 710 inlägg
:x
Det är fel. Sorry, får skylla på att det var mitt första inlägg :)
= används när du ska skriva ut en variabel (typ <%=x%>), man kan tänka sig att "=" betyder "out.println" om man vill :)
/Viktor
sgtpepperMedlem sedan apr. 20005 524 inlägg
man kan tänka sig att "=" betyder "out.println" om man vill
Man behöver inte ens tänka sig det, för det är just så det är ;).
När en JSP-sida körs av Jsp-runnern första gången eller efter att sidan modifierats, så "vänds den ut och in" och görs om till en servlet som sedan kompileras och körs.
JSP-uttryck på formen <%= foo %> kommer då att expanderas till just out.print(foo).
Det är därför du får följande felmeddelande Web-Tor:
out.print((out.println("Hello World")));
Felmeddelandet härrör till servleten som bakats ihop utifrån din JSP-sida, som du ser så har taggarna <%= %> ersatts med en out.print-sats som försöker skriva ut en out.print-sats :).
Ibland (oftast) är JSP-felsökning en pain in the ass just pga att man jobbar i JSP-sidan men måste felsöka i den genererade servletkoden.
ViktorMedlem sedan aug. 20021 710 inlägg
Jag kör bara Tomcat men där får man också reda på vilken rad i JSP sidan som felet finns
An error occurred at line: 5 in the jsp file: /test.jsp
Generated servlet error:
D:\Java\jakarta-tomcat-4.0.4\work\Standalone\localhost\vgbb\test$jsp.java:58: ')' expected.
out.print(out.println("Hello World"););
Om det inte är så i de andra servlet containers så är det dåligt. Har faktiskt aldrig behövt felsöka i servleten. :)
/Viktor
Web-TorMedlem sedan nov. 200011 794 inlägg
Tack för hjälpen så här långt.
För att vara helt säker:
<%-- Ex. 1 --%>
<% out.println ("Hello World"); %>
<%-- Ex. 2 --%>
<%= "Hello World" %>
Både 1 och 2 betyder alltså samma sak?
Spelar det någon roll vilket man använder?
ViktorMedlem sedan aug. 20021 710 inlägg
Nej, det spelar ingen roll.
När du "kör" din JSP sida så konverteras den först till en servlet och efter det så kompileras den och körs. Du borde kunna hitta denna servlet i någon katalog på din server ("work" eller "temp" eller något liknande), där kan du se hur dina olika kommandon ser ut i "verkligheten".
Ditt exempel genererar samma kod i servleten.
Lägger till en j*vla massa kod här också,
denna JSP sida
<html>
<head>
</head>
<body>
<%out.println("Hello World");%>
<p>
<%="Hello World"%>
</body>
</html>
konverteras till denna servlet
package org.apache.jsp;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.jsp.*;
import org.apache.jasper.runtime.*;
public class test$jsp extends HttpJspBase {
static {
}
public test$jsp( ) {
}
private static boolean _jspx_inited = false;
public final void _jspx_init() throws org.apache.jasper.runtime.JspException {
}
public void _jspService(HttpServletRequest request, HttpServletResponse response)
throws java.io.IOException, ServletException {
JspFactory _jspxFactory = null;
PageContext pageContext = null;
HttpSession session = null;
ServletContext application = null;
ServletConfig config = null;
JspWriter out = null;
Object page = this;
String _value = null;
try {
if (_jspx_inited == false) {
synchronized (this) {
if (_jspx_inited == false) {
_jspx_init();
_jspx_inited = true;
}
}
}
_jspxFactory = JspFactory.getDefaultFactory();
response.setContentType("text/html;ISO-8859-1");
pageContext = _jspxFactory.getPageContext(this, request, response,
"", true, 8192, true);
application = pageContext.getServletContext();
config = pageContext.getServletConfig();
session = pageContext.getSession();
out = pageContext.getOut();
// HTML // begin [file="/test.jsp";from=(0,0);to=(4,1)]
out.write("<html>\r\n<head>\r\n</head>\r\n<body>\r\n\t");
// end
// begin [file="/test.jsp";from=(4,3);to=(4,30)]
out.println("Hello World");
// end
// HTML // begin [file="/test.jsp";from=(4,32);to=(6,1)]
out.write("\r\n\t<p>\r\n\t");
// end
// begin [file="/test.jsp";from=(6,4);to=(6,17)]
out.print("Hello World");
// end
// HTML // begin [file="/test.jsp";from=(6,19);to=(8,7)]
out.write("\r\n</body>\r\n</html>");
// end
} catch (Throwable t) {
if (out != null && out.getBufferSize() != 0)
out.clearBuffer();
if (pageContext != null) pageContext.handlePageException(t);
} finally {
if (_jspxFactory != null) _jspxFactory.releasePageContext(pageContext);
}
}
}
/Viktor
SPiNMedlem sedan mars 20005 832 inlägg
Både 1 och 2 betyder alltså samma sak?
Prexis.
Spelar det någon roll vilket man använder?
Nej, men det är ju snyggare med är-lika-med-tecknet. :)
Web-TorMedlem sedan nov. 200011 794 inlägg
Du borde kunna hitta denna servlet i någon katalog på din server ("work" eller "temp" eller något liknande)
Visst! Där låg en massa goa java- och class-filer. :)
Nu börjar jag fatta lite hur JSP hänger ihop med Servlets.
Som jag fattar det kan man skriva Servlet:en direkt, men hur får jag den att köras i webbläsaren?
*med risk att göra bort sig totalt*
ViktorMedlem sedan aug. 20021 710 inlägg
Ja, du kan skriva en servlet direkt och köra den i webbläsaren. Problemet med det (det var bla därför JSP kom) är att all HTML måste skrivas ut med "out.println("");" osv och det blir almänt väldigt rörig kod. Servlets ska, tycker jag, bara användas för att behandla indata från användaren.
För att köra en servlet i webbläsaren skapar du en i din "WEB-INF/classes" katalog (tex MyServletTest.java).
Skriver in rätt config i din web.xml som ligger i "WEB-INF" katalogen
typ
<servlet>
<servlet-name>test</servlet-name>
<servlet-class>MyServletTest</servlet-class>
</servlet>
och sedan startar du din webbläsare och skriver in "http://MY.SERVER.COM/servlet/test".
/Viktor
Web-TorMedlem sedan nov. 200011 794 inlägg
Nu hängde jag inte med riktigt:
1. Jag gör en JSP-sida och kör den i webbläsaren och döper sedan om servlet:en som skapats till MyServletTest.java.
2. Jag skapar en fil som heter web.xml som ligger i ??? (viken mapp) och innehåller:
<servlet>
<servlet-name>test</servlet-name>
<servlet-class>MyServletTest</servlet-class>
</servlet>
3. Öppnar webbläsaren och sökvägen är ???.
ViktorMedlem sedan aug. 20021 710 inlägg
Nej :)
Du måste skapa en ny servlet från grunden. De servlets som din webserver skapar kan bara den läsa (och du lokalt på disken).
Du har ju en "WEB-INF" katalog i rooten på den struktur där du har dina JSP filer. I den katalogen har du också en web.xml, där kan du konfigurera hela denna context.
1. "Vi" ska skapa en servlet i ROOT contexten (dvs den katalog där filerna som laddas om du skriver "http://localhost/" ligger)
2. Skapa filen "MyServletTest.java" i katalogen "ROOT_CONTEXT\WEB-INF\classes\" (byt du "ROOT_CONTEXT" mot det som katalogen heter på din dator)
3. Skriv följande kod i "MyServletTest.java"
import java.io.IOException;
import javax.servlet.*
import javax.servlet.http.*
public class MyServletTest extends HttpServlet
{
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws IOException, ServletException
{
ServletOutputStream out = response.getOutputStream();
out.println("Hello World!");
}
}
4. Kompilera filen.
5. Öppna web.xml som ligger i "ROOT_CONTEXT\WEB-INF" katalogen.
6. Lägg till raden
<servlet>
<servlet-name>test</servlet-name>
<servlet-class>MyServletTest</servlet-class>
</servlet>
7. Starta om din server.
8. Starta en webbläsare och gå till adressen "http://localhost/servlet/test", nu borde servleten laddas.
Nu har du gjort en servlet.
Här hittar du mer info om servlet http://java.sun.com/j2ee/tutorial/1_3-fcs/doc/Servlets.html
/Viktor
Web-TorMedlem sedan nov. 200011 794 inlägg
Du har ju en "WEB-INF" katalog i rooten på den struktur där du har dina JSP filer
Nej, jag kör mina JSP-filer i en mapp som heter JSP som ligger i wwwroot:en.
4. Hur gör jag det?
5. Jag har ingen fil som heter web.xml. Ska jag skapa en då eller?
Nu är det ju helg så jag får ta tag i det här på måndag igen. :)