我在调用 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/