访问jstl上的会话属性是什么?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (157)

我想从一个由servlet设置和调度的jsp页面访问会话属性,但是我收到错误消息“jsp:attribute must be the subelement of a standard or custom action”。有什么可能是错误的,我不正确地访问它?以下是代码片段:

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;
}

我可以成功设置会话属性。但是,当我尝试访问我的jsp文件(下面)中的相同,我得到一个运行时错误:

    <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>

这个bean的QuestionBook包含两个私有变量questionPaperID问题 我在Tomcat上运行应用程序,下面是抛出的错误:

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)
            ....
提问于
用户回答回答于

jsp:useBean如果您已经有了准备好模型的控制器,则不需要设置模型。

只需通过EL访问它即可

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

或者<c:out>如果您希望HTML转义值或当您仍在使用旧版Servlet 2.3容器或更旧版本(如果模板文本中尚不支持EL),则可以使用JSTL 标记:

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

与这个问题无关,正常的做法是用小写字母开始属性名称,就像使用普通变量名称一样:

session.setAttribute("questions", questions);
用户回答回答于

现在,如果你使用JSTL或任何其他标记库,访问bean 属性需要您的bean具有此属性。一个属性不是一个私有的实例变量。这是一个可以通过公共getter访问的信息(如果该属性是可写的,则是setter)。要访问questionPaperID属性,你需要有一个:

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

一旦你有了,你可以使用下面的代码显示这个属性的值:

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

或者专门针对会话作用域属性:

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

最后,我鼓励您将范围属性命名为Java变量。

扫码关注云+社区

领取腾讯云代金券