1

我正在用 Java EE 创建一个简单的网站,我没有使用 bean,因为我想保持简单。

网站的结构就像我有不同的jsp页面,每个jsp页面都有一个对应的servlet,然后将jsp页面连接到数据库来存储和检索数据。

问题是我有这一页 index1,我在其中从下拉列表中选择了一些选项。我的下一个 jsp 页面 index2.jsp 应该根据从 index1.jsp 中选择的选项在其字段中加载数据库中的数据。

index2 有一个下一个和上一个按钮。我正在存储从 index1 中选择的选项的值,以便暂时显示在每个 jsp 页面上。但是,当我在此 index2.jsp 上单击下一步时,它会将我带到具有相同选项值的 index3,但是当我按下 index3 上的上一个按钮时,它会将我带到 index2 的 servlet,在这种情况下是 Servlet2,选项的值显示为无效的。当我按下“上一个”按钮时,它正在破坏会话中的值。之后,所有其他页面也将 option 的值显示为 null 。

另一个问题是为什么使用servlet将数据从db加载到indexa时是servlet的地址而不是indexa。

4

3 回答 3

0

好的,我将在这里发布所有代码以及描述...

好的,这里是第一个索引的代码,称为.. indexnpro.jsp,它在获取值后将它们转发给 Servletnpro,就像这样。 <form class="form-class" name="myform" action="Servletnpro" method="POST">注意:记住,因为这里的架构是 MVC,所以每个 jsp 都有自己的 servlet,所以值不会直接传递给另一个jsp 而是一个 servlet,然后将它们传递给下一个 jsp ......现在在 Servletnpro 的 dopost 方法中......

String connectionURL = "jdbc:mysql://localhost/secnok?"+ "user=root&password=";
Connection connection=null;
response.setContentType("text/html");
PrintWriter out = response.getWriter();

HttpSession session = request.getSession(true);

//这些是我从 indexnpro.jsp 获得的不同值,其中一些是下拉框,但我不应该真的很重要..

String exproject=request.getParameter("country");
String corrcust=request.getParameter("state");
String excust=request.getParameter("country1" );
String corrproject=request.getParameter("state1");

String corrtoepost= request.getParameter("corrtoe");

<--------------- 当按下返回按钮时,我不断丢失这个值。当它再次返回到这个 servlet 时,它变为 null 。

System.out.println(corrtoepost);

System.out.println("doPost is running");
System.out.println("Session id on dopost: " + session.getId() ); 

request.setAttribute("corrtoepost", corrtoepost);<--------------- 在会话中存储价值,我仍然不断失去它..

////////// 从现在开始是数据库连接的简单代码,它将连接到数据库根据用户选择获取数据,即我刚刚存储在会话中的“corrtoepost”..然后将其显示回来在 indexa.jsp 上..

try{
int rs1;

// Load the database driver
Class.forName("com.mysql.jdbc.Driver");
// Get a Connection to the database
connection = DriverManager.getConnection(connectionURL); 

//Add the data into the database

Statement stmt = connection.createStatement(); 
Statement stmt1 = connection.createStatement(); 
Statement stmt2 = connection.createStatement(); 
Statement stmt3 = connection.createStatement(); 
Statement stmt4 = connection.createStatement(); 
Statement stmt5 = connection.createStatement(); 
Statement stmt6 = connection.createStatement(); 





ResultSet rs = stmt.executeQuery( "Select * from toe_description where toe_id= '" + corrtoepost + "' " ) ;




ResultSet rs2 = stmt1.executeQuery( "Select * from toe_text where type_id=1 AND toe_id= '" + corrtoepost + "' " ) ;
ResultSet rs3 = stmt2.executeQuery( "Select * from toe_text where type_id=2 AND toe_id= '" + corrtoepost + "' " ) ;
ResultSet rs4 = stmt3.executeQuery( "Select * from toe_text where type_id=3 AND toe_id= '" + corrtoepost + "' " ) ;
ResultSet rs5 = stmt4.executeQuery( "Select * from toe_text where type_id=4 AND toe_id= '" + corrtoepost + "' " ) ;
ResultSet rs6 = stmt5.executeQuery( "Select * from toe_text where type_id=5 AND toe_id= '" + corrtoepost + "' " ) ;
ResultSet rs7 = stmt6.executeQuery( "Select * from toe_text where type_id=6 AND toe_id= '" + corrtoepost + "' " ) ;











while(rs.next()){
String toeid= rs.getString(1);
String toename= rs.getString(2);
String Intname= rs.getString(4);
String Assetname= rs.getString(5);
String Objname= rs.getString(6);
String ProjectID= rs.getString(7);



request.setAttribute("toeid", toeid);
request.setAttribute("toename", toename);
request.setAttribute("Intname", Intname);
request.setAttribute("Assetname", Assetname);
request.setAttribute("Objname", Objname);
request.setAttribute("ProjectID", ProjectID);





while(rs2.next()){
String purpose= rs2.getString(4);

request.setAttribute("purpose", purpose);








while(rs3.next()){
String scope= rs3.getString(4);

request.setAttribute("scope", scope);
System.out.println(scope);





while(rs4.next()){
String toe_desc= rs4.getString(4);

request.setAttribute("toe_desc", toe_desc);


System.out.println(toe_desc);




while(rs7.next()){
String toe_ass= rs7.getString(4);

request.setAttribute("toe_ass", toe_ass);








while(rs6.next()){
String enviroment= rs6.getString(4);

request.setAttribute("enviroment", enviroment);





while(rs5.next()){
String ass_env= rs5.getString(4);

request.setAttribute("ass_env", ass_env);



}


}



}



}



}



}

}


request.getRequestDispatcher("/WEB-INF/indexa.jsp").forward(request, response);

// 这里我将从 db 获取的所有数据发送到所需的 jsp,然后将显示数据。即“indexa.jsp”

System.out.println("Connected to the database"); 
connection.close();
System.out.println("Disconnected from database");

}

catch (Exception e) {
e.printStackTrace();
}



}



}

////////Indexa.jsp的现在代码

此页面将显示从前面讨论过的 Servletnpro 获取的数据。

在页面的正文标签下,我检索了我之前在会话中保存在 Servletnpro 中的“corrtoepost”的值。我现在可以看到这个值了。

String corrtoepost1=request.getParameter("corrtoepost"); 
String corrtoepost=(String) session.getAttribute("corrtoepost"); 
session.setAttribute("corrtoepost",corrtoepost);

然后将其显示在 jsp 页面上.. 目前显示正确的值..

现在这个页面中的下一个按钮的代码记住下一个按钮是假设带我到下一页,具有我从 servlet 获得的相同的正确toepost 值。

下一个

现在让我们进入下一页 indexb.jsp

在这里,我再次像这样从 indexa.jsp 获得“corrtoe”的值。

String corrtoe=(String) session.getAttribute("corrtoe"); 
session.setAttribute("corrtoe",corrtoe);

直到现在,即使在此页面上,我也得到了正确的值...一旦我按下此页面上的返回按钮,就会出现问题...。

现在为此页面上的后退按钮编写代码..

以前的

现在,当我按下上一个按钮时,我失去了 indexa.jsp 页面中的脚趾值,它在界面上显示 corrtoe 值为 null .....之后,我尝试使用 Servlets Get 方法来获取可以工作一次但之后的值在 indexa.jsp 上按 next 它将在 indexb.jsp 和其余页面上显示 null ......问题是为什么当我将它存储在会话中时我会丢失这个值。!!!请给我一些想法......

另一个问题是,当我在 indexnpro 页面上按下提交时,为什么它会在地址栏中显示 Servletnpro 而不是 indexa.jsp ...但是它确实显示页面 indexa.jsp 填充了 indexa.jsp 中的值 ...我认为这是我不断丢失jsp页面之间的“corrtoe”值的原因..

于 2012-08-07T18:11:20.930 回答
0

好的,首先没有任何代码我有点“在黑暗​​中回答”

[...]每个jsp页面都有一个对应的servlet,然后将jsp页面连接到数据库以存储和检索数据[...]

好吧,JSP 是一个 servlet,所以您的所有 servlet 代码都可以在 JSP 中运行,但我假设您选择了 MVC 架构。

我认为您的主要问题如下。

从 index1.jsp 向 index2.jsp 发出请求,参数为param(只是一个示例)。然后在 index2.jsp 中,您使用名为param的相同参数向 index3.jsp 发出另一个请求, 但是当您点击先前时,您没有将名为param的参数传递给 index2.jsp

要么将参数传回(最安全),要么使用浏览器的历史记录(不安全,但会执行从 index1.jsp 到 index2.jsp 的相同请求)

恐怕没有任何代码我不能再帮你了

编辑

我认为这是您的错误 request.setAttribute("corrtoepost", corrtoepost); ,您没有在会话中存储“corrtoepost”,而是在请求中。要在会话中存储参数,您必须执行以下操作 request.getSession().setAttribute("corrtoepost", corrtoepost);

新编辑 好的,这是我功能齐全的示例。我已经对其进行了测试,并且可以正常工作。

索引A.jsp

<html>
    <body>
        <form action="servletA" method="POST">
            <select name="corrtoe">
                <%if("1".equals(request.getSession().getAttribute("corrtoe"))){ %>
                    <option value="1" selected>1</option>
                <%}else{ %>
                    <option value="1">1</option>
                <%} %>
                <%if("2".equals(request.getSession().getAttribute("corrtoe"))){ %>
                    <option value="2" selected>2</option>
                <%}else{ %>
                    <option value="2">2</option>
                <%} %>
                <%if("3".equals(request.getSession().getAttribute("corrtoe"))){ %>
                    <option value="3" selected>3</option>
                <%}else{ %>
                    <option value="3">3</option>
                <%} %>
            </select>
            <input type="submit">
        </form>
    </body>
</html>

ServletA.java

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String corrtoepost = request.getParameter("corrtoe");
        //Search in DB or whatever
        request.getSession(true).setAttribute("corrtoe", corrtoepost);
        getServletContext().getRequestDispatcher("/jsp/indexB.jsp").forward(request,response);
    }

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }

索引B.jsp

<html>
    <body>
        <h1><%=request.getSession().getAttribute("corrtoe")%></h1>
        <form action="jsp/indexC.jsp" method="GET">
            <input type="submit">
        </form>
    </body>
</html>

索引C.jsp

<html>
    <body>
        <h1><%=request.getSession().getAttribute("corrtoe")%></h1>
    </body>
</html>

这是在我的 web.xml 上

<servlet>
   <display-name>servletA</display-name>
   <servlet-name>servletA</servlet-name>
   <servlet-class>org.test.servlets.ServletA</servlet-class>
   <load-on-startup>1</load-on-startup>
 </servlet>

 <servlet-mapping>
   <servlet-name>servletA</servlet-name>
   <url-pattern>/servletA</url-pattern>
 </servlet-mapping>

 <welcome-file-list>
   <welcome-file>jsp/indexA.jsp</welcome-file>
 </welcome-file-list>

我希望它有帮助

于 2012-08-07T02:33:59.097 回答
0

看这个问题,它是关于跨来自 index1 页面值选择的请求的数据存储。有多种方法,一种是在会话中保留此值并跨页面使用它。另一个是在每个屏幕上都有隐藏字段并将其传递。这可能是粗鲁的方式。您可以有单个 servlet 和不同的页面方法,或者 servlet 到页面的映射。很高兴查看代码示例的JSP 示例

于 2013-07-12T12:25:29.200 回答