java 带有@Requestmapping 的 .jsp 页面 POST 表单通过 Spring 不起作用

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/11850834/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-10-31 06:38:50  来源:igfitidea点击:

.jsp page POST form with @Requestmapping through Spring does not work

javaspringjspspring-mvc

提问by CorayThan

When I try to call my form post in a jsp page using a submit button the page seems to be reloading, but nothing that happens in my @Requestmapping method gets called.

当我尝试使用提交按钮在 jsp 页面中调用我的表单帖子时,页面似乎正在重新加载,但我的 @Requestmapping 方法中没有发生任何事情被调用。

This is the Spring-annotated java method:

这是带有 Spring 注释的 java 方法:

 @RequestMapping(value = "/TimeTracking.jsp", method = RequestMethod.POST)
    public String changeTheWeek(HttpServletRequest request) {

      if ("Previous Week".equals(request.getParameter("changeWeek"))) {
          this.subtractOneWeek();
      } if ("Next Week".equals(request.getParameter("changeWeek")))
      {
        this.addOneWeek();  
      }

        return "redirect:TimeTracking.jsp";
    }

Here is the jsp page's form:

这是jsp页面的表单:

<form name="ChangeWeek" method="POST" action="TimeTracking.jsp">
        <span> <input name="changeWeek" type="submit" value="Previous Week"/> Hours for the week of
            <%=currentWeek.firstDayOfThisWeek()%> until <%=currentWeek.lastDayOfThisWeek()%>
            <input name="changeWeek" type="submit" value="Next Week"/>
        </span>
</form>

Here's my spring-servlet.xml file:

这是我的 spring-servlet.xml 文件:

<?xml version="1.0" encoding="windows-1252"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="
   http://www.springframework.org/schema/beans
   http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
   http://www.springframework.org/schema/context
   http://www.springframework.org/schema/context/spring-context-3.0.xsd
   http://www.springframework.org/schema/mvc
   http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd
   http://www.springframework.org/schema/aop
   http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
   http://www.springframework.org/schema/tx
   http://www.springframework.org/schema/tx/spring-tx-3.0.xsd">

<!-- Use @Component annotations for bean definitions -->
<context:component-scan base-package="controllers, daos, map, models, session, testControllers"  scoped-proxy="targetClass" />
<!-- added this because I think it makes annotations work? -->
<context:annotation-config />

<!-- Use @Controller annotations for MVC controller definitions -->
<mvc:annotation-driven />

<bean
    class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor"
    lazy-init="false" />

<!-- Add JPA support -->
<bean id="emf"
    class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean" lazy-init="false" >
    <property name="persistenceUnitName" value="SpaceTime" />
    <property name="jpaDialect" ref="jpaDialect" />
    <property name="jpaVendorAdapter" ref="jpaAdapter" />
    <property name="loadTimeWeaver">
        <bean
            class="org.springframework.instrument.classloading.InstrumentationLoadTimeWeaver" />
    </property>
</bean>
<bean id="jpaDialect" class="org.springframework.orm.jpa.vendor.HibernateJpaDialect"
    lazy-init="false" />
<bean id="jpaAdapter"
    class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"
    lazy-init="true">
    <property name="databasePlatform" value="org.hibernate.dialect.MySQLDialect" />
    <property name="database" value="MYSQL" />
    <property name="showSql" value="false" />
</bean>
<!-- Ref: http://static.springsource.org/spring/docs/2.5.x/reference/metadata.html#metadata-annotations-required -->
<bean
    class="org.springframework.beans.factory.annotation.RequiredAnnotationBeanPostProcessor" />
<bean id="myDataSource"
    class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    <property name="driverClassName" value="com.mysql.jdbc.Driver" />
    <property name="url" value="jdbc:mysql://192.168.0.44:3306/userexample" />
    <property name="username" value="nathan" />
    <property name="password" value="nathan" />
</bean>
<!-- Add Transaction support -->
<bean id="myTxManager" class="org.springframework.orm.jpa.JpaTransactionManager" lazy-init="false" >
    <property name="entityManagerFactory" ref="emf" />  
</bean>

<!-- Use @Transaction annotations for managing transactions -->
<tx:annotation-driven transaction-manager="myTxManager"
    proxy-target-class="false" />
<!-- View resolver -->
<bean
    class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <property name="prefix" value="/WEB-INF/" />
    <!-- <property name="suffix" value=".jsp"/> -->
</bean>
<!-- Use @Transaction annotations for managing transactions -->
<tx:annotation-driven transaction-manager="myTxManager" />

</beans>

Here's the web.xml

这是 web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5">
 <servlet>
<servlet-name>spring</servlet-name>
<servlet-class>
  org.springframework.web.servlet.DispatcherServlet
</servlet-class>
<load-on-startup>2</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>spring</servlet-name>
<url-pattern>*.html</url-pattern>
</servlet-mapping>
<session-config>
<session-timeout>30</session-timeout>
</session-config>
<welcome-file-list>
<welcome-file>jsp-pages/LogIn.jsp</welcome-file>
</welcome-file-list>
</web-app>

Here's the full java class (not just the method)

这是完整的java类(不仅仅是方法)

package controllers;

import javax.servlet.http.HttpServletRequest;

import models.CurrentWeek;
import models.User;

import org.joda.time.MutableDateTime;
import org.joda.time.format.DateTimeFormat;
import org.joda.time.format.DateTimeFormatter;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.servlet.ModelAndView;

/**
 * this is the controller for current week, it lets you change the current week
 * and get values from the current week
 * 
     * @author CorayThan
 * 
 */
@Controller
public class CurrentWeekController {

@Autowired
private User user;

@Autowired
private CurrentWeek currentWeek;

/**
 * @return the user
 */
public User getUser() {
    return user;
}

/**
 * @param user the user to set
 */
public void setUser(User user) {
    this.user = user;
}

/**
 * @return the currentWeek
 */
public CurrentWeek getCurrentWeek() {
    if (currentWeek==null) {
        this.createNewCurrentWeek();
    }
    return currentWeek;
}

/**
 * @param currentWeek the currentWeek to set
 */
public void setCurrentWeek(CurrentWeek currentWeek) {
    this.currentWeek = currentWeek;
}

/**
 * no arg constructor
 */
public CurrentWeekController() {

}

/**
 * this is a post method called when a button is clicked on the time tracking
 * jsp page. It reloads the page with a different week
 * @param pageWeek
 * @param request
 * @return
 */

  @RequestMapping(value = "/TimeTracking.jsp", method = RequestMethod.POST)
    public String changeTheWeek(HttpServletRequest request) {

      if ("Previous Week".equals(request.getParameter("changeWeek"))) {
          this.subtractOneWeek();
      } if ("Next Week".equals(request.getParameter("changeWeek")))
      {
        this.addOneWeek();  
      }

        return "redirect:TimeTracking.jsp";
    }

/**
 * this is the default method to show the time tracking page
 * @return
 */
//  @RequestMapping(value = "/TimeTracking.jsp")
//    public ModelAndView showTimeTracking() {
//        
//        return new ModelAndView("/TimeTracking.jsp", "command", this.getCurrentWeek());
//    }

/**
 * This creates a current week object by accepting a calendar. If that
 * calendar is set to Saturday, it will set all the days in that current
 * week object as calendars otherwise it will set all the days in that week
 * starting with the current day and counting back to Monday (the first day
 * of the week)
 * 
 * @param calendar
 * @return
 */
public CurrentWeek createCurrentWeek(MutableDateTime theCurrentDate) {

    int day = checkForNull(theCurrentDate);

    switch (day) {

    case 7:
        MutableDateTime sunday = (MutableDateTime) theCurrentDate.clone();
        this.getCurrentWeek().setSunday(sunday);
        theCurrentDate.addDays(-1);
        day--;
    case 6:
        MutableDateTime saturday = (MutableDateTime) theCurrentDate.clone();
        this.getCurrentWeek().setSaturday(saturday);
        theCurrentDate.addDays(-1);
        day--;
    case 5:
        MutableDateTime friday = (MutableDateTime) theCurrentDate.clone();
        this.getCurrentWeek().setFriday(friday);
        theCurrentDate.addDays(-1);
        day--;
    case 4:
        MutableDateTime thursday = (MutableDateTime) theCurrentDate.clone();
        this.getCurrentWeek().setThursday(thursday);
        theCurrentDate.addDays(-1);
        day--;
    case 3:
        MutableDateTime wednesday = (MutableDateTime) theCurrentDate
                .clone();
        this.getCurrentWeek().setWednesday(wednesday);
        theCurrentDate.addDays(-1);
        day--;
    case 2:
        MutableDateTime tuesday = (MutableDateTime) theCurrentDate.clone();
        this.getCurrentWeek().setTuesday(tuesday);
        theCurrentDate.addDays(-1);
        day--;
    case 1:
        MutableDateTime monday = (MutableDateTime) theCurrentDate.clone();
        this.getCurrentWeek().setMonday(monday);
        break;
    default:
        this.setCurrentWeek(null);
        break;

    }
    return this.getCurrentWeek();

}

/**
 * @param theCurrentDate
 * @return
 */
private int checkForNull(MutableDateTime theCurrentDate) {
    int day = 0;
    if (theCurrentDate != null) {
        day = theCurrentDate.getDayOfWeek();
    }
    return day;
}

/**
 * makes a new current week
 * 
 * @return
 */

public CurrentWeek createNewCurrentWeek() {
    MutableDateTime dateTime = MutableDateTime.now();
    CurrentWeek currentWeek = new CurrentWeek();
    this.setCurrentWeek(currentWeek);

    return createCurrentWeek(dateTime);
}

/**
 * subtracts one week from a currentweek
 * 
 * 
 * @return
 */
public void subtractOneWeek() {

    MutableDateTime newMonday = (MutableDateTime) this.getCurrentWeek().getMonday().clone();
    newMonday.addDays(-7);

    this.setCurrentWeek(createCurrentWeek(newMonday));


}

/**
 * adds one week to a currentweek
 * 
 * @param currentWeek
 * @return
 */
public void addOneWeek() {

    MutableDateTime newMonday = (MutableDateTime) this.getCurrentWeek().getMonday().clone();
    newMonday.addDays(7);

    this.setCurrentWeek(createCurrentWeek(newMonday));
}

/**
 * TODO: make this method into a method that accepts a current week and
 * checks if you can add a week to it without going entirely into the future
 * 
 * @param currentWeek
 * @return
 */
public CurrentWeek checkIfCurrentWeekIsEntirelyInFuture() {
    return this.getCurrentWeek();

}

/**
 * returns the first day of the week as a date time
 * 
 * @return
 */

public String firstDayOfThisWeek() {

    MutableDateTime firstDay = (MutableDateTime) this.getCurrentWeek().getMonday().clone();
    firstDay.addDays(-1);

    DateTimeFormatter dateFormatter = DateTimeFormat.forPattern("MM/dd/yyyy");

    return dateFormatter.print(firstDay);
}

/**
 * returns the last day of this week as a date time
 * 
 * @return
 */

public String lastDayOfThisWeek() {


    MutableDateTime firstDay = (MutableDateTime) this.getCurrentWeek().getMonday().clone();
    firstDay.addDays(5);

    DateTimeFormatter dateFormatter = DateTimeFormat.forPattern("MM/dd/yyyy");

    return dateFormatter.print(firstDay);
}

}

And finally, here is the full TimeTracking.jsp page that the form is in:

最后,这是表单所在的完整 TimeTracking.jsp 页面:

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<%@taglib uri="http://www.springframework.org/tags/form" prefix="form"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<jsp:useBean id="timeTracking"
class="controllers.TimeTrackingController" scope="request" />
<jsp:useBean id="currentWeek" class="controllers.CurrentWeekController"
scope="request" />
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Time Tracking Page</title>
<script type="text/javascript" src= "../javascriptpages/timeTracking.js"></script>

</head>

<body>

<div>
    <h1>User Time Tracking Page</h1>
</div>
<div id="content">

<form name="ChangeWeek" method="POST" action="TimeTracking.jsp">
        <span> <input name="changeWeek" type="submit" value="Previous Week"/> Hours for the week of
            <%=currentWeek.firstDayOfThisWeek()%> until     <%=currentWeek.lastDayOfThisWeek()%>
            <input name="changeWeek" type="submit" value="Next Week"/>
        </span>
</form>


        <table border="1">
            <tr>
                <th>Sunday</th>
                <th>Monday</th>
                <th>Tuesday</th>
                <th>Wednesday</th>
                <th>Thursday</th>
                <th>Friday</th>
                <th>Saturday</th>
            </tr>
            <tr>
                    <td><%=timeTracking.totalWorkTimeForOneDate(currentWeek.getCurrentWeek().getSunday())%>    </td>
                <td><%=timeTracking.totalWorkTimeForOneDate(currentWeek.getCurrentWeek().getMonday())%></td>
                <td><%=timeTracking.totalWorkTimeForOneDate(currentWeek.getCurrentWeek().getTuesday())%></td>
                <td><%=timeTracking.totalWorkTimeForOneDate(currentWeek.getCurrentWeek().getWednesday())%></td>
                <td><%=timeTracking.totalWorkTimeForOneDate(currentWeek.getCurrentWeek().getThursday())%></td>
                <td><%=timeTracking.totalWorkTimeForOneDate(currentWeek.getCurrentWeek().getFriday())%></td>
                <td><%=timeTracking.totalWorkTimeForOneDate(currentWeek.getCurrentWeek().getSaturday())%></td>
            </tr>
        </table>

        <input type="button" value="<%=timeTracking.displayClockButton()%>"
            onClick="clockInOrOutReloadPage()">

</div>

</body>
</html>

回答by Boris Treukhov

In your web.xml you have mapping for *.html extension, while trying to access page which is mapped as .jsp.

在您的 web.xml 中,您有 *.html 扩展名的映射,同时尝试访问映射为 .jsp 的页面。

You need to change your mapping to

您需要将映射更改为

@RequestMapping(value = "TimeTracking")

@RequestMapping(value = "TimeTracking")

and fix the action of the html form to action ="TimeTracking.html"

并将 html 表单的操作修复为 action ="TimeTracking.html"

Also, if you are new to Spring MVC and want to use its features, please check Spring MVC Showcase demo http://blog.springsource.org/2010/07/22/spring-mvc-3-showcase/

另外,如果您是 Spring MVC 的新手并想使用其功能,请查看 Spring MVC Showcase 演示http://blog.springsource.org/2010/07/22/spring-mvc-3-showcase/

回答by user991802

your url pattern is *.html. So change your action to TimeTracking.html. And change your request mapping to /TimeTracking.html

您的网址格式是 *.html。因此,将您的操作更改为TimeTracking.html。并将您的请求映射更改为/TimeTracking.html

回答by kartheek

Either change the web.xml url-pattern of spring servlet to * or change the action name to TimeTracking.html and also requestmapping's value attribute to /TimeTracking.html. From the jsp page what I understand is we are using input type as button instead of submit and there is an event on the button also, try to change the input type to submit with the action name and requestmapping' value attribute changed to TimeTracking.html.

将 spring servlet 的 web.xml url-pattern 更改为 * 或将操作名称更改为 TimeTracking.html,并将 requestmapping 的 value 属性更改为 /TimeTracking.html。从jsp页面我了解到我们使用输入类型作为按钮而不是提交并且按钮上也有一个事件,尝试将输入类型更改为提交,并将操作名称和requestmapping'值属性更改为TimeTracking.html .