我想创建一个自定义标记,它与数据库通信并从表中检索记录,然后显示在 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/