Содержимое сервлета отсутствует - PullRequest
0 голосов
/ 25 марта 2020

изображение, показывающее страницу входа, не получающую содержимое включенного сервлета Имена классов изображение, показывающее страницу входа перед обработкой формы
я пытаюсь перенаправить запрос от сервлета на jsp page, на этой jsp странице есть один или несколько включенных сервлетов на странице, фактически переадресация запроса на страницу из сервлета не является моей проблемой, но когда он переносит меня на эту страницу, содержимое включенного сервлета ( s) на этой странице отсутствует ... вот исходный код ... для класса, который будет включен в страницу

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){}
    }
}

, тогда страница, содержащая включенный сервлет, находится ниже

<%@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, находится ниже

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){}
    }
}

Заранее спасибо

1 Ответ

0 голосов
/ 04 апреля 2020

Когда вы впервые получаете доступ к странице входа в систему JSP, вы делаете это методом GET. JSP обрабатывает <jsp:include />, вызывающий метод doGet сервлета Classnames.

Когда вы отправляете форму, используя метод POST, в вашем сервлете StudentLogin вы используете RequestDispatcher.forward, поэтому логин Страница JSP обрабатывает запрос POST, а <jsp:include /> вызывает метод doPost сервлета Classnames.

Вам следует реорганизовать свой сервлет Classnames, чтобы вывести те же результаты с помощью doGet или doPost, либо Вы можете использовать POST-redirect-GET (и преобразовать атрибут запроса loginErrorMessage в параметр запроса)

Чтобы реорганизовать свой сервлет Classnames, вы можете поместить текущую реализацию метода doGet в новый метод, такой как:

protected void outputOptions(HttpServletRequest request, HttpServletResponse response)

И вызовите этот метод из doGet и doPost.

Или вы можете просто переопределить метод service класса HttpSevlet. Метод service, как указано в javado c:

Получает стандартные HTTP-запросы от метода службы publi c и отправляет их методам doXXX, определенным в этом классе

Итак, поместив свои логики c в этот метод, вы можете опустить переопределение методов doGet и doPost, так как метод service будет вызван в любом случае:

@Override
protected void service(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) {
        // normally you should'nt ignore exceptions silently 
        log("Error getting options", ex);
    }
}

Единственное падение этой опции является то, что метод service будет вызываться для всех методов HTTP, а не только для GET и POST. Но at входит во включенный сервлет, это не проблема.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...