【问题标题】:Why does calling a session on jsp returns an error?为什么在jsp上调用会话会返回错误?
【发布时间】:2017-02-22 10:36:45
【问题描述】:

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

这是我的控制器之一:

@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是弹簧形式。

这是我的 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,页面会正确显示,但是当我点击添加到购物篮按钮时,浏览器会指向@987654322 @ 但返回以下错误:

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

非常感谢您的帮助!

【问题讨论】:

    标签: java jsp spring-mvc session jstl


    【解决方案1】:

    使用单引号

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

    或者使用

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

    【讨论】:

    • 非常感谢。它现在可以使用第二个。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-01
    • 2015-12-26
    • 1970-01-01
    • 2016-01-08
    • 2023-03-18
    相关资源
    最近更新 更多