spring 映射请求
在本文中,我们将讨论如何在Spring中以编程方式获取模块的请求映射URL。 Java开发人员知道从3.0版开始的所有版本的Spring,都允许开发人员通过在控制器类中使用@RequestMapping注释(作为XML配置文件的替代方法)对其进行定义来管理处理程序映射。
除此功能外,开发人员还可以为顶级请求映射URL注释控制器类。 在这种情况下,类级别的URL将以方法级别的URL为前缀,以形成一个完整的URL并向控制器发送请求。
通常,开发人员为每个模块建立一个控制器。 但是,有时他们需要以编程方式获取类级别的请求映射URL。 在本文中,我们将提供此技术的示例,并向您展示如何在Spring中实现它。
对于我们的示例,我们将使用一个名为“ Employee”的模块。 在此示例中,除其他信息外,我们还需要在employeeDetail主页面上显示员工的个人详细信息。 我们将主页分成几个小的jsp页面。 将显示员工个人信息的文件是empPersonalDetails.jsp,并且必须使用<jsp:include>操作将该页面包含在主页中(employeeDetails.jsp)。
假设您已使用apache tile为每个此类子页面提供一致的布局(由于某些要求或仅出于装饰目的),并且您希望通过控制器调用将其包括在内。 为此,您将使用类似于下面详述的代码:
EmployeeController.java
@Controller
@RequestMapping("/employee")
public class EmployeeController{
@RequestMapping (value = "/empPersonalDetails")
public ModelAndView showEmpPersonalDetails(ModelMap modelMap){
//code to fetch employee personal details from database
//set model values
return new ModelAndView("empPersonalDetails");
}
employeeDetails.jsp
<jsp:include page="/employee/empPersonalDetails.html"></jsp:include>
注意:上面<jsp:include>操作中的empPersonalDetails.html将导致对controller方法的调用,该方法将返回适当的tile视图(empPersonalDetails)以及所需的模型值。
此处已达到要求,但是,您可能已经注意到,在<jsp:include>中静态指定了指向Employee模块的URL,即“ / employee /…”
这样的一个缺点是,将来,如果您需要更改模块的URL,即控制器类的@RequestMapping值,或在URL中添加其他级别,则需要将这些更改反映在所有您静态指定了URL的地方。
有一种方法可以使用Class.getAnnotation()API动态获取控制器级别的请求映射URL。 以下代码将返回在EmployeeController类的@RequestMapping批注中指定为值的URL。
String empModuleURL = EmployeeController.class.getAnnotation(RequestMapping.class).value()[0].toString());
在<jsp:include>中,您将要使用上述代码返回的URL值。
使值在jsp文件中可用的直接方法是在EmployeeController类中使用ModelMap设置模型属性,该方法负责返回EmployeeDetail主页面的视图。
但是,为了实现更好的设计并容纳其他模块和URL,您可能希望为所有控制器共同设置模型属性。
在Spring中,可以使用Controller Advice类来完成此操作,该类将充当应用程序的全局处理程序。 在下面的示例中,我们将使用@ControllerAdvice批注将GlobalHandler.java标记为控制器建议类。
@ControllerAdvice
public class GlobalHandler {
@ModelAttribute("moduleURLs")
public HashMap<String, String> getModuleURL(){
HashMap<String, String> moduleURLMap=new HashMap<String, String>();
moduleURLMap.put("employeeModule",EmployeeController.class.getAnnotation(RequestMapping.class).value()[0].toString());
.
.
//Add URLs for other modules
return moduleURLMap;
}
}
请注意,使用@ModelAttribute批注将getModuleURL()方法标记为表单支持方法,以使所需的模型值在视图中可用。
现在,“雇员”模块的URL将作为EmployeeDetails.jsp文件中“ employeeModule”属性的值提供。
以下代码将替换EmployeeDetails.jsp文件中的上述代码行。 注意如何使用EL访问URL值。
<jsp:include page="${moduleURLs.employeeModule}/empPersonalDetails.html"></jsp:include>
使用此技术将确保代码将使用为控制器类指定的任何模块URL进行调用。
通过使用本文定义和描述的技术,开发人员将确保他或她的代码保持相关性,并且不会被以后的更改所破坏。
Hasan Sunasara:谁喜欢设计,开发和调整Java Enterprise Applications。 我努力学习新事物,并改善生活道路上可能涉及的每个领域。 当不使用Java时,我会进行社交,阅读博客和看电影。
spring 映射请求
本文介绍如何在Spring框架中以编程方式获取模块的请求映射URL,避免硬编码URL带来的修改难题。通过使用Class.getAnnotation()API和@ControllerAdvice,文章展示了如何动态获取并传递控制器级别的请求映射URL到视图。

被折叠的 条评论
为什么被折叠?



