java - 为什么在jsp上调用session会返回错误?

标签 java jsp spring-mvc session jstl

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

这是我的 Controller 之一:

@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 的配置。下面是初始化类:

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[] { "/" };
    }
}

这是我的类AppConfig.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 ,页面显示正确,但当我单击添加到购物篮按钮时,浏览器指向 http://localhost:8080/Elibrary/sp/addbasket 但返回以下错误:

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")%>'

关于java - 为什么在jsp上调用session会返回错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42388796/

相关文章:

mysql - 基于JSP与MySQL连接的注册系统-db中的null

jsp - IDEA 14 中的标准 Tomcat 库

java - 从 spring 4.3.2 升级到 5.0.2 导致缺少 @AliasFor 错误

java - HK2相当于Guice的静态注入(inject)绑定(bind)和ProviderBinding

java - 一个 spring 集成管道中的多个数据源?

java - 如何将 Swing 设计与类分离,以便之后代码可以轻松转换为 Android

java - JSP中如何控制显示位数?

java - Spring MVC 从 Controller 发送消息代码

spring - 需要类型为 'org.springframework.security.authentication.AuthenticationManager' 的 bean,但无法找到。来自 Spring 安全的消息

java - java 错误中的关键事件