このWebサイトのガイドに従って、SpringWebアプリのBeanを適切にスコープしようとしています。
http://richardchesterwood.blogspot.com/2011/03/using-sessions-in-spring-mvc-include.html
私はメソッド3に従おうとしています。これは基本的に、コンポーネントクラスをセッションとしてスコープしたいので、要求に応じてコントローラークラスをスコープする必要があることを意味します。コントローラをJSPページに配置して、使用できるようにします。
ただし、これを実行しようとすると、Webアプリにビルドの問題が発生し、Webページにアクセスしようとすると、503service_unavailableエラーが発生します。
ビルドエラーは次のとおりです。
重大:コンテキストの初期化に失敗しましたorg.springframework.beans.factory.BeanCreationException:「org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping#0」という名前のBeanの作成中にエラーが発生しました:Beanの初期化に失敗しました。ネストされた例外はjava.lang.IllegalStateExceptionです:ハンドラー'currentWeekController'をURLパスにマップできません[/TimeTracking]:ハンドラー'scopedTarget.currentWeekController'が既にマップされています。
関連するクラスとjspページは次のとおりです。他に何か必要な場合は、質問してください。
CurrentWeekControllerコントローラークラス:
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>