Получить значения из JDBC и использовать теги JSTL для вызова методов
Ниже приведен код, который я написал для извлечения значений из базы данных (я добавил весь код, чтобы вам было легче понять, что я пытаюсь здесь сказать):
package ipscheme;
import java.sql.*;
public class AddRecords {
Connection con = new DBConnection().getConnection();
ResultSet resultSet = null;
public String [] populateSelect() throws SQLException {
Statement statement = con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY);
resultSet = statement.executeQuery("SELECT * FROM ipsections");
resultSet.last();
int size = resultSet.getRow();
resultSet.beforeFirst();
String [] sectionName = new String[size];
int j = 0;
while (resultSet.next()){
sectionName[j] = resultSet.getString("section_name");
j = j + 1;
}
resultSet.close();
statement.close();
con.close();
return sectionName;
}
}
А вот код JSP, который я использовал для заполнения значений из базы данных в поле выбора.
<select name="sltSection">
<%
AddRecords added = new AddRecords();
String sectionNm [] = added.populateSelect();
for(int i=0; i<sectionNm.length; i++){ %>
<option>
<% out.print(sectionNm[i]); %>
</option>
<% } %>
</select>
Приведенный выше код отлично работает без каких-либо ошибок компиляции. Как вы можете видеть, я использовал Java-код на своей странице.jsp для выполнения этой задачи, что неправильно.
Мне нужно реализовать этот код в соответствии с MVC, и поэтому я должен использовать теги JSTL для реализации кода в.jsp? если да, то как мне это сделать? Как мне создать экземпляр Object из класса AddRecords
и называть его методами? Может кто-нибудь, пожалуйста, помогите мне. Заранее спасибо!
3 ответа
Поскольку кажется, что вы новичок в Java Web Programming, вы можете реализовать полный сценарий MVC, используя JSP (View), Servlet (Controller) и Entities, DAOs и Service layer (Model). Это то, что у вас есть:
Модель:
DBConnection
как класс доступа к базе данных (слой доступа к данным)AddRecords
как ваш класс DAO (уровень доступа к данным)Нет класса как класса обслуживания (уровень бизнес-логики). Для этого примера давайте
RecordService
класс для этого:public class RecordService { public RecordService() { } //since it has no real business logic, it will serve as facade public String[] getRecords() { AddRecords addRecords = new AddRecords(); return addRecords.populateSelect(); } }
контроллер:
Нет класса для контроллера еще. Так как я предполагаю, что вы используете простую Java EE, вы должны использовать Servlet (реализация на основе Servlets Stackru wiki):
@WebServlet("/RecordServlet") public class RecordsServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //it will fire on a GET request (like accessing directly to the URL //from the browser) //here you should load the data for the View (JSP) loadData(request); //forward to show the view request.getRequestDispatcher("hello.jsp").forward(request, response); } @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //it will fire on a POST request (like submitting the form using POST method) String selectedRecord = request.getParameter("selectedRecord"); System.out.println(selectedRecord); request.setAttribute("selectedRecord", selectedRecord); loadData(request); //forward to show the view request.getRequestDispatcher("hello.jsp").forward(request, response); } //method to load the data available to select private void loadData(HttpServletRequest request) { RecordService recordService = new RecordService(); String[] records = recordService.getRecords(); //set the data as attribute on the request to be available on the View request.setAttribute("records", records); } }
Посмотреть:
У вас уже есть файл JSP. Поскольку вы не опубликовали имя, давайте назовем его
hello.jsp
, Я просто адаптирую ваш фактический код JSP с помощью JSTL:<!-- at the beginning of the JSP, call the JSTL library --> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <form action="RecordServlet" method="POST"> Please select an element: <select id="selectedRecord" name="selectedRecord"> <c:forEach items="${records}" var="record"> <option value="${record}">${record}</option> </c:forEach> </select> <br /> <input type="submit" value="Show selected record" /> <c:if test="${not empty selectedRecord}"> <br /> You've selected ${selectedRecord}! </c:if> </form>
Теперь для запуска примера создайте проект и получите к нему доступ, используя http://localhost:8080/YourWebProjectName/RecordServlet
, Кроме того, вы можете установить в web.xml
файл:
<welcome-file-list>
<welcome-file>RecordServlet</welcome-file>
</welcome-file-list>
И просто запустите веб-проект.
Некоторые заметки:
- Используйте соответствующие имена для класса / методов, которые я использовал
RecordXXX
так как у вас было этоAddRecord
класс (должно бытьRecordDAO
или что-то более полезное для читателей кода, таких какUserDAO
или жеYourEntityDAO
). - Распределите ваши классы через различные пакеты. Каждый пакет должен содержать только соответствующие классы, т.е.
edu.home.dao
для занятий DAO,edu.home.service
для классов обслуживания / бизнес-логики и...
Используйте список в классе в качестве возвращаемого значения,
List<String> sectionName = new ArrayList<String>();
while (resultSet.next())
sectionName.add(resultSet.getString("section_name"));
тогда делай
<select name='name'>
<c:forEach var="parameter" items="${sectionName }">
<option value="${parameter}">${parameter}</option>
</c:forEach>
</select>
Здесь параметр - переменная meadiator для доступа к значению переменной списка. Вы также можете использовать массив String.
Прежде всего, если вы пытаетесь что-то сделать с MVC, вы должны отделить свой код. JSP файл только доступ к запросу без кода Java вообще.
Таким образом, ваш контроллер должен сделать что-то вроде этого.
request.setAttribute("ipsections",added.populateSelect());
а затем, в вашем файле JSP
<select name='anything'>
<c:forEach items="${ipsections}" var="ipsection">
<option value="${ipsection}">${ipsection}</option>
</c:forEach>
</select>