1

この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>
4

3 に答える 3

4

コントローラーは、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は(「createFoo」を介して)「Foo」インスタンスを自動的に作成し、それをリクエストスコープに配置します。次に、マップされたメソッドのメソッドパラメータにアノテーションを付けることで、リクエストスコープから自動的にプルし、メソッドに渡します。

モデル属性をセッションスコープに格納する場合は、次のアノテーションをコントローラークラスに追加します。

@SessionAttributes({"foo"})

つまり、コントローラー自体に状態を持たせず、モデル属性(要求またはセッションスコープに関係なく)のみに状態を持たせ、マップされたメソッド呼び出しにその状態を注入する必要があります。

于 2012-08-08T17:00:02.313 に答える
0

このリンクを確認してください https://jira.springsource.org/browse/SPR-5697 同じrequestmappingの属性値がで使用されている場合は、コントローラーレベルでrequestmapping属性を追加し、メソッドレベルでrequestmapping属性を追加することを常にお勧めします。別のコントローラーでこのエラーが表示される場合があります。これを回避するには、コントローラーレベルでrequestmapping属性を追加します。

@Controller
@SessionAttributes("command"(
@RequestMapping(value="CurrentWeek")

@RequestMapping(value="TimeTracking.html" method="RequesstMethod.POST)
public ModelAndView processForm(....){
}
于 2012-08-09T04:09:06.207 に答える
0

コントローラのデフォルトのスコープはシングルトンです。変更する正当な理由がない限り、変更しないでください。シングルトンは、コンポーネントスコープのセッションで正常に動作します

于 2014-02-26T23:16:19.677 に答える