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

时间:2012-08-07 17:09:48

标签: java spring jsp spring-mvc

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

这是Spring-annotated 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";
    }

这是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>

这是我的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>

这是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>

这是完整的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);
}

}

最后,这是表单所在的完整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>

3 个答案:

答案 0 :(得分:4)

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

您需要将映射更改为

  

@RequestMapping(value =“TimeTracking”)

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

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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