Posts Tagged ‘groovy’

用groovyServlet和TemplateServlet快速开发网页

July 8th, 2009

Groovy是专门为java设计的脚本语言,可以和java无缝的结合,为java带来了脚本语言的能力。作为一个脚本语言,groovy有丰富的特性,比如动态类型,闭包等。如果能掌握groovy,并用其来开发,可以大大提高java程序员的生产力。Grails是用groovy写的一个类似于rails的web框架,实际上就是spring+hibernate+groovy。我想用groovy来写写页面,但是又不想用grails这种笨重的东西,正好groovy自带的了两个类可以完成这个任务,就是groovy.servlet包下的 GroovyServlet 和 TemplateServlet类。

下载安装好groovy后,在安装目录的embeddabe目录下复制groovy-all-1.6.3.jar到war/WEB-INF/lib/下。然后,在web.xml里添加如下代码:

  <servlet>
    <servlet-name>groovlet</servlet-name>
    <servlet-class>groovy.servlet.GroovyServlet</servlet-class>
  </servlet>
 
  <servlet>
    <servlet-name>gsp</servlet-name>
    <servlet-class>com.liba.link.groovy.MyTemplateServlet</servlet-class>
  </servlet>
 
  <servlet-mapping>
    <servlet-name>groovlet</servlet-name>
    <url-pattern>*.groovy</url-pattern>
  </servlet-mapping>  
 
  <servlet-mapping>
    <servlet-name>gsp</servlet-name>
    <url-pattern>*.gsp</url-pattern>
  </servlet-mapping>

这样,就可以在web目录下用groovy写以.groovy或.gsp结尾的页面代码了。GroovyServlet就是一个普通的servlet,只不过,它会编译执行指定url对应的.groovy文件,来产生html。这和直接用groovy写servlet的区别是,GroovyServlet为你做了一些特殊变量的绑定,在.groovy里可以通过request, out, application, session等访问HttpServletRequest, HttpServletResponse, ServletContext和Session。而System.out被重定向客户端的输出,因而,可以这样写html了:

out.print("<h1>${request.getParameter('username')}</h1>")

GroovyServlet还绑定了一个MarkupBuilder,名称为html,所以可以用MarkupBuilder快速的生成简单的页面,比如:

html.div {
    table {
        tr {
            td {
                span(style:"color:red", "Hello world")    
            }
        }
    }
}

如果页面里有大量的html,只有少量的html代码,那么用groovyServlet的方式来写,还是会有些麻烦,这时候使用TemplateServlet会好一些。像上面的那样的配置,只要在web目录里写上以.gsp结尾的文件就可以了。在html代码里像jsp那样用 <% %>来插入groovy代码,比如:

<table>
  <tr>
    <td>
       <span style="color:red">
       <% print "Hello world" %>
       </span>
    </td>
   </tr>
</table>

TemplateServlet和GroovyServlet一样,也把常用的对象绑定成里脚本里的变量。

也许有人会问,这比直接用java和jsp有什么好的呢?没有多大好处,就是可以使用groovy代替java而已,但是我觉得就这一点就是很大的进步了。

  • Share/Bookmark

为什么java没有php开发web容易?

June 2nd, 2009

为什么java没有php开发web容易?原因可能有很多种,就我这半年的php经验来看,主要有以下几点原因:

1. java没有php那样好用的map(在php里叫做array)

这一点很重要,直接看代码吧:
php的:

$values= array(
    'login_name'=>'sulong',
    'password'=>'',
    'login_result'=>array(
        'error_no'=>3,
        'msg'=> 'account disabled'
    )
);

java的:

Map values = new HashMap();
values.put("login_name", "sulong");
values.put("password", "");

Mapresult = new HashMap();
result.put("error_no", "3");
result. put("msg", "account disabled");

values.put("login_result", result);

很多时候,java程序员宁愿选择建一个新的类来做数据的载体,也就是常说的bean了。但是很多时候,我只想要一个简洁好用的Map而已。

最好的是groovy:

values = [
    login_name: "sulong",
    password: "",
    login_result: [
        error_no: "3",
        msg: "account disabled"
    ]
]

仅凭这一点,我就觉得在groovy克服其它问题后,必会成为java在web开发上的利器。

2. java经常要重启服务器

用java开发web,只要改动了java代码,就要重新启动服务器,至少要重新部署一下应用,才能看到新代码的效果,而php就不需要。所以,开发php的时候,经常是一边写,一边运行看效果,快速的迭代和开发。相比之下,java要不断的编译重新发布,重启服务器,比php慢多了。如果java开发也可以即时生效,不用不断的重启的话,那么java的开发效率必然会有很大的提升。

3. 动态类型

确实,动态类型意味这较弱的IDE支持,意味着要进行更多的测试,以避免意想不到的效果,但是,另一方面,动态类型将代码简化,让程序员关注于做什么,而不是怎么做,提升了生产率。比如,用动态类型语言的时候,我们只要说,dog.bark(),那么我们不用关心dog到底是不是dog,只要他能bark(),那bark()就好了。而在静态类型的语言中,我们一定要先搞清楚那是什么,能不能bark,如果不能bark怎么办?是不是要做一层包装?做类型的转换?等等。严谨固然有他的好处,但自由简明显然开发起来更加的快速。

  • Share/Bookmark

批量文本编码转换程序源码

March 18th, 2008

公司的java项目一开始为了和php的编码保存统一而采用了GBK,但是现在发现越来越多不方便的地方,于是决定全部转向UTF-8。为了能够把已写的源代码全转化到utf-8下,我写了一下小程序,用groovy写的。由于groovy学得还不够好,所以写出程序太java了。程序会把指定目录下的所有的文件都按照指定编码的方式读入,再以指定编码的方式写回到别外的目录里。代码如下:

import java.nio.charset.Charset;
public class Main{
    public static void main(String[] args) {
        if(args.length != 4) {
            println("Useage: convertEncoding fileName toDir fromEncoding"
                +"toEncoding")
        }
       
        def file = new File(args[0])
        def toFile = new File(args[1])
        def fromEncoding = args[2]
        def toEncoding = args[3]
       
        convert(file, toFile, fromEncoding, toEncoding)
    }
   
    public static void convert(File fromFile, File toFile,
            String fromEncoding, String toEncoding) {
        if(!fromFile.exists())
            return;
       
        if(!fromFile.isDirectory()) {
            BufferedReader reader = null;
            BufferedWriter writer = null;
            if(fromEncoding == null || !Charset.isSupported(fromEncoding)) {
                reader = new BufferedReader(new InputStreamReader
                    (new FileInputStream(fromFile)))
            } else {
                reader = new BufferedReader(new InputStreamReader
                    (new FileInputStream(fromFile), fromEncoding))
            }
            if(toEncoding == null || !Charset.isSupported(toEncoding)) {
                writer = new BufferedWriter(new OutputStreamWriter
                    (new FileOutputStream(toFile)))
            } else {
                writer = new BufferedWriter(new OutputStreamWriter
                (new FileOutputStream(toFile), toEncoding))
            }
           
            String line = ""
            while(line != null) {
                line = reader.readLine()
                if(line == null) break;
                writer.write(line+"\r\n");
            }
            reader.close();
            writer.flush();
            writer.close();
        } else {
            File[] files = fromFile.listFiles();
           
            for(File file : files) {
                if(file.isDirectory()) {
                    if(file.name == ".svn") {
                        continue
                    }
                    File toSubDir = new File(toFile, file.getName())
                    if(!toSubDir.mkdir()) {
                        println("create subdir : ${toSubDir} fail")
                    } else {
                        println("create subdir : ${toSubDir}")
                    }
                    convert(file, toSubDir, fromEncoding, toEncoding);
                } else {
                    if(
                        !file.name.endsWith(".java") &&
                        !file.name.endsWith(".xhtml") &&
                        !file.name.endsWith(".xml") &&
                        !file.name.endsWith(".txt")
                    ) {
                        continue;
                    }
                    File toNewFile = new File(toFile, file.name)
                    convert(file, toNewFile, fromEncoding, toEncoding)
                    println("File : ${file.absolutePath} converted "
                    + "to ${toNewFile.absolutePath} ");
                }
            }
        }
    }
}
  • Share/Bookmark