簡體   English   中英

用jsp,struts2和postgresql填充下拉列表

[英]Populate drop down list with jsp, struts2 & postgresql

我的Struts2 Web應用程序的索引頁面有兩個按鈕,如下所示。

<%@ taglib prefix="s" uri="/struts-tags"%>
<html>
<head>
<link href="assets/css/lib/bootstrap.min.css" rel="stylesheet">
<link href="assets/css/lib/bootstrap-responsive.min.css"
rel="stylesheet">
<link href="css/report.css" rel="stylesheet">
<title></title>
<script type="text/javascript">
function listReports() {
    var xhttp = new XMLHttpRequest();

    xhttp.open("GET", "myReportAction.action", true);
    xhttp.send();

    xhttp.onreadystatechange = function() {
        if (xhttp.readyState == 4 && xhttp.status == 200) {
            window.location = '/ReportBuilder/myreports.jsp';
        }
    }
}   
</script>
</head>

<body>
<div id="form-wrapper"
    style="text-align: center; vertical-align: middle">
    <form action="reporttype.jsp" method="post" class="row-centered">
        <button type="submit" class="btn btn-primary">Create Report</button>
    </form>
    <div>
        <button id="myReports" class='btn btn-info' onclick="listReports()">My
            Reports</button>
    </div>
</div>

單擊“ 我的報告”按鈕后,它將調用myReportAction 這是我的struts.xml文件。

<action name="myReportAction" class="net.java.com.reports.MyreportsAction"
        method="execute">
        <result name="success">/myreports.jsp</result>
        <result name="error">/error.jsp</result>
    </action>

MyreportsAction.java類。

package net.java.com.reports;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.struts2.ServletActionContext;
import org.apache.struts2.interceptor.ServletRequestAware;

import com.opensymphony.xwork2.ActionSupport;

public class MyreportsAction extends ActionSupport implements
    ServletRequestAware {
private List<String> myreports;

HttpServletRequest servletRequest = ServletActionContext.getRequest();
HttpServletResponse servletResponse = ServletActionContext.getResponse();

@Override
public String execute() throws Exception {
    myreports = new ArrayList<String>();
    Connection connection = null;
    Statement stmt = null;
    ResultSet rs = null;

    System.out.println("-------- PostgreSQL "
            + "JDBC Connection Testing ------------");

    try {
        Class.forName("org.postgresql.Driver");
    } catch (ClassNotFoundException e) {
        e.printStackTrace();
        return ERROR;
    }

    System.out.println("PostgreSQL JDBC Driver Registered!");
    System.out.println("Database connection established!");

    try {
        connection = DriverManager.getConnection(
                SelectAction.getDatabase(), SelectAction.getUser(),
                SelectAction.getPassword());

        if (connection != null) {
            System.out.println("Database connection established!");

            stmt = connection.createStatement();
            // creating Query String
            String query = "SELECT report_id\n" + "FROM reports\n";

            // Executing query
            rs = stmt.executeQuery(query);
            while (rs.next()) {
                myreports.add(rs.getString("report_id"));
            }
            System.out.println(myreports);
            connection.close();
            return SUCCESS;
        } else {
            System.out.println("Failed to make connection!");
            return ERROR;
        }

    } catch (SQLException e) {
        System.out.println("Connection Failed!");
        e.printStackTrace();
        return ERROR;
    }

}

@Override
public void setServletRequest(HttpServletRequest arg0) {
    // TODO Auto-generated method stub

}

public List<String> getMyreports() {
    return myreports;
}

public void setMyreports(List<String> myreports) {
    this.myreports = myreports;
}

public HttpServletResponse getServletResponse() {
    return servletResponse;
}

public void setServletResponse(HttpServletResponse servletResponse) {
    this.servletResponse = servletResponse;
}

public HttpServletRequest getServletRequest() {
    return servletRequest;
}

}

myreports.jsp

<%@ taglib prefix="s" uri="/struts-tags"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" 
                      "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<link href="assets/css/lib/bootstrap.min.css" rel="stylesheet">
<link href="assets/css/lib/bootstrap-responsive.min.css"
rel="stylesheet">
<link href="css/report.css" rel="stylesheet">
<title></title>
</head>
<body>
<div id="form-wrapper"
    style="text-align: center; vertical-align: middle">

    <div class="container">
        <select id="myreports" name="myreports" >
            <s:iterator value="myreports">

                <option value="<s:property />"><s:property /></option>

            </s:iterator>
        </select>

    </div>
</div>
</body>
</html>

單擊“ 我的報告”按鈕后,我需要轉到myreports,jsp頁面,它應填充myreports下拉列表。 以上是我嘗試過的嘗試。 它重定向到myreports.jsp頁面,但下拉列表ID為空。

任何建議表示贊賞。

謝謝

有很多事情出了問題。

最重要的是,您必須始終調用一個操作然后呈現JSP,而不應該直接調用JSP。 相反,您正在打電話

window.location = '/ReportBuilder/myreports.jsp';

這將打開JSP,而無需執行任何操作。 因此,無需任何操作數據即可傳遞並填充您的選擇。

實際上,操作數據僅在xhttp.onreadystatechange = function() {函數中可用,然后您創建另一個請求並將其丟失。

您需要執行諸如window.location = "/some.action"; 在這里some.action將加載select所需的數據並將其轉發到JSP,然后它將起作用,但是由於您之前已經調用了填充select所需的動作,因此需要重新考慮整個事情。


那是錯誤,但是在結束之后,這里有一些建議:

  1. 使用<s:iterator>填充選擇? 最好使用<s:select />標記。 我在此答案中對所有這些內容進行了描述,建議您閱讀該書以及相關問題,以了解為什么以及如何能夠更好地塑造應用程序的層,而不是將業務邏輯放在行動中,而實際上這是表示性的控制器。

  2. 對於初學者來說,使用香草Javascript代替jQuery是一個壞主意,因為他們沒有受到公司規則的強迫而明確地避免使用jQuery。 如果可以使用,請使用它。

  3. 看一下Struts2 jQuery插件 ,它使您僅通過使用Struts2標簽就可以使用jQuery,而無需了解它。

  4. 使用HTML5 DTD。 它向后兼容,並且比4.01更好,它將在不同的瀏覽器上引發奇怪的怪癖

  5. CSS優於頁面內<style>塊,后者優於內聯樣式。

  6. 更改頁面以填充選擇? 在同一頁面上填充選擇不是更好嗎?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM