java - 刷新 JSP 页面时出错

标签 java html jsp session

据我所知,当复选框页面将参数传递到原型(prototype)页面时,原型(prototype)页面将其放入投资组合对象中,然后使用该对象检查数据值并显示投资组合名称,以及当原型(prototype)页面刷新时参数不会再次从复选框页面传递,并且投资组合对象中存储有一个空值,这会导致空指针异常。

因此,如果我在从复选框页面传递参数值后存储参数值,是否可以解决问题?如果是这样我该怎么办?

这是原型(prototype)页面的代码

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<%@ page import="java.io.*"%>
<%@ page import="java.sql.*"%>
<%@ page import="java.util.*"%>
<%@ page import="oracle.jdbc.pool.OracleDataSource"%>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">

<head>
<title>Live Data Tracking</title>
<style type='text/css'>
.wrapper {
margin: 0px auto;
width: 1379px;
background-color: #cccccc
}

.header {
float: left;
width: 100%;
background-color: #356aa0
}

.left1 {
float: left;
margin-right: 10px;
width: 338px;
background-color: #ffffff
}

.left2 {
float: left;
margin-right: 10px;
width: 337px;
background-color: #ffffff
}

.left3 {
float: left;
margin-right: 10px;
width: 337px;
background-color: #ffffff
}

.right {
float: right;
width: 337px;
background-color: #ffffff
}

.footer {
float: left;
width: 100%;
background-color: #00457b
}

body {
padding: 0px;
margin: 0px;
font-size: 90%;
background-color: #e7e7de
}
</style>

</head>


<script type="text/javascript">

<%
ArrayList<ArrayList<String>> testList = new ArrayList(); 
portfolio = request.getParameterValues("portfolio");


try{

 OracleDataSource ds= new OracleDataSource();
 //javax.sql.DataSource ds = new javax.sql.DataSource();
 ds.setDriverType("thin");
 ds.setServerName("localhost");
 ds.setPortNumber(1521);
 ds.setDatabaseName("orcl");
 ds.setUser("system");
 ds.setPassword("amex1234");
 Connection connection = ds.getConnection();
 System.out.println("Connected Successfully");


        Statement statement = connection.createStatement() ;
        if (portfolio!=null)
        { 
            for(int i=0;i<portfolio.length;i++)
                testList.add(new ArrayList());
            //System.out.println(testList);

            for(int i=0; i<portfolio.length;i++)    
            { String temp="";
                ResultSet resultset = statement.executeQuery("select num FROM "+portfolio[i]+"_Test") ; //Put in SQl command and Table name here 
            while(resultset.next()){

                temp = resultset.getString(1);
                testList.get(i).add(temp);      
            }


                //System.out.println(testList);
            }

        }

} catch(SQLException e) {
  e.printStackTrace();
}
    %>

</script>

<body>

<%! String[] portfolio; %>
<div class="wrapper">
    <div class="header">
        <center>
            <h4>Live Tracker</h4>
        </center>
    </div>
    <div class="left1">
        <h3>Portfolio</h3>
        <%  
  if (portfolio != null) 
  {
     for (int i = 0; i < portfolio.length; i++)  //i=portfolio length proxy
  {
     out.println ("<b>"+portfolio[i]+"<b>"); %>
        <br>
        <% }
  }
  else out.println ("<b>none<b>");
   %>
    </div>
    <div class="left2">
        <h3>Pre-Stage</h3>
   for (int j = 0; j < portfolio.length; j++)
   {     
    response.setIntHeader("Refresh", 2);
    //System.out.println(testList.get(j).size());
    if (testList.get(j).size()!=0){ %>
        Data is there <br>
        <%  } else { %>
        No data <br>
        <% } 
        }%>
    </div>
    <div class="left3">
        <h3>Stage</h3>
    </div>
    <div class="right">
        <h3>Mirror</h3>
    </div>
    <div class="footer">Something Funny and Witty Here</div>
</div>
</body>
</HTML>

这是复选框页面的代码。通过此页面运行

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">

<HTML>
<body>
<FORM method="POST" ACTION="Proto_1.jsp">
<center>
Select your portfolio(s): <br><br>
<table>
<tr>
<td> 

    <input TYPE=checkbox name=portfolio VALUE=X>
</td>    
<td>    
    X 
</td>
</tr>

<tr>
<td> 
    <input TYPE=checkbox name=portfolio VALUE=Y>
</td>    
<td>    
    Y
</td>
</tr>

<tr>
<td> 
    <input TYPE=checkbox name=portfolio VALUE=W>
</td>    

<td>    
    W
</td>
</tr>

<tr>
<td> 
    <input TYPE=checkbox name=portfolio VALUE=V>
</td>    

<td>    
    V
</td>
</tr>

<tr>
<td> 
    <input TYPE=checkbox name=portfolio VALUE=S>
</td>    

<td>    
    S
</td>
</tr>
</table>
<br> <INPUT TYPE=submit name=submit Value="Submit">
</center>
</FORM>
</BODY>
</HTML>

最佳答案

有几个选项需要解决。

选项 1:将参数设置到 session 中。而不是:

portfolio = request.getParameterValues("portfolio");

试试这个:

String[] portfolio = null;
if(null == request.getParameter("submit")) { //page reload, true
    portfolio = (String[])session.getAttribute("portfolio");
} else {
    portfolio = request.getParameterValues("portfolio");
    session.setAttribute("portfolio", portfolio);
}

选项 2:将 View 和业务逻辑分开,即将页面分成两部分。第一个 jsp 从请求中获取portfolio,并频繁调用以从第二个 jsp 获取更新的记录。此方法需要 JavaScript

View.jsp:使用setInterval()频繁调用Records.jsp

<script>
var getRecords = function() {
  //  to do here
};

setInterval(getRecords, 2 * 1000); (in miliseconds)[every 2 sec]
</script>

Records.jsp:生成动态 html 和记录

关于java - 刷新 JSP 页面时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31136551/

相关文章:

java - 如何使用 servlet 从请求中获取上一页 URL

java - 为什么多对一双向关联需要update和insert设置为false

html - 如何使 Bootstrap 下拉项成为超链接

java - 如何在 Eclipse 中设置用于 JSP、Servlet、JPA、Hibernate Web 开发的项目

java - GenericDAO 和 ClassCast

Java 棋盘格,奇数/偶数 % 2 面板

html - Scratch off reveal with HTML5 canvas -- 添加淡出元素

jquery - 在 svg 路径元素上添加类

javascript - 如何找到没有id的li的索引?

java - 在jsp登录页面记住我