¿Cómo puedo guardar un objeto en la sesión? y ¿Cómo utilizarlo en un JSP? Servlet Web

Tengo este Servlet en el cual voy a recibir el nombre y la contraseña del objeto request para posteriormente validar si existe en la base de datos y consultar su nombre completo. Pero una vez creado el objeto de tipo UsuarioDTO no sé cómo guardarlo en la sesión para mostrar la propiedad nombreCompleto en varios JSP:

@WebServlet("/One")
public class One extends HttpServlet {

    protected void doGet(HttpServletRequest request, 
    HttpServletResponse response) throws ServletException, IOException {
        /* Se crea el usuario */
        UsuarioDTO usuario = new UsuarioDTO();
        usuario.setIdUsuario(1);
        usuario.setNombre("jperez");
        usuario.setNombreCompleto("Juan Pérez López");

        //Aquí necesito meter el usuario a la sesión antes de que se
        //vaya a la página principal

        response.sendRedirect(request.getContextPath() + "/principal.jsp");
    }
}

Este es el DTO:

public class UsuarioDTO {

    private long idUsuario;
    private String nombre;
    private String nombreCompleto;

    public long getIdUsuario() {
        return idUsuario;
    }
    public void setIdUsuario(long idUsuario) {
        this.idUsuario = idUsuario;
    }
    public String getNombre() {
        return nombre;
    }
    public void setNombre(String nombre) {
        this.nombre = nombre;
    }
    public String getNombreCompleto() {
        return nombreCompleto;
    }   
    public void setNombreCompleto(String nombreCompleto) {
        this.nombreCompleto = nombreCompleto;
    }
}

6
задан 11.11.2016, 21:12
4 ответа

➊ Сначала ты возвращаешь объект HttpSession:

HttpSession session = request.getSession();

На интерфейсе HttpSession, Арун Гупте 1 говорит:

Интерфейс HttpSession может использоваться для того, чтобы видеть и манипулировать informaciГіn одной sesiГіn такие как идентификатор sesiГіn и час creaciГіn, и для того, чтобы связывать объекты в нее sesiГіn. [...] mГ©todos session.setAttribute и session.getAttribute использованы, чтобы соединять / соединять объекты в нее sesiГіn.

➋ Потом распредели твой объект с именем как признаком в ней sesiГіn. А именно, например:

session.setAttribute("usr", usuario);

В тебе cГіdigo:

/* Se crea el usuario */
UsuarioDTO usuario = new UsuarioDTO();
usuario.setIdUsuario(1);
usuario.setNombre("jperez");
usuario.setNombreCompleto("Juan Pérez López");

HttpSession session = request.getSession();
session.setAttribute("usr", usuario);

response.sendRedirect(request.getContextPath() + "/principal.jsp");

➌ И в твоем JSP (principal.jsp) ты можешь использовать Экспрессион Лангвахе , чтобы показывать данные. Это, например:

<p>Id Usuario: <strong>${usr.idUsuario}</strong></p>
<p>Nombre: <strong>${usr.nombre}</strong></p>
<p>NombreCompleto: <strong>${usr.nombreCompleto}</strong></p>

Addendum

Debido a que ты используешь mГ©todo response.sendRedirect, браузер должен делать другую peticiГіn в сервер, чтобы показывать соответствующий JSP (унифицированный указатель ресурса в браузере меняется), которым ты нуждаешься в том, чтобы иметь объект в ней sesiГіn, а именно, в объекте session.

Тем не менее, если бы ты использовал mГ©todo request.getRequestDispatcher, sГіlo necesitarГ-схвати иметь объект в ней peticiГіn настоящий, а именно, в объекте request. И браузер не necesitarГ, - чтобы делать другую peticiГіn (в этом случае, унифицированный указатель ресурса браузера продолжает быть тем же самым).


Замечание

  1. Гупта, Arun. Java США 7 essentials. Севастополь, Калифорния: О'Райли Медия, 2013.
3
ответ дан 24.11.2019, 12:38
  • 1
    существует какая-то restricció n между aplicativos, что находились в том же server? пример, у меня есть 3 приложения на 1 сервере, одна, которая контролирует меню и 2 приложения, которые работают с данными пользователя. (независимые). добавив информацию в session, который должен идти с одного aplicativo до другого, я теряю информацию, и не могу возвращать это в другом aplicativo... habrá который делать algú n дополнительный шаг? – Stevn 21.12.2017, 20:30

Он, должно быть, создает переменную sesiГіn следующего способа:

HttpSession session=request.getSession();  
session.setAttribute("name",name); 

Ты Можешь setear признаки, в которых ты нуждаешься, и чтобы получать их используешь get признака:

session.setAttribute("name");

В твоем JSP остался бы следующего способа:

<% out.print(session.getAttribute("name")); %>

Для большей ссылки ты можешь занимать следующий руководитель:

Servlet session

0
ответ дан 24.11.2019, 12:38

Ты должен создавать объект типа сеанса внутри твоего класса java:

HttpSession miSesion = request.getSession(true);

Потом ты должен добавлять признак, который ты хочешь хранить, распределяя ему идентификатора и стоимость, в твоем случае:

miSesion.setAttribute("nombreCompleto",usuario.getNombreCompleto());

Таким образом, уже ты хранил стоимость в сеансе.

Чтобы мочь возвращать хранившуюся стоимость ты должен использовать метод Get, пример:

String nombreUsuario = miSesion.getAttribute("nombreCompleto");

Таким образом, уже ты можешь переходить это или возвращать это прямо с твоего JSP.

Привет

0
ответ дан 24.11.2019, 12:38

Я должен разубеждать ответы, которые есть, что они основываются в scriptlets ( <% %> и <%= %>), которыми оно считалось deprecados. Если ты работаешь в проекте с scriptlets, поддержи это таким, но новые проекты были бы должны использовать Экспрессион Лангвахе (ОН) или по крайней мере JSTL.

Чтобы помещать объект в один session, я встречаюсь с другими вопросами, хотя я рекомендую помещать полный DTO.

HttpSession session=request.getSession();  
session.setAttributemiSesion.setAttribute("usuario", usuario);

Чтобы использовать bean посредством НЕГО, просто сделай

${usuario.nombreCompleto}

в JSP. Это будет искать bean usuario в различных scopes (страница, request, session и application) и, когда он это найдет, он позвонит в метод getNombreCompleto().

Также возможно использовать внутри tags JSTL:

 <c:if test="${usuario.nombreCompleto eq 'Pepe'}"/>
    Es pepito!
 </c:if>
 <c:if test="${usuario.nombreCompleto ne 'Pepe'}"/>
    No es pepito, es ${usuario.nombrecompleto}
 </c:if>

Если твою платформу еще не выносит ОН, ты можешь использовать tags JSP useBean и getAttribute

<jsp:useBean name="usuario">
<jsp:getProperty name="usuario" property="nombreCompleto">

Конечно, если данные bean связаны с просьбой и не с сеансом, самое нормальное состоит в том, чтобы сохранять bean как признак request (request.setAttribute()) и делать forward вместо одного redirect1; это способствует тому, чтобы не имелись эти данные с другими одновременными просьбами. В этом случае, JSP не расстроен.


1 Redirect показывает клиенту (browser), что он должен быть пересланным в новую страницу, создавая новую просьбу. Forward продолжает процесс той же просьбы в унифицированном указателе ресурса, который проходит с ним, браузер ничего не делает.
0
ответ дан 24.11.2019, 12:38