AGMedlem sedan mars 20001 229 inlägg
Vill skriva in en hel htmlsida i ens ervlet. Vill inte visa resultatet på en jsp sida med hjälp av böna.
Finns det inget smidigare sätt att skriva in all kod, för att slippa:
out.println( "<html><head>" +
"</head><body> " +
"Heja</body></html>");
etc...
Skulle bara vilja skriva in det på en lång rad, är endast några få rader ren java.
Andreas
sgtpepperMedlem sedan apr. 20005 524 inlägg
Finns det inget smidigare sätt att skriva in all kod, för att slippa:
Jo visst gör det det och det smidigaste sättet är ju just att köra det som en JSP-sida, som ju ändå blir en kompilerad servlet vid första körningen.
Skulle bara vilja skriva in det på en lång rad, är endast några få rader ren java.
Vad är det du vill skriva på en rad? Java eller HTML? Vad är det som endast är några få rader ren java?
Om du nu inte vill lägga HTML-koden i en JSP av någon anledning så får du antingen skriva ut den via response.getOutputStream().println() eller bygga någon egen funktion som t.ex läser templates/textfiler med HTML, fyller dessa med genererat data och dumpar ut dessa på responsen, eller något liknande.
Beskriv gärna varför du inte vill använda JSP och vad du skall göra mer exakt så är det lättare att ge ett bra svar.
AGMedlem sedan mars 20001 229 inlägg
Var bara att jag kände att jag inte ville trassla in jsp.
Servleten tar emot tre variabler från en sida:
import java.io.*;
import javax.servlet.http.*;
import javax.servlet.*;
import java.util.regex.*;
import java.util.*;
public class TravResultat2 extends HttpServlet {
public void doGet (HttpServletRequest req,
HttpServletResponse res)
throws ServletException, IOException
{
PrintWriter out = res.getWriter();
String track = req.getParameter("track");
Pattern pd = Pattern.compile("-");
Matcher md = pd.matcher(req.getParameter("date"));
String date = md.replaceAll("");
String race = req.getParameter("race");
getFlatBet bean = new getFlatBet();
String host = "http://www.atg.se/ResultatServlet?datum="+ date +"&bankod="+ track + "&action=loppresultat&betType=VP&race="+ race;
String template = "Tid, %1 , Segermarginal";
java.util.Vector result = bean.doGet(host, template);
String input= (String) result.elementAt(1);
Pattern p10 = Pattern.compile(" ");
Matcher m10 = p10.matcher(input);
input = m10.replaceAll("");
Pattern p2 = Pattern.compile("<(.|\n)+?>");
Matcher m2 = p2.matcher(input);
input = m2.replaceAll("");
Pattern p3 = Pattern.compile("<(.|\n)+");
Matcher m3 = p3.matcher(input);
input = m3.replaceAll("");
Pattern p4 = Pattern.compile("(.|\n)>");
Matcher m4 = p4.matcher(input);
input = m4.replaceAll("");
Pattern SEARCH_PATTERN;
String BLANK = " [\\p{Blank}]*+ ";
String SPACE = " \\s*+ ";
String LC_TEXT_DIGITS = " ([a-z\\d]++) ";
String HANDLE = " ([-A-Z a-z \\p{Blank} \\p{InLatin-1Supplement} .]++) ";
String NAME = "( (?:[-a-z A-Z \\p{Blank} \\p{InLatin-1Supplement} .] )++ )";
String DIGITS = " \\b(\\d++)\\b ";
String REGEX =
"^ " + BLANK + LC_TEXT_DIGITS + SPACE +
DIGITS + SPACE +
HANDLE + SPACE +
NAME;
SEARCH_PATTERN = Pattern.compile( REGEX,
Pattern.MULTILINE |
Pattern.COMMENTS );
out.println( "This is the regex (with space): "
+ REGEX + "\n\n<br>" );
Matcher m = SEARCH_PATTERN.matcher( input );
while ( m.find() )
{
out.println( "found: " + m.group(1) + " " +
m.group(2) + " " +
m.group(3) + " " + m.group(4)+ "<br>") ;
}
out.close();
}
}
Har nog föreställningar om att det skall bli svårt att börja jobba med importer av bönor.
Andreas
sgtpepperMedlem sedan apr. 20005 524 inlägg
I servleten skapar du ett objekt som håller det data du vill visa på sidan. När det objektet är färdigfyllt så lägger du in det i requestobjektet och gör en forward till JSP-sidan, där du plockar fram objektet och visar det, blir mycket trevligare och snyggare.
Så här ungefär:
I din servlets doGet-metod:
.......
ArrayList result = new ArrayList();
while ( m.find() ) {
result.add(new TravResult(m.group(1), m.group(2), m.group(3). m.group(4)));
}
// Lägg travresultatet i requestet
request.setAttribute("travresult", result);
// Kör en forward till JSP-sidan
RequestDispatcher rd = request.getRequestDispatcher("travresult.jsp");
rd.forward(request, response);
I din JSP-sida:
<% ArrayList travResult = (ArrayList)request.getAttribute("travresult"); %>
<html><body>
<b>Finfina travresultat:</b><br>
<%
[i]Iterera genom Collection-objektet med travresultat och skriv ut varje resultat här[/i]
%>
</body></html>
Travresultaten bakas alltså in i en Collection, t.ex en ArrayList eller en egen klass som ärver eller kapslar in lämplig Collection. Detta objekt trycks i requestet som skickas vidare till JSP-sidan (detta sker på servern så allt sker i samma request). Du plockar ut objektet i JSP-sidan och kan jobba med det där. Smidigt.
AGMedlem sedan mars 20001 229 inlägg
Tyvärr fungerar det inte sgtpepper att lägga in din kodsnutt i min servlet, har döpt om vissa av dina variabler.
Där jag inte riktigt hänger med är:
'dvs new TravResult
result.add(new TravResult(m.group(1), m.group(2), m.group(3), m.group(4)));
Andreas
sgtpepperMedlem sedan apr. 20005 524 inlägg
result.add(new TravResult(m.group(1), m.group(2), m.group(3),
Det här kodstycket skapar ett nytt TravResult-objekt med värdena som plockats ut av regexp-en och lägger in detta i ett Collection-objekt av typen ArrayList.
Det du måste göra är att implementera en enkel klass TravResult som håller datat, t.ex:
public class TravResult {
[i]// Jag har ingen aning om vilka typer av data du plockar ut, så jag hittade på dessa:[/i]
private String horseName;
private String jockeyName;
private String finalPosition;
private String race;
[i]// konstruktor[/i]
public TravResult(String horseName, String jockeyName, String finalPosition, String race) {
this.horseName = horseName;
this.jockeyName = jockeyName;
this.finalPosition = finalPosition;
this.race = race;
}
[i]// getters och setters[/i]
public String getHorseName() {
return horseName;
}
public void setHorseName(String horseName) {
this.horseName = horseName;
}
[blue] ... och så vidare... en get/set-metod per fält.[/blue]
}
När du plockat fram alla resultat och populerat ArrayListen med dessa resultat i form av ovanstående TravResult-objekt och stoppat in ArrayListen i requestet så kan du mycket enkelt jobba med dessa i JSP-sidan:
<html>
<body>
<h1>Resultat</h1>
<%
ArrayList results = (ArrayList)request.getAttribute("results");
if (travResult.isEmpty()) {
%>
<b>Inga resultat funna!</b>
<%
} else {
Iterator i = results.iterator();
while(i.hasNext()) {
TravResult result = (TravResult)i.next();
%>
Hästen heter: <%= result.getHorseName() %><br>
Snubben som kör heter: <%= result.getJockeyName() %><br>
Målposition: <%= result.getFinalPosition() %><br>
Lopp: <%= result.getRace() %><br>
<%
}
}
%>
</html>
</body>
AGMedlem sedan mars 20001 229 inlägg
Det som händer nu är:
travresult.jsp:15: Undefined variable: TravResult
TravResult result = (TravResult).next();
Andreas
sgtpepperMedlem sedan apr. 20005 524 inlägg
AG skrev:
Det som händer nu är:
travresult.jsp:15: Undefined variable: TravResult
TravResult result = (TravResult).next();
Andreas
Du måste importera klassen TravResult (eller ange hela paketnamnet) i JSP-sidan, har du t.ex lagt klassen i paketet com.foo.trav så skriver du en page-import i JSP-sidan så här:
<%@ page import="com.foo.trav.TravResult" %>
Du kommer även behöva importera ArrayList och Iterator, så släng in dom också:
<%@ page import="com.foo.trav.TravResult, java.util.ArrayList, java.util.Iterator" %>
Kika på Suns JSP Syntax Reference.
AGMedlem sedan mars 20001 229 inlägg
Får nu ett nytt fel:
Note: sun.tools.javac.Main has been deprecated.
travresult.jsp:16: Method next() not found in class TrottingResult.
TrottingResult resultat = TrottingResult.next();
Andreas
sgtpepperMedlem sedan apr. 20005 524 inlägg
AG skrev:
Får nu ett nytt fel:
Note: sun.tools.javac.Main has been deprecated.
travresult.jsp:16: Method next() not found in class TrottingResult.
TrottingResult resultat = TrottingResult.next();
Andreas
Jag hade skrivit ett slarvfel ovan och missat i (iteratorn), har rättat till det. Din klass TrottingResult har ingen next()-metod, det är Iterator-objektet som fås från ArrayListen som har det och det är den du använder för att iterera (stega igenom) listan med resultat:
TrottingResult resultat = (TrottingResult) i.next();
AGMedlem sedan mars 20001 229 inlägg
Fungerar nu perfekt. Tack för hjälpen.
Andreas