首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >访问jstl上的会话属性

访问jstl上的会话属性
EN

Stack Overflow用户
提问于 2011-02-04 01:26:18
回答 2查看 118.6K关注 0票数 16

我试图从由servlet设置和分派的jsp页面访问会话属性,但收到错误消息"jsp:attribute必须是标准或自定义操作的子元素“。可能出了什么问题,是不是我访问它不正确?以下是代码片段。

Servlet:

代码语言:javascript
复制
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文件中的相同内容时(如下所示),我得到了一个运行时错误

代码语言:javascript
复制
    <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问题包含两个私有变量questionPaperID QuestionBook 我在Tomcat上运行应用程序,下面是抛出的错误。

代码语言:javascript
复制
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)
            ....
EN

回答 2

Stack Overflow用户

发布于 2011-02-04 01:42:54

你绝对应该避免使用<jsp:...>标签。它们是过去的遗物,现在应该永远避免。

使用JSTL。

现在,无论您是使用JSTL还是任何其他标记库,访问bean 属性都需要您的bean具有此属性。属性不是私有实例变量。它是可通过公共getter (和setter,如果属性是可写的)访问的信息。因此,要访问questionPaperID属性,您需要具有

代码语言:javascript
复制
public SomeType getQuestionPaperID() {
    //...
}

方法。

完成后,您可以使用以下代码显示此属性的值:

代码语言:javascript
复制
<c:out value="${Questions.questionPaperID}" />

或者,专门针对会话范围的属性(在范围之间发生冲突的情况下):

代码语言:javascript
复制
<c:out value="${sessionScope.Questions.questionPaperID}" />

最后,我鼓励您将作用域属性命名为Java变量:以小写字母开头。

票数 36
EN

Stack Overflow用户

发布于 2011-02-04 01:40:48

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

只需通过EL直接访问它:

代码语言:javascript
复制
<p>${Questions.questionPaperID}</p>
<p>${Questions.question}</p>

或者如果你想使用<c:out>转义值,或者当你还在处理遗留的Servlet2.3容器或更早的容器时,当模板文本中还不支持EL时,也可以使用JSTL标记:

代码语言:javascript
复制
<p><c:out value="${Questions.questionPaperID}" /></p>
<p><c:out value="${Questions.question}" /></p>

另请参阅:

与这个问题无关,通常的做法是属性名以小写开头,就像您对普通变量名所做的那样。

代码语言:javascript
复制
session.setAttribute("questions", questions);

并相应地更改EL以使用${questions}

还要注意,您的代码中没有任何JSTL标记。这一切都是纯JSP。

票数 15
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4889431

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档