Chen Jian

[Spring] 轻巧使用 Spring-Controller

spring评价     大家都知道,Spring MVC提供了一些功能齐全的Controller,并和Struts一样,为这些Controller配套了很多可配置、可扩展的东西,如 successView,validator,Bean绑定框架,ResourceBundle。但我的观点是:    1.“可配置”性有意义吗?可配置是为了重用,但WEB层的东西能有几次重用?比起写一大堆配置文件的痛苦,追求一点点的重用有什么意义?    2. 有必要把validator独立出来吗?几个Controller共用一个validator的情况并不多见,而且就算要共用,也可以把校验逻辑写在pojo里,而不是写在丑陋不堪的Spring-validator里    3.Spring-Bind 通过字段级的绑定,可以在表单提交失败时给出具体的失败原因,提高用户体验,与resourceBundle结合使用还可以实现国际化。但是这个代价太大了,因为你要在表单页面中写很多 <spring-bind>这样的东西,而且,你的项目真的需要国际化吗?    4.有些Form Controller很有框架的特点(半成品),但是用起来更不顺手。以SimpleFormController为例,你要另外定义一个Form Object,要告诉系统在请求form和提交form时分别作什么,而且程序还人为地把校验逻辑和业务逻辑调用彻底分成不同的阶段,既麻烦,又不灵活 简化使用    在厌倦了这些烦人的东西之后,我开始简化地使用Spring MVC。最终我形成了自己的模式。这个模式的核心思想就是:Spring MVC仅用作URL映射和Bean注入,而它的Controller仅当作普通的Servlet,用request.getParameter()的方式获取输入,用POJO的风格来完成功能,既灵活,又舒服。具体来说:      1.基本只用最简单的AbstractController。以表单处理为例,请求form用一个controller,提交form再用一个controller,把两个步骤分开,这样的代码都比较简洁,长度少了很多;采用了POJO风格编码,可读性也强了很多    2.调用javabean的方法完成校验。既可在controller间重用,又维持了pojo风格       3.successView 可以作为表单页面的隐藏变量传到controller中来,这样就不用写XML了。其实,大多数情况下,把successView写死在Controller的代码中就够了。不同功能模块共享Controller的情况是不多见的。    4.校验异常,或者发现业务错误,直接throw Exception。然后用一个通用的处理error的JSP来处理所有Exception (这是Spring的功能),这个jsp里加上一个“返回”按钮,就可以方便用户在出错之后重新提交请求        5.相近的请求让一个controller处理就够了(如添加用户、删除用户),这样的话写URL配置就只需要写一次。仍然可以只用AbstractController,然后用一个Http Parameter参数来区分请求即可。   现在能想到的就是这么多,以后再补充

[hibernate] hibernate在级联删除时会先将子对象的外键值置为null

    如果子对象的外键值已设为not null,级联删除时就会出问题    要解决这个问题,有两种办法:     1.取消掉外键的 not null     2. set, bag 那一端设置 inverse = true     原文: Very Important Note: If the <key> column of a <one-to-many> association is declared NOT NULL, Hibernate may cause constraint violations when it creates or updates the association. To prevent this problem, you must use a bidirectional …

[hibernate] hibernate在级联删除时会先将子对象的外键值置为null Read More »

displayTag中如何给非JAVABEAN组成的类集排序?

    我们知道指定  display:columan 的  sortable=True时,默认是按display:column的tagBody的字典序来排序的;但是如果这个字段的值是数字类型的怎么办? 我们知道如果指定了sortProperty了,则按这个属性的值来排序;但是如果类集中的每个记录不是一个javabean(比如说一个数组),没有property怎么办?      看了文档,发现display:column有一个属性叫做 value,设置好这个value为字段的值,则排序时就按字段值来排序了

[java excel api] 写工作表的代码

WritableWorkbook workbook = Workbook.createWorkbook(new File("output.xls")); WritableSheet sheet = workbook.createSheet("First Sheet", 0); Label label = new Label(0, 2, "A label record"); sheet.addCell(label); Number number = new Number(3, 4, 3.1459); sheet.addCell(number); workbook.write(); workbook.close(); http://www.andykhan.com/jexcelapi/tutorial.html 经过研究源码发现, 如果workbook是用 WritableWorkbook createWorkbook(OutputStream output) 方法生成的,则workbook.close()后,相应的output也会被自动关闭

pager-taglib 中 页码的算法

如 int totalCount =  记录总数; int itemCountForPage =  每页记录数; 那么 int pageCount= totalCount / itemCountForPage + (totalCount % itemCountForPage == 0 ? 0 : 1); // 页数 int offset =  (pageCount- 1) * itemCountForPage ;  //在URL里作为参数pager.offset的值

利用 pager-taglib :增、删记录后如何回到分页了的记录列表

    如果页面上存在一个按时间排序的记录列表,当我们增加了一条记录,应该跳转到记录的最后面,以看到刚刚增加的记录;当我们删除了一条记录,应该跳转到被删除记录的原来差不多的地方,以方便用户继续操作。    如果列表是分页的,那么增加记录后应该是跳到最后一页;对于删除记录,删除前应把当前页码记下,删除后跳转到  <b> Min(最后一页,删除前的页码) </b>     可以用 pager-taglib 来实现这两种机制。首先,它可以分页,可以让我们免于自己实现分页;其次,利用它分页后想跳转到某页只须在 url 里加上 pager.offset = 某页 即可,方便程序的实现。      具体的实现方法:       1.增加记录         a.用户提交“增加记录”的表单,表单域中需包含隐藏变量:“每页记录数”         b.服务器增加记录后,从数据库中算出记录的总数         c.利用每页记录数和记录总数算出最后一页的pager.offset值         d.跳转到该页       2.删除记录         a.用户提交“删除记录”的表单,表单域中需包含隐藏变量:“每页记录数”和“当前页码”         b.服务器删除记录后,从数据库中算出记录的总数         c.利用每页记录数和记录总数算出最后一页的pager.offset值         d.求出 最后一页的页码 和 删除前的页码 中间的较小值         e.跳转到这个较小值所代表的页面    DisplayTag为什么不行? 因为利用它分页后如果想跳到某页,在url里要加上的东西是不确定的,URL中它的分页参数名值对 有时是 d-48098-p = 某页, 有时是  d-23456-p …

利用 pager-taglib :增、删记录后如何回到分页了的记录列表 Read More »