【问题标题】:How do I add multiple Spring MVC controllers to my maven project如何将多个 Spring MVC 控制器添加到我的 Maven 项目
【发布时间】:2016-02-10 19:05:15
【问题描述】:

我需要向我的 Spring MVC 项目中添加多个控制器,该项目现在只有一个。我当前的项目在 web.xml 中只有一个 SpringDispatcher,它映射了 / 到控制器的“/” @RequestMapping(值 = "/") 启动控制器。因为一切都在一个 web.xml 中,并且没有其他 xml 文件可以进行任何调度程序映射,所以我是否不能只添加一个新的 / 与 web.xml 不同的控制器模式?下面是 web.xml 和一个工作控制器。

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee       http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
<display-name>SpringMvcJdbcTemplate</display-name>
<context-param>
    <param-name>contextClass</param-name>
    <param-value>
        org.springframework.web.context.support.AnnotationConfigWebApplicationContext
    </param-value>
</context-param>
<listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

<servlet>
    <servlet-name>SpringDispatcher</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
        <param-name>contextClass</param-name>
        <param-value>
            org.springframework.web.context.support.AnnotationConfigWebApplicationContext
        </param-value>
    </init-param>
    <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>net.codejava.spring</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
    <servlet-name>SpringDispatcher</servlet-name>
    <url-pattern>/</url-pattern>
</servlet-mapping>

<session-config>
    <session-timeout>30</session-timeout>
</session-config>
</web-app>

HomeController.java

package net.codejava.spring.controller;

import java.io.IOException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;

import net.codejava.spring.dao.ContactDAO;
import net.codejava.spring.dao.ContactDAODS;
import net.codejava.spring.model.Contact;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.servlet.ModelAndView;

/**
 * This controller routes accesses to the application to the appropriate
 * hanlder methods. 
 * @author www.codejava.net
 *
 */
@Controller
public class HomeController {

@Autowired
private ContactDAO contactDAO;

@Autowired
private ContactDAODS contactDAODS;

@RequestMapping(value = "/")
public ModelAndView login() {

    Contact contact = new Contact();
    ModelAndView model = new ModelAndView("login");
    model.addObject("contact", contact);

    return model;
}

@RequestMapping(value = "/loginContact", method = RequestMethod.POST)
public ModelAndView loginContact(@ModelAttribute Contact loginContact) {

    ModelAndView model;

    Contact contact = contactDAO.login(loginContact);

    if(contact != null)
    {
        model = new ModelAndView("menu");

        return model;

    }
    else
    {
        Map<String, String> message = new HashMap<String,   String>();
        message.put("message", "Login password error");
        //Message message = new Message();
        //message.MessageText = "Login Error";
        model = new ModelAndView("loginError");
        model.addObject("message", message);
        return model;

    }
}

@RequestMapping(value = "/menuContact", method = RequestMethod.GET)
public ModelAndView menu(ModelAndView model){
    model.setViewName("menu");

    return model;
}

@RequestMapping(value = "/listContact", method = RequestMethod.GET)
public ModelAndView listContact(ModelAndView model) throws IOException{
    List<Contact> listContact = contactDAO.list();
    model.addObject("listContact", listContact);
    model.setViewName("home");

    return model;
}

@RequestMapping(value = "/newContact", method = RequestMethod.GET)
public ModelAndView newContact(ModelAndView model) {
    Contact newContact = new Contact();
    model.addObject("contact", newContact);
    model.setViewName("ContactForm");
    return model;
}

@RequestMapping(value = "/saveContact", method = RequestMethod.POST)
public ModelAndView saveContact(@ModelAttribute Contact contact) {
    contactDAO.saveOrUpdate(contact);       
    return new ModelAndView("redirect:/");
}

@RequestMapping(value = "/deleteContact", method = RequestMethod.GET)
public ModelAndView deleteContact(HttpServletRequest request) {
    int contactId = Integer.parseInt(request.getParameter("id"));
    contactDAO.delete(contactId);
    return new ModelAndView("redirect:/");
}

@RequestMapping(value = "/editContact", method = RequestMethod.GET)
public ModelAndView editContact(HttpServletRequest request) {
    int contactId = Integer.parseInt(request.getParameter("id"));
    Contact contact = contactDAO.get(contactId);
    ModelAndView model = new ModelAndView("ContactForm");
    model.addObject("contact", contact);

    return model;
}
@RequestMapping(value="/showContact")
public ModelAndView getContact(ModelAndView model) throws IOException{

    Contact contact = contactDAODS.get((Integer)25);
    model.addObject("contact", contact);
    model.setViewName("ContactSP");

    return model;
}
}

【问题讨论】:

    标签: spring-mvc


    【解决方案1】:

    首先,这个映射应该只适用于应用程序根。如果您想要应用程序根目录下的任何路径,请使用 /*

    现在,在您的情况下,只有当您打开浏览器以指向 Web 应用程序根目录而不指定任何我可能猜到的路径不是您想要的路径时,才会调用 spring 调度程序。因此,使用 /* 将所有请求转发到 spring 调度程序并在控制器中使用任何请求映射

    【讨论】:

    • 我不确定我是否理解。如果我有多个控制器,如何让一个控制器调用另一个控制器中的请求?另外,如果有多个控制器,如何指示启动控制器和启动请求?
    • 如果您的应用程序上下文名称是“Holdorf”,那么通过使用 URL 模式“/”,只有当您键入“http(s)://domain_name/Holdorf”时,spring 调度程序才会接收请求/”,但如果您输入“http(s)://domain_name/Holdorf/XXX”,spring 调度程序将无法控制。所以你应该使用“/*”通过spring调度器转发所有请求。现在,您可以拥有任意数量的具有不同特定映射的控制器。但是你不能有两个不同的控制器具有相同的映射
    • 好的。我开始明白了,但不是全部。我是否仍然只有一个 /* 像在 web.xml 中那样,在 Holdorf 控制器中只有一个 @requestmapping(value = "/") 将在启动时自动调用.然后,我将其余的控制器称为“http(s)://domain_name/Holdorf2/getperson,如果两个控制器在包文件夹中,那么 domain_name 将是相同的吗?
    • 完全正确..但应用程序上下文“/Holderf/”不能更改,因为它在整个 Web 应用程序中都是唯一的。对于您请求的所有映射,域名和应用程序上下文都是固定的。当您的控制器中的所有请求映射注释以“/”开头时,您可以在脑海中替换这个“/”,就好像您写了“http(s)://domain_name/Holdorf/”一样。因此,在您的控制器中,如果您编写了诸如“/admin”之类的映射,则 Web 容器将其理解为“http(s)://domain_name/Holdorf/admin”,并将该请求转发到使用此映射注释的方法。希望这能澄清事情
    • 那么你是说我需要为每个控制器一个单独的包吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-09-14
    • 2016-09-13
    • 2012-11-09
    • 2021-09-09
    • 2021-04-01
    • 1970-01-01
    • 2017-09-29
    相关资源
    最近更新 更多