Как получить параметры запроса в JSTL вместо скриптов - PullRequest
0 голосов
/ 19 мая 2018

Я пытался отобразить таблицу в JSP, для которой я использую этот код цикла while, как показано ниже, проблема в том, что мне трудно преобразовать свои скриптлеты в JSTL, особенно в rs.getInt ("id")) и я использую JSTL, чтобы я мог кодировать URL вместе.

Class.forName("com.mysql.cj.jdbc.Driver");
                        String url = "jdbc:mysql://localhost:3306/login";
                        String username = "root";
                        String password = "your-password";
                        String query = "select * from employeesloginaccount";
                        Connection conn = DriverManager.getConnection(url, username, password);
                        Statement stmt = conn.createStatement();
                        ResultSet rs = stmt.executeQuery(query);
                        while (rs.next()) {
                %>
                <tr>
                    <td><%=rs.getInt("id")%></td>
                    <td><%=rs.getString("first_name")%></td>
                    <td><%=rs.getString("last_name")%></td>
                    <td>

                        <c:url value ="${pageContext.request.contextPath}/downloadFileServlet" var = "myURL">
                          <c:param name = "id" value = "<%=rs.getInt(id)%>"/>
                        </c:url>
                        <form method="get"
                            action="<c:import url = "${myURL}"/>">
                            <input style="text-align: center" type="submit" value="Save">
                        </form>
                    </td>
                </tr>
                <%
                    }

1 Ответ

0 голосов
/ 19 мая 2018

Думаю, стоит подумать об этом ответе BalusC на вопрос «Как избежать использования кода Java в файлах JSP?»

Использование скриплетов (тех,<% %> вещей) в JSP действительно крайне не рекомендуется с момента рождения taglibs (например, JSTL ) и EL (Expression Language, эти ${} вещи)более десяти лет назад.

Основные недостатки скриплетов:

  1. Возможность повторного использования : вы не можете повторно использовать скриптлеты.
  2. Заменяемость : вы не можете сделать абстрактные скриптлеты.
  3. OO-способность : вы не можете использовать наследование / композицию.
  4. Отладка : если скриптлет выбрасывает исключение на полпути, все, что вы получаете, это пустая страница.
  5. Тестируемость : скриптлеты не тестируются модулем.
  6. Ремонтопригодность : для сохранения логики смешанного / загроможденного / дублированного кода требуется больше времени.

Вашспецифическая проблема здесь ремонтопригодность .

Что вам следует сделать, это отделить логику вашего приложения, чтобы вы могли иметь высокий уровень возможности повторного использования / тестирования / отладки / обслуживания и т. Д. Давайте начнем с создания класса Java для подключения к базе данных, может быть,что-то вроде этого:

public class DBConnection {
    private static String url = null;
    private static Connection conn = null;
     public static Connection getConnection(){
     try{

       Class.forName("com.mysql.jdbc.Driver");
       url = "jdbc:mysql://localhost:3306/login";

     conn = DriverManager.getConnection(url,"root","your-password");
     }   catch (Exception e) {
            System.out.println(e);
        } 
     return conn;
     }
}

Затем вы можете использовать этот класс, когда захотите подключиться к вашей базе данных и сделать что-то из других классов, в приведенных ниже примерах мы создадим объект для обработки данных вашего сотрудника, а затемиспользуйте это для получения информации из вашей базы данных:

public class EmployeeObject {

    int id;
    String firstname;
    String lastname;


    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getFirstname() {
        return firstname;
    }
    public void setFirstname(String firstname) {
        this.firstname = firstname;
    }
    public String getLastname() {
        return lastname;
    }
    public void setLastname(String lastname) {
        this.lastname = lastname;
    }

}

Теперь, когда у нас есть этот класс объектов, допустим, у вас есть другой класс с именем Employees, и в этом классе у вас есть метод, который получает информацию о сотрудниках из employeesloginaccount table:

public class Employees {    

    public List<EmployeeObject> getEmployeeInfo(){
        //this class will return a list of EmployeeObjects from the database.
        ArrayList<EmployeeObject> employees = new ArrayList<EmployeeObject>();
        //get connection from our DBConneciton class we created earlier
        try(Connection conn= DBConnection.getConnection()){
       PreparedStatement pst = conn.prepareStatement("select * from employeesloginaccount;"); 
                ResultSet rs = pst.executeQuery();
                while (rs.next()) {
                    //for each result in database, create an EmployeeObject
                    EmployeeObject employee = new EmployeeObject();

                    int id = rs.getInt("id");
                    employee.setId(id);

                    String fname = rs.getString("first_name"); 
                    employee.setFirstname(fname);

                    String lname = rs.getString("last_name"); 
                    employee.setLastname(lname);

                    employees.add(employee); // add each EmployeeObject to the arrayList of EmployeeObject's
                }
            } catch (SQLException e) {
                e.printStackTrace();
            }
            return employees; //return all the results      
    }   

}

Затем вы создаете сервлет, который будет получать эту информацию, давайте упростим его и поместим наш код в метод сервлета doGet, чтобы при каждом посещении URL-адреса этого сервлета мы моглиназову этот код (в этом случае я назвал мой Servlet Test, с URL-адресом маpping / Test:

@WebServlet("/Test")
public class Test extends HttpServlet {
    private static final long serialVersionUID = 1L;

    public Test() {
        super();
    }

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

        Employees e = new Employees(); //instantiate the Employees class 

        List<EmployeeObject> employees = e.getEmployeeInfo(); //get employee info from database

        request.setAttribute("employees", employees); //set this list of employees to the request so we can access it in our jsp

        RequestDispatcher rd = request.getRequestDispatcher("example.jsp"); //change to whatever your jsp is that you want to view the information
        rd.forward(request, response);
    }

}

И, наконец, на нашей странице JSP, где мы можем просмотреть эту информацию:

<!DOCTYPE HTML>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn"%>
<%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%>
<html>
<head>
<title>Example Page</title>
</head>

<body>

<table style="width:100%;">
<thead>
<tr>
<td>id</td>
<td>Firstname</td>
<td>Lastname</td>
</tr>
</thead>

<tbody>
<!-- for each item in our employees list create a variable called "employee" -->
<c:forEach items="${employees}" var="employee">
<tr>
<td>${employee.id}</td>
<td>${employee.firstname}</td>
<td>${employee.lastname}</td>
</tr>
</c:forEach>

</tbody>
</table>

</body>
</html>

Дайте мне знать, если это поможет вам или у вас есть какие-либо вопросы.:)

...