【问题标题】:Cannot resolve controller URL from JSP无法从 JSP 解析控制器 URL
【发布时间】:2018-11-16 00:49:25
【问题描述】:

在我的 JSP 表单中,环境可以识别控制器的存在(它为我提供了路径的自动完成功能),但我无法访问我的控制器。

可能是因为配置没有设置好,但是这里所有的解决方案都是用xml配置的。

这是我的表格:

<h2>Register</h2>
<!-- Contact form -->
<form class="register-form" action="/user/registerUser" method="post">
    <div class="form-group">
        <input class="form-control" name="username" placeholder="Username">
    </div>
    <div class="form-group">
        <input class="form-control" name="name" placeholder="Name">
    </div>
    <div class="form-group">
        <input class="form-control" name="lastName" placeholder="Last name">
    </div>
    <div class="form-group">
        <input class="form-control" name="email" placeholder="Email">
    </div>
    <div class="form-group">
        <input class="form-control" name="phone" placeholder="Phone number">
    </div>
    <div class="form-group">
        <input class="form-control" name="password" placeholder="Password" type="password">
    </div>
    <div class="form-group">
        <input class="form-control" name="rePassword" placeholder="Re-password" type="password">
    </div>
    <input type="submit" value="Register" class="button-transparent submit-button">
</form>

控制器:

package app.controller;

import app.model.User;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

import javax.servlet.http.HttpServletRequest;

@Controller
@RequestMapping(value = "/user")
public class UserController {

    @RequestMapping(value = "registerUser", method = RequestMethod.POST)
    public User registerUser(Model m, HttpServletRequest request) {
        System.out.println("HERE");
        return null;
    }
}

和我的配置类:

package app.config;

import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;

public class AppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {
    protected Class<?>[] getRootConfigClasses() {
        return new Class[0];
    }

    protected Class<?>[] getServletConfigClasses() {
        return new Class[]{WebConfig.class};
    }

    protected String[] getServletMappings() {
        String[] init = {"/"};
        return init;
    }
}

package app.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.ViewResolver;
import org.springframework.web.servlet.config.annotation.DefaultServletHandlerConfigurer;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
import org.springframework.web.servlet.view.InternalResourceViewResolver;

@Configuration
@EnableWebMvc
@ComponentScan("app")
public class WebConfig extends WebMvcConfigurerAdapter {
    @Bean
    public ViewResolver viewResolver() {
        InternalResourceViewResolver resolver = new InternalResourceViewResolver();
        resolver.setPrefix("/");
        resolver.setSuffix(".jsp");
        resolver.setExposeContextBeansAsAttributes(true);
        return resolver;
    }

    @Override
    public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
        configurer.enable();
    }
}

错误是404,因为它无法识别控制器。

【问题讨论】:

  • 在提交表单之前浏览器中的 url 是什么?
  • 在控制器中将"registerUser" 替换为"/registerUser""
  • 提交前的网址是localhost:8080/index.jsp?register,之后是localhost:8080/user/registerUser(但未找到)@JonathanLaliberte
  • @Afridi 它具有相同的行为
  • 你为什么在registerUser(...)中返回null??尝试返回 jsp 页面的名称,或者将 @ResponseBody 添加到该方法

标签: java spring jsp model-view-controller requestdispatcher


【解决方案1】:

首先引起我注意的是您的 RequestMapping 应该使用value“/registerUser”并返回一些页面,而不仅仅是null。所以我在 cmets 中看到这对你不起作用。
您的配置似乎没问题,但我注意到您在配置文件中使用了getServletConfigClasses()。在我的项目中,我必须使用getRootConfigClasses(),因为如果它不是根配置,我会遇到一些问题。所以,也许这也是你的问题:

public class AppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {
    protected Class<?>[] getRootConfigClasses() {
        return new Class[]{WebConfig.class};
    }

    protected Class<?>[] getServletConfigClasses() {
        return new Class[0];
    }

    protected String[] getServletMappings() {
        String[] init = {"/"};
        return init;
    }
}

【讨论】:

  • 是的,我虽然 / 不是必需的,因为当我没有将它放在方法的注释中时它曾经对我有用,但现在它就在那里。我现在也更改为不返回 null (尽管我认为这不是问题,因为它甚至没有到达方法 aka servlet),现在我已经尝试在 AppInitializer 中进行修改,但它仍然不起作用。我想这一定是关于 servlet 调度程序配置的一些小而愚蠢的事情,但我就是看不到它。
【解决方案2】:

代替 action="/user/registerUser"
try action="${pageContext.request.contextPath}/user/registerUser"
让我知道您的 url 扩展名,例如 .jsp 或 .html 或 .do
例如:action="${pageContext.request.contextPath}/user/registerUser.do"

【讨论】:

  • 我已经尝试过使用 ${pageContext.request.contextPath},它没有改变。该 url 没有扩展名,因为我试图调用一个控制器,该控制器应该通过 RequestMapping 提供的路径访问
  • localhost:8080/index.jsp?register 或 localhost:8080/user/registerUser 您的 url 中没有任何项目名称吗???你能检查一下你的控制台吗?你正在返回null。如果您默认返回空或 null 或不返回任何内容,控制器 / viewResolver 可以将 url 视为页面名称。这意味着必须是一个名为 user 的模块/文件夹,并且在该模块中您必须编写一个 jsp 页面编写 registerUser.jsp。一旦尝试这个,我希望这对你有用
猜你喜欢
  • 2015-04-16
  • 2015-03-06
  • 2010-12-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多