为什么在 jsp returns 上调用会话会出错?

Why does calling a session on jsp returns an error?

我在对 jsp 文件调用会话时遇到问题。我正在尝试创建一个 Spring 和 Hibernate 项目,该项目涉及使用基于 Java 的配置(无 xml 配置)的会话。下面是我正在做的事情的快照。

这是我的控制器之一:

@Controller
@RequestMapping(value = "/sp")
public class ELibraryController {

    @RequestMapping(value = "/form")
    public String index(ModelMap m) {
        m.put("basket", new Basket());
        return "form";
    }

    @SuppressWarnings("unchecked")
    @RequestMapping(value = "/addbasket", method = RequestMethod.POST)
    public String addbasket(@ModelAttribute("basket") Basket b, HttpSession session) {
        List<Basket> lst = (List<Basket>) session.getAttribute("basket");
        if(lst == null) {
            lst = new ArrayList<>();
            lst.add(b);
        }else {
            boolean flag = false;
            for(Basket basket : lst) {
                if(basket.getId()==b.getId()) {
                    basket.setQuantity(basket.getQuantity()+1);
                    flag = true;
                    break;
                }
            }
            if(flag==false)
                lst.add(b);
        }
        session.setAttribute("basket", lst);
        session.setAttribute("total", lst);
        return "basket";
    }

    public int getNoBooksBorrowed(List<Basket> lst) {
        int total = 0;
        for(Basket basket : lst) {
            total += (basket.getQuantity());
        }
        return total;
    }

}

这是我的form.jsp

...
<body>
    <f:form modelAttribute="basket" action="addbasket" method="POST">
        ID: <f:input path="id"/><br/>
        Book Name: <f:input path="name"/><br/>
        Quantity: <f:input path="quantity"/><br/>
        <input type="submit" value="Add to Basket"/>
    </f:form>
</body>
...

其中 f 是一个 spring 形式。

这是我的basket.jsp

...
<table border="1" cellpadding="10px" width="100%" style="border-collapse: collapse;">
        <c:forEach items="<%= request.getSession().getAttribute("basket") %>" var="b">
            <tr>
                <td>${b.id}</td>
                <td>${b.name}</td>
                <td>${b.quantity}</td>
                <td>
                    Remove
                </td>

            </tr>
        </c:forEach>
            <tr>
                <td colspan="5">
                    Total Book/s Borrowd:  <%= request.getSession().getAttribute("total") %>
                </td>
            </tr>
</table>
...

其中 c 是一个 jstl 核心。

因为我使用的是基于 Java 的配置。下面是初始化器 class:

public class AppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {

    @Override
    protected Class<?>[] getRootConfigClasses() {
        return new Class[] { AppConfig.class };
    }

    @Override
    protected Class<?>[] getServletConfigClasses() {
        return null;
    }

    @Override
    protected String[] getServletMappings() {
        return new String[] { "/" };
    }
}

这是我的classAppConfig.java

@Configuration
@EnableWebMvc
@ComponentScan(basePackages = "com.org.elibrary")
public class AppConfig extends WebMvcConfigurerAdapter{

    @Override
    public void configureViewResolvers(ViewResolverRegistry registry) {
        InternalResourceViewResolver viewResolver = new InternalResourceViewResolver();
        viewResolver.setViewClass(JstlView.class);
        viewResolver.setPrefix("/WEB-INF/views/");
        viewResolver.setSuffix(".jsp");
        registry.viewResolver(viewResolver);
    }
}

在 运行 之后,如果我浏览到 http://localhost:8080/Elibrary/sp/form, the page displays correctly but when i click Add to Basket button, the browser point to http://localhost:8080/Elibrary/sp/addbasket 但 returns 出现以下错误:

SEVERE: Servlet.service() for servlet [dispatcher] in context with path [/Elibrary] threw exception [/WEB-INF/views/basket.jsp (line: 13, column: 24) Attribute value  request.getSession().getAttribute("basket")  is quoted with " which must be escaped when used within the value] with root cause
org.apache.jasper.JasperException: /WEB-INF/views/basket.jsp (line: 13, column: 24) Attribute value  request.getSession().getAttribute("basket")  is quoted with " which must be escaped when used within the value
    at org.apache.jasper.compiler.DefaultErrorHandler.jspError(DefaultErrorHandler.java:41)
...

非常感谢您的帮助!

使用单引号

"<%=request.getSession().getAttribute('basket')%>"

或使用

'<%=request.getSession().getAttribute("basket")%>'