我相信我们在项目中肯定遇到过这个${pageContext.request.contextPath},因为相对路径实在太麻烦了,而我当前项目是分布式的,有很多个模块,多个类似于这种路径,所有配置在xml里面方便与后期的修改,话不多说直接贴代码
实体类 OrderInfo
package com.pk.entity; import org.springframework.stereotype.Component; @Component public class OrderInfo { private String staticPath;//静态地址 private String orderPath;//订单order地址 private String loginPath;//PC登录地址 public String getOrderPath() {return orderPath; }public void setOrderPath(String orderPath) {this.orderPath = orderPath; }public String getStaticPath() {return staticPath; }public void setStaticPath(String staticPath) {this.staticPath = staticPath; }public String getLoginPath() {return loginPath; }public void setLoginPath(String loginPath) {this.loginPath = loginPath; }}
order-local.xml XML文件
<?xml version="1.0" encoding="UTF-8"?> <Order> <!-- 静态地址首页 --> <staticPath>http://www.pk.cn/static/</staticPath> <orderPath>http://www.pk.cn/trade/</orderPath> <loginPath>http://www.pk.cn/trade/order/login.jhtml</loginPath> <!-- 线上地址 --> </Order>
Order_AutoConfig (@postconstruct 注解执行servlet的构造函数的后面 init的前面 详情百度 )
package com.pk.utils; import java.net.URL; import javax.annotation.PostConstruct; import javax.annotation.Resource; import com.pk.entity.OrderInfo; import org.dom4j.Document; import org.dom4j.Element; import org.dom4j.io.SAXReader; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; /** * 系统初始自动获取配置信息 * * */ @Component public class Order_AutoConfig {/** logger */ //private static final Logger logger = LoggerFactory.getLogger(Order_AutoConfig.class); public static final String CONFIG_FILE_NAME = "order-local.xml"; // 系统配置文件名称 @Resource OrderInfo order; /** * 系统配置信息读取 * * */ @PostConstruct public void autoInIt() {Document document = null; try {URL configFilePath = Thread.currentThread().getContextClassLoader().getResource(CONFIG_FILE_NAME); SAXReader saxReader = new SAXReader(); document = saxReader.read(configFilePath); Element root = document.getRootElement(); String staticPath = root.element("staticPath").getTextTrim(); String orderPath = root.element("orderPath").getTextTrim(); String loginPath = root.element("loginPath").getTextTrim(); order.setOrderPath(orderPath); order.setStaticPath(staticPath); order.setLoginPath(loginPath); } catch (Exception e) { e.printStackTrace(); }}}
InitListener 实现 ServletContextAware 就可以拿到servletContext 把数据放进去你就可以在jsp页面使用了
package com.pk.listener; import javax.annotation.Resource; import javax.servlet.ServletContext; import com.pk.entity.OrderInfo; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Component; import org.springframework.web.context.ServletContextAware; /** * Listener - 初始化 */ @Component("initListener") public class InitListener implements ServletContextAware {/** logger */ private static final Logger logger = LoggerFactory.getLogger(InitListener.class); /** servletContext */ private ServletContext servletContext; @Resource OrderInfo orderInfo; public void setServletContext(ServletContext servletContext) {this.servletContext = servletContext; onApplicationInIt(); }public void onApplicationInIt() {try {if (servletContext != null) {servletContext.setAttribute("OrderInfo", orderInfo); }} catch (Exception e) {logger.error("加载模块的系统变量失败{}",servletContext.getAttribute("OrderInfo")); e.getStackTrace(); }}}