我在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。
答案 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代码示例。