spring 映射请求_在Spring中以编程方式获取模块的请求映射URL

本文介绍如何在Spring框架中以编程方式获取模块的请求映射URL,避免硬编码URL带来的修改难题。通过使用Class.getAnnotation()API和@ControllerAdvice,文章展示了如何动态获取并传递控制器级别的请求映射URL到视图。

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时,我会进行社交,阅读博客和看电影。

翻译自: https://bytes.com/topic/java/insights/960769-programmatically-obtain-request-mapping-url-module-spring

spring 映射请求

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值