java - 当组件被限定为 session 时,无法将 Spring Controller 限定为请求

标签 java spring jsp spring-mvc

我正在尝试按照此网站上的指南为 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/

相关文章:

java - 用 SAX 解析 XML |如何处理特殊字符?

java - 如何从 TextField 标签更新 struts 2 列表

Spring 网络套接字 : How intercept a message sent by SimpMessagingTemplate through any either convertAndSend or convertAndSendToUser methods?

java - Spring Security 和 Web 服务 session

javascript - 无需按钮即可动态更改JSP页面内容

java - 重定向过滤器不会加载样式

java - 如何在 REST 响应后删除文件

java - 连接多台计算机 Java UDP

java - Callable<T> call() + 输入参数 + Spring

jsp - session 获取 bool 值的属性