2013-05-15 5 views
1

Я новичок в веб-программировании, и я придерживался проектирования простого потока.Передача аргументов между двумя страницами JSP

Скажем, у меня есть простой объект, как,

public class Object1 
{ 
    private int ID; 
    private String text; 

    { getters and setters etc} 
} 

я получаю кучу (в зависимости от номера записи в БД) из них с моей DAO как List<Object1>, и печатать их в петлю на странице , позволяет называть его jspPage1. И у меня есть другая страница, jspPage2, что делает что-то с Object1.ID

Что я хочу:

Создать какую-то связь, таким образом, что, когда пользователь нажимает или выбирает объект, идентификатор выбранного объекта (на jspPage1) будет отправлен на адрес jspPage2.

То, что я думал до сих пор;

  • Создание гиперссылка для перенаправления с идентификационной информацией, например:

    <c:forEach items="${objects}" var="object1"> 
         <tr> 
          <td><a href="/jspPage2?id=${object1.ID}">${object1.text} </a></td> 
         </tr> 
        </c:forEach> 
    

    Это воняет плохо, любой может подделать адресную строку и изменить идентификатор значения.

  • Я мог обмануть информацию о аргументе по опции №1. Это кажется немного более безопасным, но некоторые умышленные пользователи могут по-прежнему смешаться с созданным хешем .

  • Я мог бы написать некоторые сценарии вроде request.setAttribute("ID", object1.ID);, но мне сказали, что код и логика на страницах JSP - это неправильная вещь.

Чтобы повторить мой вопрос; Есть ли способ делать такие вещи более аккуратно?

или

ли мой способ приблизиться к этой проблеме в корне неправильно, и я должен рассмотреть другую конструкцию. (Если, так что любые советы о том, что)

ответ

1

Один способ, которым я могу думать о том, чтобы используйте подход MVC. Как только пользователь нажимает на URL-адрес, вы можете иметь сервлет, удостоверяющий, что идентификатор объекта действителен. Другими словами, сервлет будет содержать всю вашу логику. Так, в jspPage1

<c:forEach items="${objects}" var="object1"> 
    <tr> 
     <td><a href=" 
       <c:url value='/checkId' > 
        <c:param name='id'value ='${object1.ID}' /> 
       </c:url> 
       ">${object1.text}</a> 
    </tr> 
</c:forEach> 

Затем вы регистрируетесь сервлет под названием CheckIdServlet в web.xml

<servlet> 
    <servlet-name>checkId</servlet-name> 
    <servlet-class>CheckIdServlet</servlet-class> 
</servlet> 
<servlet-mapping> 
    <servlet-name>checkId</servlet-name> 
    <url-pattern>/checkId</url-pattern> 
</servlet-mapping> 

Поскольку вы передаете параметры в URL все, что вам нужно сделать, это переопределить doGet (.. ,) Метод

public class CheckIdServlet extends HttpServlet { 

@Override 
protected void doGet(HttpServletRequest request, HttpServletResponse response) 
     throws ServletException, IOException { 
    //do your id checking to make sure it's a number or if id value is actually in the database 
    //if either condition not met, you could redirect back to jsppage 1 or however you want to do 
    //handle 
    response.sendRedirect("/jsppage1.jsp"); 

    //or if id is valid 
    RequestDispatcher dispatcher = getServletContext().getRequestDispatcher("/jsppage2.jsp"); 
    dispatcher.forward(request, response); 

    //Keep in mind this is pseudocode so make sure to add your if conditions above 

} 

Наконец, в jsppage2 вы просто отобразить ваш идентификатор объекта

<h1>${param.id}</h1> 
+0

Параметр передачи параметров, но проверка правильности в контроллере. Да, я думаю, что это лучший подход. Спасибо. – JuniorDev

0

Вы можете хранить эти значения в сессии, а затем вы можете использовать во второй Jsp странице

иначе вы можете использовать request.setAttribute("name",value);

+0

Для того, чтобы сохранить эти значения в сессии, я должен написать скриптлет в JSP-странице прямо? (так как я не знаю, какой пользователь выберет). Если это так, я уже рассматривал этот подход и не понравился. См. Параметр № 3 – JuniorDev

Смежные вопросы