当我尝试使用提交按钮在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>
答案 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