【问题标题】:How to delete useless JSP如何删除无用的JSP
【发布时间】:2015-07-31 07:44:02
【问题描述】:

在我正在开发的网站上,我使用了大量的 Ajax 调用来显示信息。

这些 Ajax 调用如下:

function deleteBookingAjax(rowId) {

$.ajax({
    url : "deleteRent.htm", 
    type : "GET",   
    data : {
        "rentId" : rowId
    },
    dataType : 'json',
    cache : false,
    success : function(response) {

        if(response.error) {
            showPopupMessage(response.error, true);
        } 

    },
    statusCode : {
        500 : function() {
            loggingMessage('Error 500');
            reloadBookingTable();
        },
        404 : function() {
            loggingMessage('Error 404');
            reloadBookingTable();
        }

    }
  });
}

为了执行这个调用,我还有如下控制器:

@RequestMapping(value = "/deleteRent.htm")
public String deleteRent(Long rentId, HttpServletRequest request, HttpServletResponse response) {

    if (rentId == null) {
        return null;
    }

    try {

        rentService.deleteRent(rentId);

    } catch (Exception e) {

        LOGGER.error(e);
    }

    response.setStatus(HttpStatus.SUCCESS);

    return ViewNames.BOOKINGS_PAGE;
}

但我的问题是:要执行这个 Ajax 调用,我需要创建一个无用的 JSP 文件:WEB-INF/jsp/deleteRent.jsp

<%@page import="net.****.****.web.controllers.RentControllers"%>
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%@ taglib uri="http://www.springframework.org/tags" prefix="spring"%>

如果我不创建这些文件,Ajax 调用将无法正常工作...

当文件不在 WEB-INF/ 中时 Ajax 调用返回:

GET http://127.0.0.1/deleteRent.htm?rowId=1 404 (Not Found)

日志正在显示:

2015-07-31 10:47:39,084 DEBUG [org.springframework.web.servlet.DispatcherServlet] - Could not complete request
javax.servlet.ServletException: File &quot;/WEB-INF/jsp/deleteRent.jsp&quot; not found 
at org.apache.jasper.servlet.JspServlet.handleMissingResource(JspServlet.java:417)
at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:384)
at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:339)
....

如何在没有这些文件的情况下使其工作(我假设它将在配置中......但具体在哪里以及如何?),因为拥有很多 JSP 文件但只有少数文件有内容时不方便...

编辑

这是我的 context.xml 的内容,如果错误位于那里,我们永远不知道:

<!-- resources exclusions from servlet mapping -->
<mvc:resources mapping="/css/**" location="/css/" />
<mvc:resources mapping="/images/**" location="/images/" />
<mvc:resources mapping="/scripts/**" location="/scripts/" />
<mvc:resources location="/, classpath:/META-INF/web-resources/" mapping="/resources/**" />


<!-- Enables the Spring MVC @Controller programming model -->
<context:component-scan base-package="net.****.****.web" />

<context:annotation-config />

<mvc:annotation-driven />

<bean id="properties"
    class="org.springframework.beans.factory.config.PropertiesFactoryBean">
    <property name="locations">
        <list>
            <value>classpath:/META-INF/messages_en.properties</value>
        </list>
    </property>
</bean>


<bean id="jsonView" class="org.springframework.web.servlet.view.json.MappingJackson2JsonView" />

<!-- Resolves views selected for rendering by @Controllers to .jsp resources in the /WEB-INF/jsp directory -->
<bean class="org.springframework.web.servlet.view.BeanNameViewResolver" />

<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <property name="viewClass" value="org.springframework.web.servlet.view.JstlView" />
    <property name="prefix" value="/WEB-INF/jsp/" />
    <property name="suffix" value=".jsp" />

    <property name="alwaysInclude" value="true" />
    <property name="contentType" value="text/html; charset=UTF-8" />
</bean>

<bean id="annotationMethodHandlerAdapter" class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter" />

提前致谢。 :)

【问题讨论】:

  • jquery 代码不依赖于你的任何 jsp 标签
  • 我知道,我的意思是,如果文件不存在,Ajax 调用将不起作用。 JSP 文件的内容无关紧要(我假设,没有检查但看起来合乎逻辑)。
  • 如果不喜欢有很多 JSP 文件,请尝试使用单个 JSP 处理多个功能。但这可能会导致安全问题,因此功能必须由客户端以某种方式确定。 /functions.jsp?action=delrnt&ID=1
  • 这确实是一个解决方案,但我希望能够删除它们,而不是将它们合并到不同的操作中:/
  • 编辑:添加 DispatcherServlet 日志

标签: java ajax spring jsp jakarta-ee


【解决方案1】:

我不太确定您是否正在寻找它,但您可以将以下内容包含在您的 applicationContext.xml 或 *****-servlet.xml 文件中。

<bean id="viewResolver" class="org.springframework.web.servlet.view.UrlBasedViewResolver">
    <property name="viewClass" value="org.springframework.web.servlet.view.JstlView" />
    <property name="prefix" value="/WEB-INF/jsp/" />
    <property name="suffix" value=".jsp" /> 
</bean>

将此添加到您的 pom.xml 中。现在您可以从您的方法中返回 String。

<!-- Jackson JSON Mapper -->
<dependency>
    <groupId>org.codehaus.jackson</groupId>
    <artifactId>jackson-mapper-asl</artifactId>
    <version>1.9.10</version>
</dependency>

【讨论】:

  • 同样的问题,即使有这个属性,我在编辑我的 context.xml 中添加,也许错误位于那里。
  • 你需要将你的jsp文件保存在WEB-INF/jsp文件夹中。
  • 但是没有意义,这个文件是空的,所有有趣的代码(返回JSON对象的那个)都在Controller中。这个文件毫无意义,我几乎可以肯定有办法删除这个文件......
  • 您访问的是什么网址?并且只是为了测试,您可以从方法输入参数中删除Long rentId 并从请求中取出它。
  • 阅读to perform this Ajax call, I need to create a useless JSP file : WEB-INF/jsp/deleteRent.jsp,你不需要为ajax调用创建jsp文件,你的控制器可以直接将值传回你的jquery函数。
【解决方案2】:

答案很愚蠢 :) 但至少现在已经修复了:

将:void 放入该函数已解决问题。

我删除了空文件并没有:)。

@RequestMapping(value = "/deleteRent.htm")
public void deleteRent(Long rentId, HttpServletRequest request, HttpServletResponse response) {

  if (rentId == null) {
    return null;
  }

  try {

    rentService.deleteRent(rentId);

  } catch (Exception e) {

    LOGGER.error(e);
  }

  response.setStatus(HttpStatus.SUCCESS);
}

【讨论】:

  • 我已经更新了我的答案,你可以试试。它将帮助您将值返回给您的 ajax 调用。
最近更新 更多