--- np01.adp ---<h1>Informacje</h1><p>ls -l:<pre><% ns_puts "[exec ls -l]"%></pre></p><p>ps -Oppid,pcpu,pmem:<pre><%= [exec ps -Oppid,pcpu,pmem] %></pre></p>
--- np01.tcl ---ns_return 200 text/html " <h1>Informacje</h1> <p>ls -l: <pre>[exec ls -l]</pre> </p> <p>ps -Oppid,pcpu,pmem: <pre>[exec ps -Oppid,pcpu,pmem]</pre> </p> "
--- np02.htm ---<form method="GET" action="np39.tcl"> tekst1: <input type="text" name="tekst1"><br> tekst2: <input type="text" name="tekst2"><br> <input type="submit" value="submit"></form>--- np02.tcl ---set tekst1 [ns_queryget tekst1]set tekst2 [ns_queryget tekst2]ns_return 200 {text/html; charset=utf-8} " <p>tekst1=$tekst1</p> <p>string len= [string len $tekst1]</p> "
--- mod03.tcl ---ns_register_proc GET /hello helloproc hello {} { set login [ns_queryget login "?"] ns_return 200 {text/html; charset=utf-8} " <p>witaj $login !</p> "}
-- mod04.tcl ---## zm. sesyjne w cookies..# - sposob uzycia: miedzy sessLoad i sessSave# jest dostepna tablica sess ze zmiennymi sesyjnymi!#proc sessLoad {} { upvar sess sess1 array set sess1 [ns_getcookie "sess" ""]}proc sessSave {} { upvar sess sess1 ns_setcookie "sess" [array get sess1]}## uproszczona impl. ns_set/getcookie - AOLserver 4.0.10 tego NIE MA !!!#proc ns_getcookie {key defa} { set x [ns_set iget [ns_conn headers] Cookie] if {$x!=""} { set x1 [split $x ";"] set x2 {} foreach e $x1 {lappend x2 [string trim $e]} set x3 {} foreach e $x2 {lappend x3 [split $e "="]} foreach e $x3 { foreach {k1 v1} $e break if {$key==$k1} {return [ns_urldecode $v1]} } } return $defa}proc ns_setcookie {key val} { ns_set put [ns_conn outputheaders] Set-Cookie $key=[ns_urlencode $val] # - mozna kilka razy wywolac ns_setcookie z ROZNYMI kluczami # w jednej transakcji http ...}# --- np04.tcl ---# logika biznesowasessLoadappend sess(tekst1) {123 } # operacja na zm. sesyjnych ...sessSave# prezentacjans_return 200 text/html " <p> tekst1= $sess(tekst1)<br> pid= [pid]<br> </p>"# --- np04.adp ---# logika biznesowa<%sessLoadappend sess(tekst1) {123 }sessSave%><p>tekst1= <%=$sess(tekst1)%><br>pid= <%=[pid]%><br></p>
# --- mod05.tcl ---ns_register_filter postauth GET /np05/* filter_np05ns_register_filter postauth POST /np05/* filter_np05proc filter_np05 {conn when} { opensession}proc loginform p { ns_return 200 "text/html" [concat $p { <form method=POST> login: <input type="text" name=login><br> passwd: <input type="password" name=passwd><br> <input type=submit value=login> </form> }]}proc opensession {} { global sess_id set sess_id [ns_getcookie sess_id ""] set login [ns_queryget login ""] set passwd [ns_queryget passwd ""] if {$sess_id=="" && $login==""} { loginform {<p>podaj login i haslo...</p>} return "filter_return" } if {$sess_id=="" && $login!=""} { # uwierzytelniamy i ew. tworzymy sesje # if {$login=="qqq" && $passwd=="qqq"} { # trzeba to uogolnic !!! set sess_id "sess[uuid::uuid generate]" # tu uzywa sie pakietu uuid z tcllib do wygenerowania sess_id ns_setcookie sess_id $sess_id nsv_set $sess_id login $login nsv_set $sess_id login_time [ns_time] return "filter_ok" } else { loginform {<p>bledny login i/lub haslo!</p>} return "filter_return" } } if {$sess_id!=""} { # sprawdzamy czy taka sesja istnieje # if {! [nsv_exists $sess_id login]} { ns_setcookie sess_id "" loginform {<p>ta sesja juz nie istnieje!</p>} return "filter_return" } else { nsv_set $sess_id access_time [ns_time] return "filter_ok" } }}
# --- np06.tcl ---# proc pomoc.proc setColor {r g b} { upvar g1 g1_ $g1_ setColor [java::new {java.awt.Color int int int} $r $g $b]}# glowne obiektyset bi1 [java::new java.awt.image.BufferedImage 700 230 5]set g1 [$bi1 getGraphics]set baos [java::new java.io.ByteArrayOutputStream]# rysujemy...setColor 255 255 255$g1 fillRect 0 0 700 230setColor 0 255 0iterate i 40 { $g1 drawLine 100 100 700 [expr {0+$i*5}]}# odsylamy obraz do przegladarki$baos reset; java::call javax.imageio.ImageIO write $bi1 "png" $baosns_return 200 "image/png" [$baos {toString int} 0] # metoda "toString 0" tworzy string kompatybilny z Tcl!
// --- Jacl1.java ---// servlet pozwalający używać skryptów Jacl jako servletów ...// do katalogu WEB-INF/lib trzeba skopiować pliki: jacl.jar i tcljava.jarimport java.io.*;import java.text.*;import java.util.*;import javax.servlet.*;import javax.servlet.http.*;public class Jacl1 extends HttpServlet { public final String dir= "/home/mhanckow/jacl_servlet"; // katalog w ktorym zainstalowano app webowa z tym servletem public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { javax.servlet.http.HttpSession sess= request.getSession(); tcl.lang.Interp interp= (tcl.lang.Interp)sess.getAttribute("tclinterp"); boolean newSess= false; if (interp==null) { interp= new tcl.lang.Interp(); sess.setAttribute("tclinterp", interp); newSess= true; } try { interp.setVar("req", tcl.lang.ReflectObject.newInstance(interp, request.getClass(), request) ,0); interp.setVar("res", tcl.lang.ReflectObject.newInstance(interp, response.getClass(), response) ,0); interp.setVar("sess", tcl.lang.ReflectObject.newInstance(interp, sess.getClass(), sess) ,0); String dir1= dir+request.getContextPath(); if (newSess) interp.evalFile(dir1+"/newsess.tcl"); interp.evalFile(dir1+request.getServletPath()); } catch(tcl.lang.TclException e) {} }}<!--- deklaracja servletu w WEB-INF/web.xml ---> <servlet> <servlet-name>Jacl1</servlet-name> <servlet-class>Jacl1</servlet-class> </servlet> <servlet-mapping> <servlet-name>Jacl1</servlet-name> <url-pattern>*.tcl1</url-pattern> </servlet-mapping># --- newsess.tcl ---## skrypt inicjalizujący nowo tworzone "interpretery sesyjne"#package re java# --- np01.tcl1 ---## podstawowy przyklad ...# - skrypty .tcl1 tworza interp sesyjny (w momencie utworzenia sesji) !!!# - zmienne oraz jakiekolwiek inne zasoby interpa sa "sesyjne" !!!#$res setContentType "text/html"set out [$res getWriter]$out println "<html><head></head><body>"$out println "<p>A ku ku !!!</p>"set err [catch { # wykonanie kodu pod dbg...if {[info exists zm]} {incr zm} {set zm 3000}$out println "<p>zm=$zm</p>"} errInfo]; if {$err} {$out println "<pre>$errInfo</pre>"}$out println "</body></html>"$out close