当前位置: 首页 > 知识库问答 >
问题:

使用servlet使用id打开jsp编辑页面

商冠玉
2023-03-14

我对使用servlet和JSP相当陌生,我正在尝试获取一个列出所有用户的JSP页面,根据用户id重定向到编辑表单JSP,列出所有用户的JSP页面使用迭代器显示我的JDBC表中的数据,但我似乎不知道如何分别为每个用户的编辑链接分配一个值,以便它可以用该用户的数据加载编辑表单,谢谢你的帮助。

这里我当前的jsp页面代码列出所有学生

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1" import="java.util.*" import="model.Student"%>

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, intial-scale=1 shink-to-fit=yes">

    <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.2/dist/css/bootstrap.min.css" 
    integrity="sha384-..." crossorigin="anonymous">
</head>
<body>
    <nav class="navbar navbar-dark bg-primary pd-8">
         <a class="navbar-brand">&nbsp;&nbsp;&nbsp;&nbsp;...University</a>
    </nav>
    <div class="container-fluid">
    <div class="container">

            <div class="form container-fluid p-4">
               <a href="<%=request.getContextPath()%>/new" class="btn btn-success" >Add
                    Student</a>
            </div>
            <br>
            
            <!--Assigning ArrayList object containing student data to the local object -->
            <% ArrayList<Student> studentList = (ArrayList) request.getAttribute("listStudents"); %> 
            <table class="table table-bordered">
            
                <thead>
                    <tr>
                        <th>ID</th>
                        <th>Name</th>
                        <th>Email</th>
                        <th>Actions</th>
                    </tr>
                </thead>
                <tbody>
                    <!-- data from table displayed using iterator-->
                    <%
                     if(request.getAttribute("listStudents") != null)  {
                            Iterator<Student> iterator = studentList.iterator();
                            while(iterator.hasNext()) {
                                Student studentDetails = iterator.next();
                    %>
                        <tr><td><%=studentDetails.getId()%></td>
                            <td><%=studentDetails.getName()%></td>
                            <td><%=studentDetails.getEmail()%></td>
                            <td><a href="<%=request.getContextPath()%>/edit?id=<%=studentDetails.getId()%>">Update</a> <!-- id assigned to edit link-->
                                &nbsp;&nbsp;&nbsp;&nbsp; <a href="<%=request.getContextPath()%>/delete?id=<%=studentDetails.getId()%>">Delete</a></td>  <!-- id assigned to delete link-->
                        </tr>
                    <% 
                            }
                     }
                    %>
                </tbody>
                
            </table>
            </div>
        </div>
        
    </body>
</html>

然后,id值应该分配给servlet中的一个值,该值用于在调用编辑时从表中选择特定的学生

以下是我的servlet代码的一部分:

import java.io.IOException;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.List;
import jakarta.servlet.RequestDispatcher;
import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServlet;
import dao.StudentDao;
import model.Student;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;

public class StudentServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;
    private StudentDao studentDao;

    public StudentServlet() {
        this.studentDao = new StudentDao();
    }

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

    
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String sPath = request.getServletPath();
        //switch statement to call appropriate method
        switch (sPath) {
            case "/new":
                try {
                    showNewForm(request, response);
                } catch (ServletException | IOException e) {
                    e.printStackTrace();
                }
                break;
            case "/insert":
                try {
                    insertStudent(request, response);
                } catch (SQLException | IOException e) {
                    e.printStackTrace();
                } 
                break;
            case "/delete":
                try {
                    deleteStudent(request, response);
                } catch (SQLException | IOException e) {
                    e.printStackTrace();
                }
                break;
            case "/update":
                try {
                    updateStudent(request, response);
                } catch (SQLException | IOException e) {
                    e.printStackTrace();
                }
                break;
            case "/edit":
                try {
                    editStudent(request, response);
                } catch (ServletException | IOException e) {
                    e.printStackTrace();
                }
                break;
            default:
                try {
                    listAllStudents(request, response); //home page = .../week04/StudentServlet
                } catch (ServletException | IOException | SQLException e) {
                    e.printStackTrace();
                } 
                break; 
            } 
    }

    private void editStudent(HttpServletRequest request, HttpServletResponse response) 
            throws ServletException, IOException {
        int id = Integer.parseInt(request.getParameter("id"));
        Student currentStudent = studentDao.selectStudent(id);
        System.out.println(currentStudent);
        RequestDispatcher dispatch = request.getRequestDispatcher("student-form.jsp");
        request.setAttribute("student", currentStudent); 
        dispatch.forward(request, response);
    }

    private void listAllStudents(HttpServletRequest request, HttpServletResponse response) 
            throws ServletException, IOException, SQLException {
        List<Student> allStudents = studentDao.selectAllStudents();
        request.setAttribute("listStudents", allStudents);
        RequestDispatcher dispatch = request.getRequestDispatcher("student-list.jsp");
        dispatch.forward(request, response);
    }
}

这是我的DAO,以防我没有正确配置它:

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import model.Student;

public class StudentDao {
    private String jdbcURL = "jdbc:mysql://localhost:3308/xyzuniversity";
    private String jdbcUsername = "User";
    private String jdbcPassword = "password";
    
    
    private static final String SELECT_STUDENT_ID = "SELECT name, email FROM student WHERE id =?";

    protected Connection getConnection() {
    
            Connection connection = null;
            try {
                Class.forName("com.mysql.cj.jdbc.Driver");
                connection = DriverManager.getConnection(jdbcURL, jdbcUsername, jdbcPassword);
            }catch (SQLException | ClassNotFoundException e) {
                e.printStackTrace();
            } 
            return connection;
        }

    public Student selectStudent(int id) {
        Student student = null;
        try {
            Connection connection = getConnection();
            PreparedStatement prepStatement = connection.prepareStatement(SELECT_STUDENT_ID);
            prepStatement.setInt(1, id);
            ResultSet rSet = prepStatement.executeQuery();
            while(rSet.next()) {
                String name = rSet.getString("name");
                String email = rSet.getString("email");
                student = new Student(id, name, email);
            }
        } catch (SQLException e) {
            e.printStackTrace();
            }
        return student;
    }
    

最后是应该显示的jsp表单

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, intial-scale=1 shink-to-fit=yes">

    <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.2/dist/css/bootstrap.min.css"
     integrity="sha384..." crossorigin="anonymous">
</head>
<body>
    <nav class="navbar navbar-dark bg-primary pd-8">
         <a class="navbar-brand">&nbsp;&nbsp;&nbsp;&nbsp;XYZ University</a>
    </nav>
    <div class="container col-md-5 p-4">
        <div class="card">
            <div class="card-body">

                <% if (request.getAttribute("student") != null) { %>
               <!-- form display depends on whether there is data in the table -->
                    <form action="<%=request.getContextPath()%>/update" method="post">
                    <% } else { %>
                    <form action="<%=request.getContextPath()%>/insert" method="post">
                    <% } %>
    
                    <div>
                        <h2>
                        <% if (request.getAttribute("student") != null) { %>
                            Edit Student
                        <% } else { %>
                            Add New Student
                        <% } %>
                        </h2>
                    </div>

                <% if (request.getAttribute("student") != null) { %>
                    <input type="hidden" name="id" value="<%=request.getAttribute("student.id") %>" />
                <% } %>

                <fieldset class="form-group">
                <legend>Name</legend>
                <% if (request.getAttribute("student") != null) { %>
                   <input type="text" value="<%=request.getAttribute("student.name") %>" class="form-control" name="name" required="required">
                <% }  else { %>
                    <input type="text" value="" class="form-control" name="name" required="required">
                <% } %>
                </fieldset>

                <fieldset class="form-group">
                <legend>Email</legend>
                <% if (request.getAttribute("student") != null) { %>
                    <input type="text" value="<%=request.getAttribute("student.email") %>" class="form-control" name="email">
                <% }  else { %>
                    <input type="text" value="" class="form-control" name="email">
                <% } %>     
                </fieldset>
                <button type="submit" class="t-3 btn btn-success">Save</button>
                </form>
            </div>
        </div>
    </div>

</body>
</html>

我假设通过将编辑url设置为href=”来获得id值

我真的不知道现在该做什么,我已经尝试寻找解决方案,但似乎没有任何帮助我的问题任何帮助将不胜感激。

共有1个答案

欧阳翔
2023-03-14

问题是您的请求属性的名称是学生

request.setAttribute("student", currentStudent);

但是属性查找代码正在查找学生。id,然后返回null。

<input type="hidden" name="id" value="<%=request.getAttribute("student.id") %>" />

因此,您需要先获取属性,然后获取其属性来填充表单

<input type="hidden" name="id" value="<%= ((Student) request.getAttribute("student")).getId() %>" />
<input type="text" name="name" value="<%= ((Student) request.getAttribute("student")).getName() %>" ... />
<input type="text" name="email" value="<%= ((Student) request.getAttribute("student")).getEmail() %>" ... />

request.get属性()方法的返回类型是Object,因此,在使用getters访问属性之前,需要强制转换为学生。这意味着JSP页面也需要import指令。

<%@ page import="model.Student" %>

但是,我建议使用JSP EL表达式语言语法将这些查找缩短为

<input type="hidden" name="id" value="${student.id}" />
<input type="text" name="name" value="${student.name}" class="form-control" required="required" />
<input type="text" name="email" value="${student.email}" class="form-control" />

这看起来更干净,可读性更强,不需要类型转换,并且可以优雅地处理null值。您甚至不需要所有这些检查,因为如果学生属性为空,则值将自动设置为。

因此,您的所有表单组

<fieldset class="form-group">
    <legend>First Name</legend>
    <% if (request.getAttribute("student") != null) { %>
        <input type="text" value="${student.firstname}" class="form-control" 
               name="firstname" required="required">
    <% }  else { %>
        <input type="text" value="" class="form-control" name="firstname" required="required">
    <% } %>
</fieldset>

使用EL可以简化为仅仅几行。

<fieldset class="form-group">
    <legend>First Name</legend>
    <input type="text" value="${student.firstname}" class="form-control"
           name="fistname" required="required">
</fieldset>
 类似资料:
  • 谁能告诉我,除了RequestDispatcher之外,是否还有其他方法可以从我的servlet调用jsp页面?因为我试了很多都没有成功。 我的servlet工作正常,从JSP中恢复了所有数据。我所需要的只是在用户正确输入用户名和密码时被重定向到另一个页面。 我要为其重定向的jsp

  • 问题内容: 我的Java应用程序中有一个按钮,当单击该按钮时,该按钮应导致Word打开特定文件。该文件位于文件系统中的某个位置,例如用户的文档目录中。 如何在Java中实现类似的功能? 问题答案: 这是简单的演示应用程序,您可以针对按钮单击事件对其进行修改: } 这将使用默认单词应用程序打开单词文件。台式机的更多详细信息

  • 首先感谢你花时间回答我的问题。 我想做的是:当我的jsp页面加载时,我想从我的servlet中获取一个值来设置我的按钮的实际状态和我的滑块值的实际状态。在我的页面上更新之后,我想更改它的值。我已经可以将JSP页面值传递给我的servlet,但我有点坚持将值从servlet传递给jsp页面。 这里有一些代码可以帮助 当做 JSP文件 AJAX代码 服务器代码:

  • 我正在使用下面的代码向设备发送推送通知。 推送通知已成功发送到设备上。 但是当我点击通知时,特定的页面应该是打开的。 例如 如果我点击通知,我想打开产品或关于页面,那么我必须做什么? 这里怎么了?请告诉我正确的解决方法。

  • 问题内容: 是否可以在JSP页面上使用,然后在HTML Submit上使用在中获得相同的请求属性? 问题答案: 不能。不幸的是,Request对象仅在页面加载完成之前才可用-一旦完成,您将丢失其中的所有值,除非它们存储在某个位置。 如果要通过请求保留属性,则需要: 在表单中有一个隐藏的输入,例如。然后,它将在servlet中作为请求参数提供。 将其放在会话中(请参阅-在JSP 中,它很容易使用)

  • 我试图开发一个开放id和谷歌登录的spring mvc项目。我使用的是java配置。xml配置为 但不知道java配置中对应的代码是什么。