java - 创建与数据库对话的自定义标签

标签 java spring jsp jsp-tags

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

我正在使用 Spring 。 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 异常。

谁能告诉我出了什么问题吗?

谢谢

最佳答案

可能最干净的方法是使用 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/tags 中,例如 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 注入(inject)。

在您的设计中,以下因素之间存在着巨大的张力:

  • 静态类型、面向对象和分层 - 使用 Spring/daos/JPA 显示
  • 模型 1 架构,扁平(而不是分层)设计,将 HTML 与逻辑混合 - 通过按需创建查询来显示,显示“记录”(而不是“创建对象图的 View ”),放置HTML 模板中的业务查询等。

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

我会推荐你​​:

  • 放弃 Spring 和 daos,使用纯 jSTL/sql;这将使您的应用程序成为数据库周围的一个简单的薄层;您可以自由地使用 View 和存储过程来封装真正的逻辑;许多大型应用程序的工作原理与此完全相同,尤其是那些由具有强大数据库技能的人编写的应用程序。
  • 放弃“魔法表标签”的想法;制作一组 JavaBean,这些 JavaBean 不是一刀切的,而是针对特定任务量身定制的。让它们通过 Spring 注入(inject)、使用 daos、声明式事务划分等。这将使您的代码更长且不太通用,但(如果做得正确)在未来几年更容易维护。

关于java - 创建与数据库对话的自定义标签,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4562066/

相关文章:

java - 创建保存父类(super class)和子类对象的对象数组的正确方法

java - 同一 Controller 中的多个 post ajax 到不同方法

java - spring http请求将具有不同请求参数的单个uri映射到不同的方法是好的做法还是坏的做法

spring - 将扩展名添加到 URL 时强制出现 404 错误

java - Tomcat 7 上的 JSP 问题 : org. apache.jasper.JasperException:无法为 JSP 编译类

javascript - 定时自动更新 JSP 页面

java - 为什么本地主机 :8081/share can not be open?

java - 安装Tomcat + Solr问题

java - 如果我要求用户输入一个文件,而该文件不存在,如何在程序不停止的情况下继续询问文件名?

java - hibernate/ Spring : Not-null property references a null or transient value