attribute jsp jstl

jsp - attribute - Accede al atributo Session en jstl



jstl session (2)

Estoy tratando de acceder a un atributo de sesión desde una página jsp que está configurada y distribuida por un servlet, pero aparece el mensaje de error "jsp: attribute debe ser el subelemento de una acción estándar o personalizada". ¿Qué podría estar mal, estoy accediendo incorrectamente? El siguiente es el fragmento de código.

Servlet:

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { HttpSession session = request.getSession(); session.setAttribute("Questions", getQuestion()); System.out.println(session.getAttribute("Questions")); RequestDispatcher req = request.getRequestDispatcher("DisplayQuestions.jsp"); req.forward(request, response); } private QuestionBookDAO getQuestion(){ QuestionBookDAO q = new QuestionBookDAO(); q.setQuestion("First Question"); q.setQuestionPaperID(100210); q.setSubTopic("Java"); q.setTopic("Threads"); return q; }

Soy capaz de establecer el atributo de sesión con éxito. Pero cuando intento acceder al mismo en mi archivo jsp (a continuación), aparece un error de tiempo de ejecución

<jsp:useBean id="Questions" type="com.cet.evaluation.QuestionBook" scope="session"> <jsp:getProperty property="Questions" name="questionPaperID"/> <jsp:getProperty property="Questions" name="question"/> </jsp:useBean>

El QuestionBook de bean contiene dos variables privadas questionPaperID y la pregunta que ejecuto la aplicación en Tomcat y a continuación se muestra el error.

type Exception report message description The server encountered an internal error () that prevented it from fulfilling this request. exception org.apache.jasper.JasperException: /DisplayQuestions.jsp(15,11) jsp:attribute must be the subelement of a standard or custom action org.apache.jasper.compiler.DefaultErrorHandler.jspError(DefaultErrorHandler.java:40) org.apache.jasper.compiler.ErrorDispatcher.dispatch(ErrorDispatcher.java:407) org.apache.jasper.compiler.ErrorDispatcher.jspError(ErrorDispatcher.java:88) org.apache.jasper.compiler.Parser.parseStandardAction(Parser.java:1160) org.apache.jasper.compiler.Parser.parseElements(Parser.java:1461) org.apache.jasper.compiler.Parser.parseBody(Parser.java:1670) org.apache.jasper.compiler.Parser.parseOptionalBody(Parser.java:1020) ....


Definitivamente debes evitar usar etiquetas <jsp:...> . Son reliquias del pasado y siempre deben ser evitadas ahora.

Usa el JSTL.

Ahora, ya sea que use JSTL o cualquier otra biblioteca de etiquetas, el acceso a una propiedad de bean necesita que su bean tenga esta propiedad. Una propiedad no es una variable de instancia privada. Es una información accesible a través de un captador público (y establecedor, si la propiedad es de escritura). Para acceder a la propiedad questionPaperID, necesita tener un

public SomeType getQuestionPaperID() { //... }

Método en tu frijol.

Una vez que tenga eso, puede mostrar el valor de esta propiedad usando este código:

<c:out value="${Questions.questionPaperID}" />

o, para dirigirse específicamente a los atributos del ámbito de la sesión (en caso de conflictos entre ámbitos):

<c:out value="${sessionScope.Questions.questionPaperID}" />

Finalmente, lo aliento a nombrar atributos de alcance como variables de Java: comenzando con una letra minúscula.


No necesita jsp:useBean para configurar el modelo si ya tiene un controlador que preparó el modelo.

Simplemente acceda a la llanura por EL:

<p>${Questions.questionPaperID}</p> <p>${Questions.question}</p>

o por la etiqueta JSTL <c:out> si desea que HTML se escape de los valores o cuando aún esté trabajando en contenedores de Servlet 2.3 heredados o más antiguos cuando EL aún no era compatible con el texto de la plantilla:

<p><c:out value="${Questions.questionPaperID}" /></p> <p><c:out value="${Questions.question}" /></p>

Ver también:

  • Nuestra página wiki de Servlets

Sin relación con el problema, la práctica normal es iniciar el nombre del atributo con una minúscula, como ocurre con los nombres de variables normales.

session.setAttribute("questions", questions);

y modifique EL en consecuencia para usar ${questions} .

También tenga en cuenta que no tiene ninguna etiqueta JSTL en su código. Todo es simple JSP.