javascript - 使用 jsp、struts2 和 postgresql 填充下拉列表

标签 javascript java html jsp struts2

我的 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 所需的操作,因此需要重新考虑整个事情。 p> <小时/>

这就是错误,但之后,这里有一些建议:

  1. 使用 <s:iterator>填充选择?最好使用<s:select />标签。 It's all described in this answer我建议您连同问题一起阅读,以了解为什么以及如何更好地塑造应用程序的层,而不是将业务逻辑放入实际上是表示 Controller 的操作中。

  2. 对于初学者来说,使用普通的 Javascript 而不是 jQuery 是一个坏主意,因为他们没有被公司规则强制明确避免使用 jQuery。能用就用吧。

  3. 看看Struts2 jQuery plugin ,这将允许您在不知道的情况下使用 jQuery,只需使用 Struts2 标签即可。

  4. 使用 HTML5 DTD。它向后兼容,并且比 4.01 更好,这将强制 strange quirks在不同的浏览器上。

  5. CSS 比页内更好 <style>比内联样式更好的 block 。

  6. 更改页面以填充选择?在同一页面上填充选择不是更好吗?

关于javascript - 使用 jsp、struts2 和 postgresql 填充下拉列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33565509/

相关文章:

javascript - Node.js/Express 视频流(HTTP 206 部分内容)

javascript - Chrome.runtime.onMessage 无法将消息从弹出窗口发送到内容脚本

html - 搜索引擎可以读取 CSS 吗?

html - 使用 2 个 SVG 图标应用类似的填充效果

javascript - Chai 无法读取 null 的属性 'should'

javascript - 如何模拟 Node redis模块的createClient方法

java - 向数据库提交信息后刷新java程序

java - 使用随机类的首选方式

java - 遍历元素,获取 url,将 url 放入列表中。 Selenium java

php - 当我从硬编码的下拉列表中选择值时,它不会选择值并且不会将其发送到数据库中