【发布时间】:2020-03-24 21:05:19
【问题描述】:
image showing login page not getting contents of the included servlet Classnames
image showing login page before form processing
我正在尝试将来自 servlet 的请求转发到 jsp 页面,该 jsp 页面在页面中有一个或多个包含的 servlet,实际上将请求从 servlet 转发到页面不是我的问题,但是当它把我带到那个页面,该页面中包含的 servlet 的内容丢失了...
这是源代码...要包含在页面中的类
package Classes;
import java.io.IOException;
import java.io.PrintWriter;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet(name = "Classnames", urlPatterns = {"/Classnames"})
public class Classnames extends HttpServlet {
protected void processRequest(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
try{
Connection conn= ConnectionPackage.MyConnection.getConnection();
PrintWriter out = response.getWriter();
PreparedStatement ps;
ResultSet rs;
String class_name;
int class_id;
ps = conn.prepareStatement("SELECT class.class_name,class.id FROM class WHERE 1");
rs = ps.executeQuery();
while(rs.next()){
class_name = rs.getString("class_name");
class_id = rs.getInt("id");
out.println("<option value="+class_id+">"+class_name+"</option>");
}
ps.close();
rs.close();
conn.close();
}catch(Exception ex){}
}
}
那么包含包含的 servlet 的页面在下面
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta name="author" content="David Tega">
<meta name="description" content="Cbt Training Platform">
<link rel="stylesheet" type="text/css" href="css/w3.css">
<link rel="stylesheet" type="text/css" href="css/style.css">
<link rel="stylesheet" type="text/css" href="css/responsiveness.css">
<meta name="copyright" content="copyright 2005-2020 Tech Giants"/>
<meta name="robots" content="noindex,nofollow,noarchive"/>
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Brainfield School Platform</title>
</head>
<body id="login" style="background-image: url('images/headway-5QgIuuBxKwM-unsplash.jpg'); background-size: cover;" >
<div class="w3-padding-large w3-white">
<div class="w3-container">
<p class="w3-wide w3-text-brown w3-large">Login...</p>
<p class="w3-text-red w3-small">${loginErrorMessage}</p>
</div>
<form action="StudentLogin" method="POST">
<div class="w3-row-padding">
<div class="w3-half container">
<select class="w3-select w3-border" name="class_name">
<option disabled selected>Class</option>
<jsp:include page="Classnames" flush="true"></jsp:include>
</select>
</div>
<div class="w3-half container">
<input class="w3-input w3-border" name="student_rollno" type="text" placeholder="(XXX)" maxlength="3">
</div>
<button class="w3-button w3-col w3-margin-top w3-gray w3-border w3-padding-small w3-text-white">Submit</button>
</div>
</form>
</div>
</body>
</html>
最后处理StudentLogin页面上的表单的servlet如下
package LoginPackage;
import java.io.IOException;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
@WebServlet(name = "StudentLogin", urlPatterns = {"/StudentLogin"})
public class StudentLogin extends HttpServlet {
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
try{
Connection conn= ConnectionPackage.MyConnection.getConnection();
int roleId =6,state=1;
PreparedStatement ps;
ResultSet rs;
HttpSession ss = request.getSession(true);
String classId = request.getParameter("class_name");
String rollno = request.getParameter("student_rollno"),role,name,picture;
String id;
ps = conn.prepareStatement("SELECT students.userId,user.full_name,user.picture,roleinfo.name FROM students INNER JOIN user ON (students.userId = user.id) INNER JOIN roleinfo ON (user.roleId = roleinfo.id) WHERE students.rollno = '"+rollno+"' AND students.classId ='"+classId+"' AND user.roleId ="+roleId+" AND user.state = "+state+" ");
rs = ps.executeQuery();
if(rs.next()){
role = rs.getString("name");
name = rs.getString("full_name");
picture = rs.getString("picture");
id = rs.getString("userId");
ss.setAttribute("full_name", name);
ss.setAttribute("user_role", role);
ss.setAttribute("user_picture", picture);
ss.setAttribute("userId", id);
response.sendRedirect(request.getContextPath()+ "/StudentProfile.jsp" );
}else{
request.setAttribute("loginErrorMessage", "Incorrect Details, Try Again");
RequestDispatcher rd =request.getRequestDispatcher("StudentLogin.jsp");
rd.forward(request, response);
}
}catch(Exception ex){}
}
}
提前致谢
【问题讨论】:
-
您确定
conn在Servlet 上不为空吗?包含的资源不能做重定向 -
@areus,是的,我刚刚检查了我的连接类,它没问题,感谢您的提示,我一直想知道为什么它直到现在才重定向到我的索引页面。那么如果 conn 为 null 并且不要忘记它仍然无法正常工作,你有什么建议我代替
-
你可以试试
<jsp:include page="/Classnames" flush="true" />。我的意思是,在页面中使用前导/,并使用空标签<jsp:include />而不是打开和结束<jsp:include></jsp:include> -
还是不行
-
如果直接在浏览器中调用
/Classnames会有什么结果?