0

Struts 2 と Display Tag テーブル フォーマット ツールを使用して、データベースからのクエリ結果 (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>
4

1 に答える 1

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"/>

index.html が置かれている場所に "hello-world" と入力すると、小さな hello メッセージが表示されます...ほとんどの単純なケースでは、単純なクラスから JSP への命名規則に従うことで、XML をまとめて回避できます。規約が気に入らない場合は、気に入らないものを簡単にオーバーライドできますが、規約プラグインをクラス パスに追加すると、xml と将来の規約アクションの両方が調和します。

PS: はい、HelloWorld クラスには getter と setter が必要だと思いますが、その方法で問題なく動作し、例が短くなります。

于 2011-02-02T01:19:40.520 に答える