【问题标题】:Spring Boot (MVC) keeping object information to pass it to further URLsSpring Boot (MVC) 保留对象信息以将其传递给进一步的 URL
【发布时间】:2018-04-23 23:29:17
【问题描述】:

我正在尝试做我的应用程序,该应用程序专门用于由医生管理患者数据库,并且在保存有关通过 post 请求方法发送的对象的信息方面存在一些问题。我希望它们在 URL 中被记住。我试图用@SessionAttributes 做点什么,但我认为我不太了解它。

这是我的控制器:

@Controller
@SessionAttributes("loggedInPersonelID")
@RequestMapping
public class PatientManagerController {

@Autowired
private PatientService patientService;

@Autowired
private PersonelService personelService;


private Personel getLoggedInPersonel(String personelID) {
    return personelService.getPersonel(personelID);
}

@GetMapping
public ModelAndView getLoginView() {
    ModelAndView mav = new ModelAndView("login-view");
    mav.addObject("personel", new Personel());
    return mav;
}

方法 post 将登录用户传递到下一个 URL /user={id}(使用 RedirectAttributes)

@PostMapping
    public String loginUser(@ModelAttribute("personel") Personel personel,
                            RedirectAttributes redirectAttrs,
                            Model model) {

        Personel loggedInPersonel = getLoggedInPersonel(personel.getPersonelID());
        model.addAttribute("loggedInPersonelID", loggedInPersonel.getPersonelID());

        if (loggedInPersonel != null) {
            if (loggedInPersonel.getPassword().equals(personel.getPassword())) {

                redirectAttrs.addAttribute("id", loggedInPersonel.getPersonelID());
                return "redirect:/user={id}";
            } else {
                model.addAttribute("errorMessage", "Invalid credentials!");
                return "login-view";
            }
        } else {
            model.addAttribute("errorMessage", "User with given ID does not exist");
            return "login-view";
    }
}

这是我的获取登录用户视图的方法。 URL 在这里有效,因为模型是在以前的 post 方法中传递的。我有类似/user=john-smith-123

@GetMapping("/user={id}")
public ModelAndView getUserMainView(@PathVariable("id") String personelID) {
    ModelAndView mav = new ModelAndView("personel-main-view");
    Personel loggedInPersonel = getLoggedInPersonel(personelID);

    mav.addObject("personelOccupation", loggedInPersonel.getOccupation());
    mav.addObject("personelName", loggedInPersonel.getName());
    mav.addObject("personelSurname", loggedInPersonel.getSurname());
    return mav;
}

但是下一页不再记住用户的 ID。我认为将它传递给与@SessionAttributes("loggedInPersonelID")中确定的名称相同的模型属性将被记住。

@GetMapping("/user={id}/patients")
public ModelAndView getPatientsView(@PathVariable("id") String personelID) {
    ModelAndView mav = new ModelAndView("patients-view");
    Personel loggedInPersonel = getLoggedInPersonel(personelID);
    mav.addObject("loggedInPersonelID", loggedInPersonel.getPersonelID());
    mav.addObject("list", patientService.getPersonelsList(loggedInPersonel));
    return mav;
}

URL 中的结果:user=$%7BloggedInPersonelID%7D/patients 和错误There was an unexpected error (type=Internal Server Error, status=500). No message available

这是personel-main-view 视图中的链接,应该会将我移至所需页面

<a th:href="@{/user=${loggedInPersonelID}/patients}">My patients</a>

那我该怎么做呢?抱歉代码乱七八糟。这件事比看起来更复杂吗?我还缺少什么更深层次的东西吗?

PS。我正在使用百里香

【问题讨论】:

  • 我认为这不重要吗?刚刚编了个图案

标签: spring-mvc session spring-boot


【解决方案1】:

试试这个:

<a th:href="@{/user=__${loggedInPersonelID}__/patients}">My patients</a>

如图所示here

【讨论】:

  • 不起作用,坦率地说,我不知道为什么要这样做。在页面之间跳转时保存对象信息时遇到问题
  • 它应该由于预处理表达式__. 它应该预处理表达式并将例如user=1234 作为字符串传递给@ 表达式,
猜你喜欢
  • 2019-05-31
  • 2023-03-19
  • 1970-01-01
  • 1970-01-01
  • 2021-03-05
  • 1970-01-01
  • 2014-05-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多