Showing posts with label scala. Show all posts
Showing posts with label scala. Show all posts

Mar 30, 2009

View's in Lift

I think Lift framework is really interesting and fun thing to play with. Here is my ultra short guide how to try out the framework's Views.

Views are classes that returns content as scala.xml.NodeSeq. Lift maps a browser request to view class and its method. For example /TestView/showme would be mapped to TestView view- class and to showme method. The method name in the request is actually not an actual method in the class - it is a name that is dispatched to the dispatch method of the view class. The method returns a method to handle the request. To make it possible for Lift to find your view classes you sould store them to your.package.view package.

Lets create a simple view that shows simple response in XML. First we need to create the View class. It should be put into your [Package name].view package. Lets call the class TestView:


package your.package.view

import net.liftweb.http.LiftView
import scala.xml.NodeSeq

class TestView extends LiftView {
def dispatch = {
case "testPath" = > provideTestPath _
}

def provideTestPath(): NodeSeq = <html><body>Test</body></html>
}
So the class extends the trait LiftView. It defines the method dispatch that maps the requests with real class methods. In our case we only have testPath that matps to provideTestPath method. That method then returns the NodeSeq.

Next we need to tell Lift that we have this View available and allow it to display it. This happens by modifying our SiteMap. Go to your bootstrap.liftweb package and open the Boot class. Then go to the part where the SiteMap is defined. Assuming that you are playing with the skeleton created by the maven archetypes you should modify it to this:

...
// Build SiteMap
val viewEntry = Menu(Loc("testView",
("TestView" :: Nil) -> true,
"TestView",
Loc.Hidden))
val entries = Menu(Loc("Home", List("index"), "Home")) :: viewEntry :: User.sitemap
LiftRules.setSiteMap(SiteMap(entries:_*))
...

What we have done here? Created a new Menu entry called "TestView". With the part "TestView"::Nil we tell to Lift that map /TestView/* to this link. We have now allowed that /TestView/testPath maps to our TestView class and then to the method inside it. If you don't add the link into the SiteMap then Lift prevents anybody to access the link. It only shows 404 error. This is way to ensure that you as a developer can control what parts should be accessed.

Thats it. Now just point to your server /TestView/testPath and you will see the results!

Mar 25, 2009

Monster

Scala's type system is a pretty nasty monster to tame. It really tried to bite me yesterday but after some sweat and tears I was able to handle it. Today it was behaving really nicely and let me snap a picture of it.

Mar 21, 2009

Match Me Scala

Pattern matching is fun in Scala. It is nothing new - just check Erlang, Ocaml etc. - but it is again one of those features that makes me like the S-language.

def funnyFunc(lst:List[Int]):Unit = lst match {
case List() => print("Nil")
case lstHead::lstTail => {
println(lstHead+"::")
funnyFunc(lstTail)
}
}
Example is a simple function that takes a list and prints its structure. It has two rules for pattern matching: empty list (List()) and non empty part lstHead::lstTail. The nice part is that the matching already split the list into two parts: head and tail.

In Scala we can fine tune the pattern matching. Lets assume that we are close to the evil matching monster that eats code that prints number 5 (don't ask me why). We can avoid this by just adding a new rule:

def funnyFunc2(lst:List[Int]):Unit = lst match {
case List() => print("Nil")
case 5::lstTail => {
println("Don't Eat Me::")
funnyFunc2(lstTail)
}
case lstHead::lstTail => {
println(lstHead+"::")
funnyFunc2(lstTail)
}
}
Now
funnyFunc2(List(1,2,3,4,5,6,7)
would print: 1::2::3::4::Don't Eat Me::6::7::Nil

Mar 5, 2009

Lift me!

It has been a while when I last time played with web coding. After wondering a while - should I start to play more with Google App engine (which is really great stuff), Ruby or go and try some stuff from Java world I bumped into Lift. Lift is a Scala based web framework that promises to do thing differently (surprise, surprise). Because I have long wanted to really dig into Scala I knew that this would be my next playground. Lets see how different it really is...