【问题标题】:Ajax call to Spring MVC controller redirects page instead of returning value对 Spring MVC 控制器的 Ajax 调用重定向页面而不是返回值
【发布时间】:2015-05-21 20:45:27
【问题描述】:

我有点困惑。我正在编写一个 MVC 应用程序并有一个像这样的简单控制器:

@Controller
public class ProfileController {

final String DEFAULT_MALE_AVATAR = "../resources/graphics/avatarMan.PNG";
final String DEAULT_FEMALE_AVATAR = "../resources/graphics/avatarWoman.PNG";

@Autowired
UserService userService;

@RequestMapping(value = "/profile", method = RequestMethod.GET)
public String index() {

    return "user/profile";
}

@RequestMapping(value = "profile/getavatar", method = RequestMethod.GET)
public @ResponseBody String getLoggedUserAvatar() {

    String userMail = SecurityContextHolder.getContext()
            .getAuthentication().getName();

    User loggedUser;

    if (userMail != null) {
        loggedUser = userService.findUserByEmail(userMail);
        return loggedUser.getAvatar();
    } else {
        return DEFAULT_MALE_AVATAR;
    }
}

在进入 /profile 部分时,我的 body html 标记中还有一个名为“onload”的简单 js 文件。

function init() {

var url = "profile/getavatar";

$.ajax({
    url : url
}).then(function(data) {
    avatarLink = data;
    loadAvatar(avatarLink);
});

function loadAvatar(avatarLink){
    $("#userAvatar").attr("src", avatarLink);
}

}

由于某些奇怪的原因,我被重定向到“profile/getavatar”,并且该页面包含带有 getLoggedUserAvatar() 返回值的文本。有趣的是,我还为其他部分添加了一些其他控制器,它们具有几乎相同的 js 文件和控制器——它们的工作方式非常棒。

我错过了什么?

【问题讨论】:

  • 如果有帮助请告诉我?

标签: java ajax spring model-view-controller controller


【解决方案1】:

如果您使用的是 spring 4,请确保您的依赖库中有 Jakson jar。框架将自动将内容协商器提取为 JSON,并在后台查找 Jakson jar 以将 JSON 传输到服务器并从服务器获取 JSON 数据

使用 JAXB jars ,以防您需要将 XML 作为内容协商器处理。

【讨论】:

    【解决方案2】:

    我希望当您直接点击 URL 时,您会得到预期的响应。如果这没有发生,那么还有其他问题。如果您在浏览器中直接点击 url 时得到正确的响应,那么在进行 ajax 调用时尝试执行以下操作。它传递期望从服务器返回的内容类型。

    function init() {
    
    var url = "profile/getavatar";
    
    $.ajax({
        url : url,
        dataType: "json"
    }).then(function(data) {
        avatarLink = data;
        loadAvatar(avatarLink);
    });
    
    function loadAvatar(avatarLink){
        $("#userAvatar").attr("src", avatarLink);
    }
    
    }
    

    【讨论】:

    • 当我直接点击 URL 时,我得到了预期的响应。当我添加 dataType: json 时,控制台会尖叫“未定义 json”。有什么想法吗?
    • 我编辑了代码以将其括在引号中,因此 js 不会将其视为变量。
    • 抱歉,我几天没上网了。添加“json”的结果与没有它相同 - 页面仍然重定向到 localhost:8080/MyPage/profile/getavatar,头像的 url 作为页面的唯一内容。
    • 你能发布如何调用 init() 方法吗?
    • 只需简单地使用 (...) “initMap()”正确加载。但我设法以另一种方式做到了(我正在使用 ThyMeLeaf)——只需在我的“userAvatar”img 中调用 th:src="${@profileController.getLoggedUserAvatar()}"。
    猜你喜欢
    • 1970-01-01
    • 2023-03-16
    • 1970-01-01
    • 2016-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多