Spring MVC项目product2.jsp加载商品图片<c:url标签报错求助
问题描述
我尝试在商品详情JSP页面添加图片,对应数据库表结构如下:
CREATE TABLE PRODUCTS ( ID VARCHAR(25) PRIMARY KEY, NAME VARCHAR(50), DESCRIPTION VARCHAR(250), UNIT_PRICE DECIMAL, MANUFACTURER VARCHAR(50), CATEGORY VARCHAR(50), CONDITION VARCHAR(50), UNITS_IN_STOCK BIGINT, UNITS_IN_ORDER BIGINT, DISCONTINUED BOOLEAN );
数据库中的测试商品数据如下:
INSERT INTO PRODUCTS VALUES ('P1234', 'iPhone 6s', 'Apple iPhone 6s smartphone with 4.00-inch 640x1136 display and 8-megapixel rear camera','500','Apple','Smartphone','New',450,0,false); INSERT INTO PRODUCTS VALUES ('P1235', 'Dell Inspiron', 'Dell Inspiron 14-inch Laptop (Black) with 3rd Generation Intel Core processors',700,'Dell','Laptop','New',1000,0,false); INSERT INTO PRODUCTS VALUES ('P1236', 'Nexus 7', 'Google Nexus 7 is the lightest 7 inch tablet With a quad-core Qualcomm Snapdragon™ S4 Pro processor', 300,'Google','Tablet','New',1000,0,false);
Product控制器代码如下:
// 第103页新增 @RequestMapping("/product") public ModelAndView getProductById(@RequestParam("id") String productId, Model model) { ModelAndView netice = new ModelAndView("product"); netice.addObject("product", productService.getProductById(productId)); System.out.println("109"); // model.addAttribute("product",productService.getProductById(productId)); return netice; } @RequestMapping("/product2") public String getProduct2ById(@RequestParam("id") String productId, Model model) { System.out.println("117"); Product product = productService.getProductById(productId); model.addAttribute("product", product); return "product2"; }
可正常运行的product.jsp代码如下:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> <%@ taglib prefix="spring" uri="http://www.springframework.org/tags"%> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <link rel="stylesheet" href="//netdna.bootstrapcdn.com/bootstrap/3.0.0/css/bootstrap.min.css"> <title>商品</title> </head> <body> <section> <div class="jumbotron"> <div class="container"> <h1>商品</h1> </div> </div> </section> <section class="container"> <div class="row"> <div class="col-md-5"> <!-- 向用户展示图片的位置 --> <img src="<c:url value="/img/${product.productId}.png"></c:url>" alt="image" style = "width:100%"/> <h3>${product.name}</h3> <p>${product.description}</p> <p> <strong>商品编码:</strong><span class="label label warning">${product.productId} </span> </p> <p> <strong>生产商</strong> : ${product.manufacturer} </p> <p> <strong>分类</strong> : ${product.category} </p> <p> <strong>库存可用数量</strong> : ${product.unitsInStock} </p> <h4>${product.unitPrice}美元</h4> <p> <a href="<spring:url value="/listproducts" />" class="btn btn-default"> <span class="glyphicon-hand-left glyphicon"></span> 返回 </a> <a href="#" class="btn btn-warning btn-large"> <span class="glyphicon-shopping-cart glyphicon"> </span> 立即下单 </a> </p> </div> </div> </section> </body> </html>
出现报错的product2.jsp代码如下:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib prefix="spring" uri="http://www.springframework.org/tags"%> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <link rel="stylesheet" href="//netdna.bootstrapcdn.com/bootstrap/3.0.0/css/bootstrap.min.css"> <title>商品</title> </head> <body> <section> <div class="jumbotron"> <div class="container"> <h1>商品</h1> </div> </div> </section> <section class="container"> <div class="row"> <div class="col-md-5"> <!-- 向用户展示图片的位置 --> <img src="<c:url value="/img/${product.productId}.png"></c:url>" alt="image" style = "width:100%"/> <h3>${product.name}</h3> <p>${product.description}</p> <p> <strong>商品编码:</strong> <span class="label label warning">${product.productId} </span> </p> <p> <strong>生产商</strong> : ${product.manufacturer} </p> <p> <strong>分类</strong> : ${product.category} </p> <p> <strong>库存可用数量</strong> : ${product.unitsInStock} </p> <p> <a href=" <spring:url value="/product2?id=${product.productId}" /> " class="btn btn-primary"> <span class="glyphicon-info-sign glyphicon" /> </span> 详情 </a> </p> <a href="<spring:url value="product" />" class="btn btn-default"> <span class="glyphicon-hand-left glyphicon"></span> 返回 </a> </div> </div> </section> </body> </html>
当前访问product2.jsp时收到如下报错:
org.springframework.web.servlet.DispatcherServlet noHandlerFound
WARNING: No mapping for GET /springmvc197/%3Cc:url%20value=
问题原因及解决方法
报错核心原因是JSP无法识别c:前缀的标签,导致<c:url>没有被正常解析,直接作为字符串拼接进了请求路径,%3Cc:url%20value=就是<c:url value=的URL编码结果。
对比正常运行的product.jsp和报错的product2.jsp头部可以发现,product.jsp引入了JSTL核心标签库,而product2.jsp缺少这行引入:
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
只要在product2.jsp头部、spring标签库引入的相邻位置加上上述代码即可解决问题。
另外还有两个可优化的细节:
- product2.jsp的详情按钮
<span>标签多写了一个闭合,多余的</span>可以删除 - 返回按钮的
<spring:url>路径建议加斜杠开头,写成value="/product"避免相对路径出错
内容的提问来源于stack exchange,提问作者tahasozgen
相关产品推荐
相关产品推荐

