创建与数据库对话的自定义标记

时间:2010-12-30 11:06:59

标签: java spring jsp jsp-tags

我想创建一个与数据库对话的自定义标记,然后从表中检索记录,然后在jsp页面上显示。

我正在使用春天。和Eclipselink作为JPA提供者。我写了一个自定义类。

package com.persistent.testjpa.taghandlers;

import java.io.IOException;
import java.util.Date;
import java.util.List;

import javax.servlet.jsp.JspException;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.tagext.SimpleTagSupport;

import org.springframework.beans.factory.annotation.Autowired;

import com.persistent.testjpa.dao.MyUserDao;
import com.persistent.testjpa.domain.MyAuthorities;


public class MyListTagHandler extends SimpleTagSupport {

    private String tableName;
    private MyUserDao dao;

    public String getTableName() {
        return tableName;
    }

    public void setTableName(String tableName) {
        this.tableName = tableName;
    }

    public void doTag() throws JspException, IOException {
        System.out.println("Indise Do Tag Method");
        JspWriter out = getJspContext().getOut();
        if (tableName != null) {
            System.out.println("Table Name : "+getTableName());
            out.println("<html><body>");
            out.println("Today's Date is "+ new Date());

            out.println("</body></html>");
        }  else {
            out.println("<html><body>");
            out.println("Please Enter Table Name");
            out.println("</body></html>");
        }
    }

    @Autowired
    public void setDao(MyUserDao dao) {
        this.dao = dao;
    }

    public List<MyAuthorities> getList(){
        return dao.list();
    }

}

当我尝试访问Dao对象时代码抛出NullPointer异常。

有人可以告诉我出了什么问题吗?

由于

1 个答案:

答案 0 :(得分:2)

最简单的方法可能是使用jstl / sql中的标准现有标签,并制作一个简单的标签文件而不是标签类:

    <%@taglib  prefix="sql" uri="http://java.sun.com/jsp/jstl/sql" %>
    <%@taglib  prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
    <%@attribute name="table" required="true"%>    
    <sql:query var="temporary">
        select * from ${table}
    </sql:query>
    <table border="1">
        <tr>
            <c:forEach items="${temporary.columnNames}" var="temporary_value">
                <th>${temporary_value}</th>
            </c:forEach>
        </tr>
        <c:forEach items="${temporary.rowsByIndex}" var="temporary_row">

            <tr>
                <c:forEach items="${temporary_row}" var="temporary_value">
                    <td>${temporary_value}</td>
                </c:forEach>
            </tr>
        </c:forEach>
    </table>

如果您将代码放在WEB-INF /标签中,例如dbtable.tag,您可以这样使用它:

<%@taglib  prefix="sql" uri="http://java.sun.com/jsp/jstl/sql" %>
<sql:setDataSource dataSource="jdbc/mydb" scope="request" />
<tags:dbtable table="customers"/>

必须在web.xml中对数据库进行引用,并且必须在类路径中的某处具有标准JSTL jar。

请注意,构建这样的sql需要经常注意,因为不允许sql注入。

在你的设计中,两者之间存在很大的紧张关系:

  • 静态类型,面向对象和分层 - 使用Spring / daos / JPA
  • 显示
  • 模型1体系结构,平面(与分层相对)设计,将HTML与逻辑混合 - 希望按需创建查询,显示“记录”(与“制作对象图形视图”相对),放置HTML模板中的业务查询等。

两种方法都可以(取决于您尝试解决的问题和应用程序的范围),但它们确实不能很好地混合。现在看来你们两种方法都有缺点,也没有任何好处。

我会建议你:

  • 删除Spring和daos并使用纯jstl / sql;这将使您的应用程序成为数据库周围的简单薄层;您可以自由地使用视图和存储过程来封装真实的逻辑;许多大型应用程序的工作方式与此完全相同,尤其是那些具有强大数据库技能的人员。
  • 放弃“魔术表标签”的想法;制作一套不是一刀切的javabeans,但是针对特定任务量身定制。让他们注入Spring,使用daos,声明性事务划分等。这将使您的代码更长,更少普遍,但(如果做得好)在未来几年更容易维护。