JSP让我很受打击

来源:互联网 发布:淘宝助理5.8.3.0 编辑:程序博客网 时间:2024/04/29 21:38

     从上个星期开始,就在研究怎么在JSP中展现一个TreeTable。首先是在数据来源上纠结了很久,花了两天才解决了怎么样采集到想要的数据。

     将需求简化一点,其实本来已经很简单了:在数据库中有一各表结构很简单。

             id                 int

             subid           int

     有这样的一个表,我希望得到一份这样的数据。给定一个id,然后我希望找到同这个id相关的所有subId。也就是如果有下面这样一份数据:

1------|
             2-----|
             |         4-----|
             |                  5
             3------|
                        6-----|
                                 7

 

       但是刚开始时候,我知道用存储过程使用递归将数据从数据库取出来。但是取出来以后该怎么处理,我想了很久。应为需要用到层次关系,所以查出来的数据就是像表1这样表示的。现在需要把它用对象表示出来。存数据的数据结构很简单,就是一个类,然后里面一个列表,存有跟自己有关系的subid.第一天的时候就在纠结这个问题,没有答案。

       到今天,忽然开窍了。既然用递归可以取出原始数据,那我同样的用递归来处理就好了啊。这样我很快的拿到了我想要的数据结构。接着就是在页面展示了。我用的是Servlet + JSP的模式,在JSP中有Java代码。按理说,在页面上页用递归的方式来处理数据就好了。但是,JSP的知识都忘的差不多了。

       第一尝试,使用了 <% public void methodName(xxx) %>的方式,直接编译不过。想了一下,觉得JSP会被编译成Java文件的,直接写个函数应该是不成问题的啊。不过Eclipse报的错没有说明为什么,只好继续尝试了。

       第二次尝试,写了一个内部类来处理。但是同样的是直接报错,说是不能引用非 final的 变量。好,不行咱再试。

       第三次尝试,既然内部类不行,我直接写了一个Java类来处理。我知道JSP有个内部对象out, 而且Jsp编译成Java文件以后就是用它来输出Html的。但是这里有一个问题,  JSP的out是 JspWriter类型的,我没办法直接import. 所以,我第一次就用了PrintWriter,从 reponse.getWriter()获得Writer。然后再页面使用该类来处理数据,结果数据是显示出来了。但是是直接给我打到了页面上,还是不行。我算是百折不饶啊,继续试。

        第四次尝试,这个时候我想不用递归行不行,尝试用循环。但是我仔细想想就放弃了,因为我根本不知道会有多少层。

        第五次尝试,这个时候还闭门造车就不行了。所以我到网上去搜了搜,这一搜还真的找到了解决方案。因为我看到了有人在JSP中使用了函数,用的是 <%! public void methodName(xxx) %>的格式。这次声明函数就没错了,接着就要解决怎样将html标签打出来了。还是要用到out对象,这次我到编译好的JSP文件中看了看,发现它是通过 pageContext.getOut()的方式来获得out对象的,用同一个out打出来的东西应该是显示在一起的。但是我自己写的时候只能用PrintWriter,不能用JspWriter。这个时候我想到了java I/O用的最常见的模式:装饰模式。既然我能得到JspWriter的对象,我直接用它来构造PringWriter不就可以了吗。到这里问题基本解决了。整整花了我快三天时间,真是太悲剧了。

 

        现在要是问我 <%%> 和 <%! %>我也是不知道,网上也没说。看来明天要自己查了,一定要搞明白。

 

 

 

 

 

原创粉丝点击