Struts 2 DisplayTag仅在提交表单时才显示DB信息表

时间:2011-02-01 23:53:59

标签: java mysql database struts2 displaytag

我正在使用Struts 2和显示标记表格式化工具来显示数据库的查询结果(SELECT *查询)。我遇到了一个奇怪的错误。从Add.jsp向数据库提交记录后,它会转到View.jsp,正确显示该表。但是,如果我直接转到View.jsp,或者通过Add.jsp页面中的超链接而不向数据库提交条目,它似乎不会执行将数据库条目检索到变量所需的方法来让表格显示。在那种情况下,我最终会得到一个短语,“无需显示”表格所在的位置。

我被告知这很可能是我的方法名称和Struts 2方面的问题,而不是Java方面的任何功能。我对Struts非常陌生,并且非常感谢帮助识别和修复错误。下面是一些代码摘录,但如果需要,我可以发布整个内容。此外,在表单提交后或通过直接链接加载View.jsp时,不会显示任何错误。

Add.jsp

<%@ page contentType="text/html; charset=UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
    <head>
        <title>Add Development Environment</title>
    </head>
    <body>
    <div id="main">
        <h2>Add Development Environment</h2>

        <p><s:a href="View.jsp">View Entries</s:a></p>

        <s:actionerror />
        <s:form action="doEntries.action" method="post" validate="true">
            <s:textfield name="OS" key="label.OS" size="20" />
            <s:textfield name="OSVersion" key="label.OSVersion" size="20" />
            <s:textfield name="Note" key="label.note" size="20" />
            <s:submit method="doEntries" key="label.submit" />
        </s:form>
    </div>
    </body>
</html>

view.jsp的

<%@ page contentType="text/html; charset=UTF-8" language="java" %>

<%@ taglib prefix="s" uri="/struts-tags"%>
<%@ taglib prefix="display" uri="http://displaytag.sf.net" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/"WebContent/View.jsp"DTD/xhtml1-transitional.dtd">
<html>
    <head>
        <title>View Development Environments</title>
    </head>
    <body>
    <div id="main">
    <h2>View Development Environments</h2>

    <p><s:a href="Add.jsp">Add Entry</s:a></p>

        <!--<s:set name="items" value="entries" scope="request"/>-->
            <display:table name="entries" class="DevEnvironment" requestURI="" id="itemsList" export="false" pagesize="15">
                <display:column property="did" title="id"/>
                <display:column property="OS" title="Operating System"/>
                <display:column property="OSVersion" title="Operating System Version" />
                <display:column property="note" title="Note"/>
            </display:table>
    </div>
    </body>
</html>

DatabaseAction.java

public class DatabaseAction extends ActionSupport{ 
    private static final Logger logger = Logger.getLogger(DatabaseAction.class);
    DBO myDBO;

    private String OS;
    private String OSVersion;
    private String note;

    private ArrayList<DevEnvironment> entries;

    private double offset;
    private double limit;

    public DatabaseAction(){
        super();
        //connect to DB
        myDBO = new DBO("com.mysql.jdbc.Driver", "jdbc:mysql://localhost:3306/devenvironments?user=root&password=mysqliscool");

    }

    public String doEntries(){
        logger.info("puting stuff in DB! =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-==-==-=-=");
        if(myDBO.connect() && myDBO.setEntry(OS, OSVersion, note)){
            return "success";
        } else {
            return "error";
        }
    }

    public ArrayList<DevEnvironment> getEntries() { 
        logger.info("-==-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=getEntries called");
        entries = myDBO.getEntry(0, -1);
        return entries;
    }

    public void setEntries(ArrayList<DevEnvironment> entries){
        this.entries = entries;
    }

    public String retrieveEntries(){
        logger.info("-==-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=retrieveEntries called");
        if(myDBO.connect()){
            logger.info("-==-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=EXECUTING SQL SELECT METHOD");
            //entries = myDBO.getEntry(0, -1);
            //offset, limit
            return "success";
        } else {
            return "input";
        }
    }

struts.xml中

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
    "http://struts.apache.org/dtds/struts-2.0.dtd">

<struts>
    <constant name="struts.enable.DynamicMethodInvocation" value="false" />
    <constant name="struts.devMode" value="false" />
    <constant name="struts.custom.i18n.resources" value="ApplicationResources" />
    <package name="default" extends="struts-default" namespace="/">
        <action name="doEntries" method="doEntries" class="net.josh.devenvironments.DatabaseAction" >
            <result name="success">View.jsp</result>
            <result name="input">Add.jsp</result>
        </action>
        <!-- 
        <action name="retrieveEntries" method="retrieveEntries" class="net.josh.devenvironments.DatabaseAction" >
            <result name="success">View.jsp</result>
            <result name="input">Add.jsp</result>
        </action>
        -->
    </package>
</struts>

1 个答案:

答案 0 :(得分:0)

您可以访问View.jsp,因为它可以公开访问。通常把所有JSP放在/ WEB-INF之下是因为View.jsp没有意义,除非它被一个动作支持。如果您现在只是转到View.jsp,它不会通过直接命中JSP并尝试解析它的操作,找不到任何数据的标签可能会优雅地失败(S2标签通常会这样做,不能找到该物业只是放弃)。

现在使用/ WEB-INF文件夹下的JSP,访问它的唯一方法是使用“doEntries”(除非你只是使用s2过滤.action,否则你可以不使用点动作但如果你没有充分的理由,你不应该)。当然不要忘记将动作映射更新到/WEB-INF/View.jsp

现在你可以创建一个名为view的另一个动作来实现它,但是如果所有这一切都与“doEntries”相同,那么就没有任何意义,只需使用“doEntries”。

如果您厌倦了编写XML(这是一种很好的做法但不是必需的话),请将struts2-conventions-plugin添加到类路径中。添加完成后,请执行以下操作:

创建一个名为struts2的新包,在其中创建一个类:

package struts2;

class HelloWorld extends ActionSupport{
  public String greetings = "Hello from HelloWorld Class!";
}

然后在/ WEB-INF / content下创建一个名为“hello-world.jsp”的jsp

<s:property value="greeting"/>

标签现在如果你输入“hello-world”,其中index.html可能位于你会看到一个小问候消息...对于大多数简单的情况,通过遵循一个简单的类到JSP命名约定,你可以一起避免XML 。如果您不喜欢这个约定,您可以轻松覆盖您不喜欢的内容,但如果您将约束插件添加到类路径中,则xml和future约定操作将协调一致。

PS:是的,我认为HelloWorld类应该有getter和setter,但它的工作方式很好,并使示例更短。