我正在使用Spring MVC,Hibernate和Maven开发中型项目。
我的应用程序有一个登录页面,该页面对用户进行身份验证,然后路由到带有菜单的主页面。从菜单中,用户可以转到多个菜单选项。申请分为多个模块 - 员工,工资单,缺勤管理等。
在这个平台上相当新,几乎没有问题。
控制器:我应该为整个应用程序使用单个控制器还是使用多个控制器?
如果我应该使用多个 - 它应该是一个用于登录模块的控制器,还有一个用于每个模块,如员工,工资单等?如何让他们互相交谈并通过控制?
使用@RequestMapping标记的方法的返回值应该是多少?如果我只是将返回值作为'return“Employee”'并且我的视图中有一个Employee.jsp,但Employee相关的东西在EmployeeController中,我如何确保我的代码仍然卡在前一个控制器中(例如LoginController)?
我是否需要创建一个主控制器来管理所有这些控制器?
为了在所有页面中保留用户凭据,我将不得不在Login模块中使用会话对象?或者Spring MVC会默认处理它吗?
我发现很少有相关页面。它们很好,但它们解释了非常简单的场景,对我的实际问题没有用。
感谢您对上述问题的帮助。 谢谢!
答案 0 :(得分:0)
回答这个问题的最简单方法是像对待你编写的任何其他代码一样对待控制器。当我们设计课程时,我们这样做是为了坚持:
创建一个接受多个URI端点的控制器通常是可以接受的,这些端点操纵CRUD操作的特定模型,因为这些端点通常接受相同或几乎相同类型的输入。但是为我创建一个不同模型或整个应用程序的控制器违反了上述两点;但是,您有权获得您的意见:)。
要了解控制器通信,您需要了解HTTP在一般意义上的工作原理。 Web应用程序只不过是设计请求 - 响应系统的一种奇特方式。您告诉浏览器转到特定URL并将该请求发送到服务器。服务器解释您的请求,可能操纵本地服务器端状态,查询数据存储(如果适用),最后回复响应。这种反应本质上可以是静态的或动态的。动态响应可以转发到视图技术,以呈现您收到的最终内容。这些视图技术也可以是服务器端,如JSP / JSF或客户端,如Angular。
Spring MVC控制器通过视图编排导航与每个控制器交谈。当您在网页上放置按钮,表单或链接时,表示从该页面转换到另一个页面的导航路径。在像Spring MVC这样的基于操作的框架中,这通常意味着您通过将请求发送到另一个解析请求的控制器(可能是某个操作)转移到该新页面,最后将状态传递给视图。
不需要主控制器,而是需要了解您正在处理的控制器类型。在Web 2.0革命和AJAX之前,我们只有一种类型的控制器,用于处理用户从一个视图转换到另一个视图。今天,随着AJAX和动态内容成为主流,您通常会拥有另一种类型的控制器,其唯一目的是成为数据提供者。它不一定意味着从一个视图转换到另一个视图,就像它根据某些输入呈现部分页面动态内容一样。
举个例子
@Controller
public class EmployeeController {
@RequestMapping("/employee/view")
public String viewEmployee(@RequestParam("id") Integer id, Model model) {
// lookup the employee by the passed "?id=123" 123 value
final Employee employee = employeeService.getEmployee( id );
// set the employee in the model so I can render it in JSP
model.addAttribute( "employee", employee );
// return the name of what view to display
return "view";
}
}
此处显示的此代码不会卡在“先前”控制器中,因为用户需要提交表单或单击链接或按钮向服务器提交请求,如/employee/view?id=123
,以便控制器做它的工作。
最后,是的,需要一个HttpSession
对象来跟踪多个请求的状态。 HttpRequest
是一个短暂的对象,在HttpSession
的整个生命周期中,由单个用户执行数十到数百个对象。
在Spring-world中,您经常配置Spring Security来处理身份验证。在这种情况下,该库将维护SESSIONID
和用户身份验证之间的关系,以便在每个HttpRequest
上,它知道用户是否已经过身份验证,如果没有,则将其重定向到登录或允许其请求调用控制器(如果有)。