Jsp,servlet后退按钮问题

时间:2012-08-07 02:19:01

标签: java jsp java-ee servlets back-button

我在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。

3 个答案:

答案 0 :(得分:0)

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

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

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

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

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

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

我恐怕没有任何代码就无法帮助你了

修改

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

新编辑 好的,这是我功能齐全的例子。我已经对它进行了测试,但它确实有效。

indexA.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);
    }

indexB.jsp

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

indexC.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>

我希望它有所帮助

答案 1 :(得分: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");

&lt; ---------------当按下后退按钮时,我继续输掉这个值..当它再次回到这个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);&lt; ---------------在会话中存储价值,我仍然继续失去它..

///////////从现在开始是连接到数据库的简单数据库连接代码,根据用户选择获取数据,即我刚刚存储在会话中的“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();
}



}



}

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

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

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

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

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

现在为此页面中的下一个按钮编写代码 记住下一个按钮是为了带我到下一页,它具有从servlet获得的相同的correcttoepost值。

下一步

现在让我们转到下一页indexb.jsp

这里我再次从indexa.jsp中获取“corrtoe”的值,就像这样..

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

Uptill现在即使在这个页面上我也能获得正确的价值...问题一旦我按下此页面上的按钮就会出现问题....

此页面上的后退代码代码..

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

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

答案 2 :(得分:0)

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