Создать пользовательский тег, который общается с базой данных - PullRequest
1 голос
/ 30 декабря 2010

Я хочу создать пользовательский тег, который обращается к базе данных и получает записи из таблицы, а затем отображает их на странице 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 Ответ

2 голосов
/ 30 декабря 2010

Вероятно, самый простой способ - использовать стандартные существующие теги из 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-файлы в вашем пути к классам.

Обратите внимание, что построение sql, как это, требует постоянного внимания, чтобы не допустить внедрения sql.

В вашем дизайне существует большое напряжение между:

  • статическая типизация, ориентация объекта и наслоение - отображаются с помощью Spring / daos / JPA
  • архитектура модели 1, плоский (в отличие от многоуровневого) дизайн, смешивание HTML с логикой - отображается при желании создавать запросы по запросу, отображать «записи» (в отличие от «создания графа объекта»), размещать бизнес-запросы в шаблоне HTML и т. д.

Оба подхода хороши (зависит от проблем, которые вы пытаетесь решить, и от масштаба вашего приложения), но они действительно плохо сочетаются. Прямо сейчас кажется, что вы получаете недостатки обоих подходов и преимущества ни одного.

Я бы порекомендовал вам либо:

  • отбросьте Spring и daos и используйте чистый jstl / sql; это сделает ваше приложение простым тонким слоем вокруг вашей базы данных; вы можете использовать представления и хранимые процедуры для инкапсуляции реальной логики; многие крупные приложения работают именно так, особенно те, которые написаны людьми с сильными навыками работы с базами данных.
  • отбросьте идею "волшебный табличный тег"; создайте набор javabeans, которые не являются универсальными для всех, но приспособлены для конкретных задач. Внедрите их Spring, используйте daos, декларативное разграничение транзакций и т. Д. Это сделает ваш код намного длиннее и менее универсальным, но (если все сделано правильно) будет легче поддерживать в последующие годы.
...