java - Spring - 映射多个 url 模式

标签 java spring spring-mvc

几天前我问过一些关于这个的问题,但现在出现了一个新问题。我的网页需要访问这些网址:

/product/* //(this will be an id or anything else)
/shopcart/* //(GET, ADD...)
/*.html

我必须访问不同的 HTML 页面才能获取一些 webapp 信息。在 webapp 上,你可以通过 id 查询一些产品,你可以看到一个包含他所有规范的详细网页。另外,我有一个购物车,您可以在其中添加产品,每次添加产品时,它都会保存在服务器 session 中。

如果我想恢复有关购物车中产品的信息,我可以访问 /shopcart/get 并将所有信息转换为 JSON 格式。为此,我将此配置放入我的 web.xml 中:

<listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>classpath:applicationContext.xml</param-value>
</context-param>

<servlet>
    <servlet-name>dispatcher</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
</servlet>

<servlet-mapping>
    <servlet-name>dispatcher</servlet-name>
    <url-pattern>/product/*</url-pattern>
    <url-pattern>/shopcart/*</url-pattern>
    <url-pattern>*.html</url-pattern>
</servlet-mapping>

问题来了,我可以访问 /product/1 以获取产品 1 的所有规范,但如果我使用 /shopcart,我会得到相同的结果/1。如果我在我的 Controller 中指定 @RequestMapping("product")(例如),我将不得不访问 /product/product/1 而我不希望这样。我该如何解决这个问题?

这些是我的 Controller :

@Controller
public class ProductController {

    @RequestMapping("{id}")
    public ModelAndView get(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, @PathVariable String id) {
        Map<String, Object> model = new HashMap<String, Object>();
        //data recovering
        return new ModelAndView("product", model);
    }
}

@Controller
public class CartController {

    @Autowired
    private JacksonConverter JacksonConverter;

    @RequestMapping(value = "/shopcart/get", method = RequestMethod.GET)
    public void get(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) {
        // data recovering
        httpServletResponse.setContentType("application/json; charset=utf-8");
        httpServletResponse.setStatus(HttpServletResponse.SC_OK);
        httpServletResponse.getWriter().print(json);
    }
}

最佳答案

我得到了这个问题的解决方案。

首先感谢 RC 他在评论中的回答。将我的 web.xml 中的 servlet-mapping 更改为以下内容很容易解决我想用来访问我的 url 的正确方法:

<servlet-mapping>
    <servlet-name>dispatcher</servlet-name>
    <url-pattern>/</url-pattern>
</servlet-mapping>

并像这样向我的 Controller 添加正确的路径:

@Controller
@RequestMapping("product")
public class ProductController {

    @RequestMapping("{id}")
    public ModelAndView get(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, @PathVariable String id) {
        ...
    }

@Controller
@RequestMapping("shopcart")
public class CartController {

    @Autowired
    private JacksonConverter JacksonConverter;

    @RequestMapping(value = "get", method = RequestMethod.GET)
    public void get(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) {
        ...
    }

但这不是您需要的全部。就我而言,我无法加载我的 CSSJS 资源。因此,您需要向 Spring 指定您的资源在哪里,将其添加到您的 servlet 配置中(在我的例子中为 dispatcher-servlet.xml):

<mvc:resources mapping="/resources/**" location="/resources/"/>

/resources url 必须根据您的资源所在的位置进行更改。现在,您只需将其添加到您的 JSP 页面中,您的所有资源都将被加载:

<link rel="stylesheet" type="text/css" href="${pageContext.request.contextPath}/resources/css/main.css">
<script type="text/javascript" src="${pageContext.request.contextPath}/resources/js/main.js"></script>

资源解决方案链接: Spring can't load my css files

提示:如果您要将 CSSJS 资源移动到一个文件夹中,例如 /resources/css/resources/js,不要忘记重新构建您的项目,因为您的网页将无法访问它们。

关于java - Spring - 映射多个 url 模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21942486/

相关文章:

java - JPA manytoone关系删除操作

java - 如何解决我的 Spring 应用程序中的此异常?

java - spring boot - 从过滤器返回 pojo 响应

spring - 如何将表单数据发送到 Controller

spring - 有没有办法 @Autowire 需要构造函数参数的 bean?

java - 如何在 Java Spring 和 Hibernate 的单个事务中管理 2 个 DAO 方法?

java - 类可以作为方法的参数吗?

java - Arrays.sort(带比较器) - 相同或不同的线程?

java - 调整大小时由 LayoutManager 通知 JPanel

java - 从jsp + Spring调用几个方法