当前位置: 首页 > 知识库问答 >
问题:

Spring不解析具有相同URL前缀的JSP和JSON

闻人河
2023-03-14

我的目标:

  1. <代码>http://host:port/myApp/about返回一个名为about的jsp页面。jsp

我的web.xml:

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.4" ...>
<context-param>
    <param-name>log4jConfigLocation</param-name>
    <param-value>classpath:log4j.xml</param-value>
</context-param>
<context-param>
    <param-name>log4jExposeWebAppRoot</param-name>
    <param-value>false</param-value>
</context-param>
<listener>
    <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>
</listener>
<servlet>
    <servlet-name>myApp</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>
            ...
        </param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>

<servlet-mapping>
    <servlet-name>myApp</servlet-name>
    <url-pattern>/*</url-pattern>
</servlet-mapping>

<welcome-file-list>
    <welcome-file>index.html</welcome-file>
</welcome-file-list>
</web-app>

我的servlet.xml(使用Spring 3.0.3. RELEASE):

<beans ...>

<mvc:annotation-driven />
<context:component-scan ... />

<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
    <property name="maxUploadSize" value="15728640" /> <!-- 15 MB -->
    <property name="MaxInMemorySize" value="15728640" /> <!-- 15 MB -->
</bean>

<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <property name="order" value="1" />
    <property name="prefix" value="/WEB-INF/views/" />
    <property name="suffix" value=".jsp" />
</bean>

<bean class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver">
    <property name="order" value="2" />
    <property name="mediaTypes">
        <map>
            <entry key="json" value="application/json" />
            <entry key="xml" value="application/xml" />
        </map>
    </property>
    <property name="defaultContentType" value="application/json" />
    <property name="defaultViews">
        <list>
            <bean class="org.springframework.web.servlet.view.json.MappingJacksonJsonView" />
            <bean class="org.springframework.web.servlet.view.xml.MarshallingView">
                <constructor-arg>
                    <bean class="org.springframework.oxm.xstream.XStreamMarshaller" />
                </constructor-arg>
            </bean>
        </list>
    </property>
    <property name="ignoreAcceptHeader" value="true" />
</bean>
</beans>

我的控制器:

@Controller
@RequestMapping("about")
public class AboutController {

    @RequestMapping(method=GET)
    public String getStats() {
        return "about";
    }

    @RequestMapping(value="log", method=GET)
    public @ResponseBody List<String> getLog() {
        ...
    }
}

在服务器(jetty 6,servlet api 2.5)启动时,我看到:

INFO org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping - Mapped URL path [/about/log] onto handler [AboutController@63843ca4]
INFO org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping - Mapped URL path [/about/log.*] onto handler [AboutController@63843ca4]
INFO org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping - Mapped URL path [/about/log/] onto handler [AboutController@63843ca4]
INFO org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping - Mapped URL path [/about] onto handler [AboutController@63843ca4]
INFO org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping - Mapped URL path [/about.*] onto handler [AboutController@63843ca4]
INFO org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping - Mapped URL path [/about/] onto handler [AboutController@63843ca4]

上述目标的设置结果:

>

  • 产生错误:

    WARN org.springframework.web.servlet.PageNotFound - No mapping found for HTTP request with URI [/myApp/WEB-INF/views/about.jsp] in DispatcherServlet with name 'myApp'  
    

    我检查/尝试过的事情:

    >

  • WEB-INF/view/about.jsp确实存在
  • 我已经在这两个方法的控制器中放置了断点,并且它们都被适当地调用;故障发生在退出我的控制器类后的某个时候
  • 故意将InternalResourceViewResolver的顺序设置为第一。我知道Spring文档建议不要这样做,但是当我尝试将其放在最后时,我得到一个空的{}返回,我认为这是因为ContentNelis atingViewResolver拾取了“about”字符串并以某种方式解释它。我对顺序没有要求,但是ContentNelis atingViewResolver中的设置需要保持原样(除非绝对有必要更改)。
  • 将web.xml中的url模式设置为

    >

  • 按预期工作
  • 产生错误:

    WARN org.springframework.web.servlet.PageNotFound - No mapping found for HTTP request with URI [/myApp/about/log.json] in DispatcherServlet with name 'myApp'
    

    有趣的是,urlhttp://host:port/myApp/about/about/log适用于此url模式

    所以,我有点纠结于要解决什么问题才能实现既定目标。


  • 共有1个答案

    狄令
    2023-03-14

    您是否有使用InternalResourceViewResolver的特定需求?

    要配置jackson插件,我们只需要

     <mvc:annotation-driven />
    

    尝试使用此XML

    <beans ...>
     <context:annotation-config />
    <mvc:annotation-driven />
    <context:component-scan ... />
    
    <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
        <property name="maxUploadSize" value="15728640" /> <!-- 15 MB -->
        <property name="MaxInMemorySize" value="15728640" /> <!-- 15 MB -->
    </bean>
    
    
    <bean id="viewResolver"
          class="org.springframework.web.servlet.view.UrlBasedViewResolver">
        <property name="prefix" value="/WEB-INF/views/"/>
        <property name="suffix" value=".jsp"/>
    </bean>
    </beans>
    
     类似资料:
    • 我使用SpringBoot,有两个非常相似的服务,我想在。 配置大致如下所示: 是否可以创建一个带有注释的类,并在注入点设置前缀? 例如。 然后在服务本身: 不幸的是,我还没有在留档中找到关于这样一个功能的东西...非常感谢您的帮助!

    • 问题内容: 我的应用程序的登录页面有两种状态:,。现在,我想在同一URL上显示这两种状态,但让控制器和模板取决于用户会话(用户是否登录?)。 有没有办法做到这一点? 问题答案: 您可以有一个基本状态来控制要加载的状态,并且可以简单地让声明该基本状态的子级没有url: 现在,在基本状态()的控制器中,您可以检查用户是否已登录,并用于加载适当的状态。 编辑 如所承诺的那样,正在努力工作。

    • 问题内容: 我想解析一个json文件,但它经过这样的事情: 但是大约有三千个这样的对象。我一直在使用Gson解析我的json对象,但是我怎么解析这种文件呢?以及如何检索名称“ CDG”或“ ORY”? 问题答案: 您可以尝试如下操作: 使用gson,您可以按以下方式检索键名: 并使用java- json 可以执行以下操作: 从网址获取json:

    • 问题内容: 我的目录中有大约500个文本文件,文件名中都带有相同的前缀。 文件的后半部分是文件的日期。(例如,) 我想使用Java过程删除这些文件(我可以使用shell脚本,然后在crontab中将其添加为作业,但该应用程序是供外行使用的)。 我可以使用类似的方法删除一个文件 但是我可以删除具有特定前缀的文件(例如:第8个月)吗,我可以使用轻松在shell脚本中执行此操作。 但是在Java中不起作

    • 问题内容: 我想使用JLabel(Icon)来显示来自我网站(http://xxx.xxx.xxx.xxx/java_pic/test.jpg)的图像。我有一个刷新按钮来新建一个新的JLabel和ImageIcon(以获取最新的图像)该程序成功运行…但是当我上载新图像以覆盖旧图像时(http://xxx.xxx。 xxx.xxx/java_pic/test.jpg ),我按了刷新按钮…什么都没发生

    • 有太多关于大致相同主题的问题,但我找不到我想要的。如果我错过了,我很抱歉。 我正在尝试散集具有公共逻辑元素但使用不同标记定义的XML文件: 两个<代码> 我可以这样做: 所需要的只是在和中实现并分别返回或。 然而,在中有一个属性并以某种方式告诉JAXB将这两个字段映射到它似乎更简单。 我是不是想多了?你将如何实现它? (当然,我无法控制输入XML。如果可能的话,我还想避免使用MOXy的解决方案,因