我正在尝试按照此网站上的指南为 Spring Web 应用程序正确确定我的 beans 的范围:
http://richardchesterwood.blogspot.com/2011/03/using-sessions-in-spring-mvc-including.html
我正在尝试遵循方法 3,这基本上意味着我想将我的组件类的范围限定为 session ,因此我必须根据要求限定我的 Controller 类的范围。我已将 Controller 放入我的 JSP 页面中以便使用。
但是,当我尝试执行此操作时,我的 Web 应用程序存在构建问题,当我尝试转到该网页时,它给我一个 503 service_unavailable 错误。
构建错误是:
SEVERE: Context initialization failed org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping#0': Initialization of bean failed; nested exception is java.lang.IllegalStateException: Cannot map handler 'currentWeekController' to URL path [/TimeTracking]: There is already handler 'scopedTarget.currentWeekController' mapped.
这里是相关类和jsp页面。如果您需要其他任何东西,请尽管提出!
CurrentWeekController Controller 类:
package controllers;
import javax.servlet.http.HttpServletRequest;
import models.CurrentWeek;
import models.ModelMap;
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.context.annotation.Scope;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
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
@Scope("Request")
public class CurrentWeekController {
private static final int MONDAY = 1;
private static final int TUESDAY = 2;
private static final int WEDNESDAY = 3;
private static final int THURSDAY = 4;
private static final int FRIDAY = 5;
private static final int SATURDAY = 6;
private static final int SUNDAY = 7;
@Autowired
private User user;
@Autowired
private CurrentWeek currentWeek;
@Autowired
private ModelMap hashmap;
/**
* @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 checks to make sure the week isn't null and its
* monday isn't null and fixes them if they are
*/
public CurrentWeek getCurrentWeek() {
if (currentWeek == null) {
this.createNewCurrentWeek();
}
if (currentWeek.getMonday() == null) {
this.createCurrentWeek(MutableDateTime.now());
}
return currentWeek;
}
/**
* @param currentWeek
* the currentWeek to set
*/
public void setCurrentWeek(CurrentWeek currentWeek) {
this.currentWeek = currentWeek;
}
/**
* @return the hashmap
*/
public ModelMap getHashmap() {
return hashmap;
}
/**
* @param hashmap
* the hashmap to set
*/
public void setHashmap(ModelMap hashmap) {
this.hashmap = hashmap;
}
/**
* 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")
public ModelAndView changeTheWeek(HttpServletRequest request) {
String whichWayWeek = request.getParameter("changeWeek");
if ("Previous Week".equals(whichWayWeek)) {
this.subtractOneWeek();
}
if ("Next Week".equals(whichWayWeek)) {
this.addOneWeek();
}
return new ModelAndView("redirect:/jsp-pages/TimeTracking.jsp",
hashmap.makeHashMap());
}
/**
* This creates a current week object by setting that week's monday to the
* proper monday for that week using whatever date you give it
*
*
* @param calendar
* @return
*/
public CurrentWeek createCurrentWeek(MutableDateTime theCurrentDate) {
int day = checkForNull(theCurrentDate);
switch (day) {
case SUNDAY:
theCurrentDate.addDays(-6);
currentWeek.setMonday(theCurrentDate);
break;
case SATURDAY:
theCurrentDate.addDays(-5);
currentWeek.setMonday(theCurrentDate);
break;
case FRIDAY:
theCurrentDate.addDays(-4);
currentWeek.setMonday(theCurrentDate);
break;
case THURSDAY:
theCurrentDate.addDays(-3);
currentWeek.setMonday(theCurrentDate);
break;
case WEDNESDAY:
theCurrentDate.addDays(-2);
currentWeek.setMonday(theCurrentDate);
break;
case TUESDAY:
theCurrentDate.addDays(-1);
currentWeek.setMonday(theCurrentDate);
break;
case MONDAY:
currentWeek.setMonday(theCurrentDate);
break;
default:
this.setCurrentWeek(null);
break;
}
return this.getCurrentWeek();
}
/**
* @param theCurrentDate
* @return
* makes sure the current date isn't null, and returns an int equal to
* the day of the week it is in joda time
*/
private int checkForNull(MutableDateTime theCurrentDate) {
int day = 0;
if (theCurrentDate != null) {
day = theCurrentDate.getDayOfWeek();
}
return day;
}
/**
* makes a new current week set to the real 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 formatted date time
*
* @return
*/
public String firstDayOfThisWeek() {
MutableDateTime firstDay = this.getCurrentWeek().getSunday();
DateTimeFormatter dateFormatter = DateTimeFormat
.forPattern("MM/dd/yyyy");
return dateFormatter.print(firstDay);
}
/**
* returns the last day of this week as a formatted date time
*
* @return
*/
public String lastDayOfThisWeek() {
MutableDateTime lastDay = this.getCurrentWeek().getSaturday();
DateTimeFormatter dateFormatter = DateTimeFormat
.forPattern("MM/dd/yyyy");
return dateFormatter.print(lastDay);
}
}
这是 CurrentWeek 组件类。
package models;
import org.joda.time.MutableDateTime;
import org.springframework.stereotype.Component;
/**
* this is a class that holds the current week for views
*
* @author CorayThan
*
*/
@Component
// @Scope ("Session")
public class CurrentWeek {
private MutableDateTime monday;
/**
* default constructor
*/
public CurrentWeek() {
}
/**
* @return a MutableDateTime which is of the correct date for this specific
* day
*/
public MutableDateTime getSunday() {
MutableDateTime sunday = (MutableDateTime) monday.clone();
sunday.addDays(-1);
return sunday;
}
/**
* @return a MutableDateTime which is of the correct date for this specific
* day
*/
public MutableDateTime getMonday() {
return monday;
}
/**
* @param saturdayTime
* pass a MutableDateTime to set this date of the CurrentWeek
* object to the correct date for that week
*/
public void setMonday(MutableDateTime saturdayTime) {
this.monday = saturdayTime;
}
/**
* @return a MutableDateTime which is of the correct date for this specific
* day
*/
public MutableDateTime getTuesday() {
MutableDateTime tuesday = (MutableDateTime) monday.clone();
tuesday.addDays(1);
return tuesday;
}
/**
* @return a MutableDateTime which is of the correct date for this specific
* day
*/
public MutableDateTime getWednesday() {
MutableDateTime wednesday = (MutableDateTime) monday.clone();
wednesday.addDays(2);
return wednesday;
}
/**
* @return a MutableDateTime which is of the correct date for this specific
* day
*/
public MutableDateTime getThursday() {
MutableDateTime thursday = (MutableDateTime) monday.clone();
thursday.addDays(3);
return thursday;
}
/**
* @return a MutableDateTime which is of the correct date for this specific
* day
*/
public MutableDateTime getFriday() {
MutableDateTime friday = (MutableDateTime) monday.clone();
friday.addDays(4);
return friday;
}
/**
* @return a MutableDateTime which is of the correct date for this specific
* day
*/
public MutableDateTime getSaturday() {
MutableDateTime saturday = (MutableDateTime) monday.clone();
saturday.addDays(5);
return saturday;
}
}
最后是引用 CurrentWeekController 的 jsp 文件:
<%@page contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<%@page import="daos.*"%>
<%@page import="controllers.*"%>
<%@page import="models.*"%>
<jsp:useBean id="userDao" class="daos.UserDao" scope="request" />
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<jsp:useBean id="timeTrackingControl"
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>
<link rel="stylesheet" type="text/css" href="csspages/global.css" />
<style type="text/css"></style>
</head>
<body>
<div>
<h1>User Time Tracking Page</h1>
</div>
<div id="content">
<form method="POST" action="../TimeTracking.html">
<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><%=timeTrackingControl.totalWorkTimeForOneDate(currentWeek.getCurrentWeek().getSunday())%></td>
<td><%=timeTrackingControl.totalWorkTimeForOneDate(currentWeek.getCurrentWeek().getMonday())%></td>
<td><%=timeTrackingControl.totalWorkTimeForOneDate(currentWeek.getCurrentWeek().getTuesday())%></td>
<td><%=timeTrackingControl.totalWorkTimeForOneDate(currentWeek.getCurrentWeek().getWednesday())%></td>
<td><%=timeTrackingControl.totalWorkTimeForOneDate(currentWeek.getCurrentWeek().getThursday())%></td>
<td><%=timeTrackingControl.totalWorkTimeForOneDate(currentWeek.getCurrentWeek().getFriday())%></td>
<td><%=timeTrackingControl.totalWorkTimeForOneDate(currentWeek.getCurrentWeek().getSaturday())%></td>
</tr>
</table>
<input type="button" value="<%=timeTrackingControl.displayClockButton()%>"
onClick="clockInOrOutReloadPage()">
</div>
</body>
</html>
最佳答案
Controller 在 Spring MVC 中应该是应用程序范围的(你不需要显式地定义它们的范围,因为这是默认的)。
任何请求级别的数据都应该使用模型属性来完成:
@ModelAttribute("foo")
public Foo createFoo(@RequestParam("bar") int bar) {
return new Foo(bar);
}
@RequestMapping(...)
public ModelAndView baz(HttpServletRequest req, HttpServletResponse response,
@ModelAttribute("foo") Foo foo) {
...
}
Spring 将自动创建“Foo”实例(通过您的“createFoo”)方法并将其放入请求范围内。然后,通过在映射方法中注释方法参数,它会自动从请求范围中提取该参数并将其传递给您的方法。
如果您希望模型属性存储在 session 范围内,请将此注释添加到 Controller 类:
@SessionAttributes({"foo"})
这意味着您的 Controller 本身不应该有任何状态,只有模型属性(无论是在请求范围还是 session 范围),并且应该将该状态注入(inject)到映射的方法调用中。
关于java - 当组件被限定为 session 时,无法将 Spring Controller 限定为请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11869057/