使用jsp作为视图和控制器

时间:2011-10-05 19:23:35

标签: java jsp

我有以下课程 JAVA文件(数据)

 package p1;

 class data
 {  
private String pro;
private String sta;

   public void set1(String a)
   {
   pro=a;
   }

   public void set2(String b)
   {
   sta=b;
   }

   }

用于从db检索数据的类文件 JAVA文件(conb)

  package p1;
  import java.sql.*;
  import java.sql.Connection;
  import java.sql.DriverManager;
  import java.sql.SQLException;
  import java.util.*;
  import p1.*;
  public class conb 
  {
  public static List<data> datadb() throws SQLException
   {
  List<data> n1=new ArrayList<data>();
 Connection conn = null;
 Statement st = null;
       try
       {
           String userName = "frank";
           String password = "asdf";
           String url = "jdbc:mysql://localhost:8080/work";
           Class.forName ("com.mysql.jdbc.Driver").newInstance ();
           conn = DriverManager.getConnection (url, userName, password);

       }
       catch (Exception e)
       {
    e.printStackTrace();               

       }

        try {

            st = conn.createStatement();
            st.execute("select * from work1");
            ResultSet rs = st.getResultSet();
            while(rs.next())
                {
                    data d1=new data();
                    d1.set1(rs.getString("pron"));
                    d1.set2(rs.getString("sdata"));
                    n1.add(d1);
                }
            rs.close();
            }

        catch (SQLException e)
            {
            e.printStackTrace();

            }
       finally
       {
           if (conn != null)
           {
               try
               {
                   conn.close ();
               }
               catch (Exception e) 
       {
        e.printStackTrace(); 
       }
           }
       }
return n1;
   }
 }

此文件位于WEB-INF / Classes / p1中 我想在jsp文件中显示数据(使用jsp作为控制器和视图) 我在windows中使用tomcat 6.0。 我也为此写了jsp页面

 <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
 <%@ import "java.util.*" %>
 <%@ import "p1.conb" %>
 <!doctype HTML public "-//W3C//DTD HTML 4.0 Frameset//EN">
 </head> 
 <body> 
 <table cellpadding="2" cellspacing="2" width="100%">

    <tr>
        <td>Name</td>
        <td>Start time</td>
        </tr>
 <tr>
 <%
 List<data> da1 = new List<data>();
 da1=p1.conb.datadb();
 %>
 <c:forEach items="${da1}" >        
 <td><c:out value="{$da1.pro}" /></td>
 <td><c:out value="{$da1.sta}" /></td>
 </tr>
 </c:forEach>
</table>


 <html>
 <head>

我收到错误 如何只使用jsp从数据库中检索数据。 我不想使用servlet作为控制器。

错误是:

org.apache.jasper.JasperException: org.apache.jasper.JasperException: Unable to load class for JSP org.apache.jasper.servlet.JspServletWrapper.getServlet(JspServletWrapper.java:1‌​61) org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:340) org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:313) org.apache.jasper.servlet.JspServlet.service(JspServlet.java:260) javax.servlet.http.HttpServlet.service(HttpServlet.java:717)

2 个答案:

答案 0 :(得分:1)

我必须管理我对这个答案感到不舒服,但是如果你只想让它运行,请删除<c:forEach [...]循环。

替换此

<%
List<data> da1 = new List<data>();
da1=p1.conb.datadb();
%>
<c:forEach items="${da1}" >        
    <td><c:out value="{$da1.pro}" /></td>
    <td><c:out value="{$da1.sta}" /></td>
    </tr>
</c:forEach>

有这样的东西(你必须在data类中创建getter方法:

<%
List<data> da1 = new List<data>();
da1=p1.conb.datadb();

for (data da : da1) {
%>
    <tr>
    <td><%=da.getPro()%></td>
    <td><%=da.getSta()%></td>
    </tr>
<%
}
%>

仅供参考 - 您的代码存在大量问题,仅举几例:

  • JSP中的scriptlet是个坏主意
  • 类完全不符合Java命名约定
  • HTML标记不一致,例如在文档的最后,格式不正确
  • 每次调用JSP时的数据库连接初始化(这不会扩展)

答案 1 :(得分:0)

我意识到我迟到了,但是我多次遇到这种类型的问题,因为我重构了JSP以停止使用scriptlet。在中间阶段,我有很多次使用加载数据的scriptlet,但我想将这些数据与一些JSTL标签/ EL表达式一起使用。这是我通常的临时解决方案:

<%
List<data> da1 = new List<data>();
da1=p1.conb.datadb();

pageContext.setAttribute("da1", da1);
%>
<c:forEach items="${da1}" >        
    <td><c:out value="{$da1.pro}" /></td>
    <td><c:out value="{$da1.sta}" /></td>
    </tr>
</c:forEach>

您可以轻松地将数据作为属性添加到请求范围中,但我会尽可能从本地开始,并根据需要转移到更广泛的上下文。