Spring MVC 自定义标签如何使用@Autowired自动装配注解

在用Spring MVC框架做Web应用开发中,在一些特殊请款下我们都会用自定标签来完成一些特殊的功能。

在通常情况下,自定义标签的内容如果不通过访问服务就能实现,那么继承TagSupport,重写doStartTag()方法就可以实现基本功能。

eg. 实现一个html标记的反转义功能的自定义标签

/**

* @Comment

* @Author Ron

* @date 2016年8月30日 上午9:02:56

*/

public class HtmlUnEncodeTags extends TagSupport {

private Logger logger = LogManager.getLogger(this.getClass());

private String encodeStr;

private static final long serialVersionUID = 1L;

@Override

public int doStartTag() throws JspException {

String outStr = "";

try {

if(StringUtils.isNotBlank(encodeStr)){

outStr = StringEscapeUtils.unescapeHtml4(encodeStr);

}

pageContext.getOut().write(outStr);

} catch (IOException e) {

logger.error("",e);

}

return super.doStartTag();

}

public String getEncodeStr() {

return encodeStr;

}

public void setEncodeStr(String encodeStr) {

this.encodeStr = encodeStr;

}

}

但是在特殊情况下,我们需要在自定义标签的逻辑代码中访问服务层获取信息,那么如何通过注解的方式自动装配服务呢?在Spring MVC中,用上面所说的方法是不行的。

这里需要自定义标签继承的是RequestContextAwareTag 而不是TagSupport。

例如我们需要实现一个获取未读邮件数目的功能,我们首先需要在自己的服务中写好获取或者计算邮件未读数量的方法,这里假定为:

queryMsgCount(userId,EmailConsts.ReadStatus.NO.getValue());

userId:用户唯一标示

EmailConsts.ReadStatus.NO.getValue():获取枚举的邮件未读状态值

自定义标签逻辑class为MsgUnReadMsgTags

那么要实现获取未读邮件数目的功能,那么实现代码如下所示:

public class MsgUnReadMsgTags extends RequestContextAwareTag  {

private Logger logger = LogManager.getLogger(this.getClass());

private int userId;

private static final long serialVersionUID = 1L;

@Autowired

private UserMessageFacade userMessageService;

@Override

public int doStartTagInternal() throws JspException {

String outStr = "";

try {

JspWriter writer = pageContext.getOut();

userMessageService = this.getRequestContext().getWebApplicationContext().getBean(UserMessageFacade.class);

int count = userMessageService.queryMsgCount(userId,EmailConsts.ReadStatus.NO.getValue());

if(count > 0){

if(count > 99){

outStr = "<span class=\"badge\">99+</span>";

}else{

outStr = "<span class=\"badge\">"+ count +"</span>";

}

}

writer.write(outStr);

writer.flush();

} catch (IOException e) {

logger.error("Get Messages Count IOException-------------->>>>>>>>>>",e);

}

return 0;

}

public int getUserId() {

return userId;

}

public void setUserId(int userId) {

this.userId = userId;

}

}

注意:

在定义userMessageService服务时用@Autowired自动装配注解是不够的,你还需要在使用时使用ApplicationContext的getBean方法获取服务的Bean。

如以上代码中的代码块:

userMessageService = this.getRequestContext().getWebApplicationContext().getBean(UserMessageFacade.class);

时间: 2024-07-31 20:52:40

Spring MVC 自定义标签如何使用@Autowired自动装配注解的相关文章

spring mvc --自定义converse

思路:假设有两个空栈s1,s2,用s1提供入队功能,s2提供出队功能. push操作:直接push到s1. pop操作:如果s2不为空,直接弹出s2的数据,否则依次弹出s1的数据到s2中,再取2栈顶的数据. #include <iostream> #include <stack> using namespace std; template<typename T> class Queue { public: Queue() : qsize(0) { } void push

spring mvc 自定义编辑器

起始知识: Java标准的PropertyEditor的核心功能是将一个字符串转换为一个Java对象,以便根据界面的输入或配置文件中的配置字符串构造出一个JVM内部的java对象. 如何注册自定义的属性编辑器: 1.实现PropertyEditor接口或者继承PropertyEditorSupport类 2.在Spring上下文中声明一个org.springframework.beans.factory.config.CustomEditorConfigurer的bean <!--将bean1中

大厂面试官问你META-INF/spring.factories要怎么实现自动扫描、自动装配?

大厂面试官问你META-INF/spring.factories要怎么实现自动扫描.自动装配? 很多程序员想面试进互联网大厂,但是也有很多人不知道进入大厂需要具备哪些条件,以及面试官会问哪些问题,这里今天就给大家分享一下,如果大厂面试官问你META-INF/spring.factories要怎么实现自动扫描.自动装配,你需要怎么回答? 程序员应聘面试经验技巧和注意事项你知道哪些? 1.基础很重要,不要生疏了. 2.要关注技术前沿. 3.小公司比较看重知识的广度,大公司更看重知识的深度. 4.良好

Spring MVC自定义统一异常处理类,并且在控制台中输出错误日志

在使用SimpleMappingExceptionResolver实现统一异常处理后(参考Spring MVC的异常统一处理方法), 发现出现异常时,log4j无法在控制台输出错误日志.因此需要自定义一个继承至SimpleMappingExceptionResolver的 RrtongMappingExceptionResolver类,在RrtongMappingExceptionResolver中通过 log.error(ex.getMessage())的方式输出日志到控制台上.以下是具体的配

基于Spring开发——自定义标签及其解析

1. XML Schema 1.1 最简单的标签 一个最简单的标签,形式如: <bf:head-routing key="1" value="1" to="test2"/> 该标签只包含了若干属性,我们就在xsd文件中这么定义 <!-- 声明一个标签,名字为head-routing,他的类型为headRouting--> <xsd:element name="head-routing" type=

Spring的自定义标签

当Spring拿到一个元素时首先要做的是根据命名空间进行解析,如果是默认的命名空间,则使用parseDefaultElement方法进行元素解析,否则使用parseCustom Element方法进行解析. protected void parseBeanDefinitions(Element root, BeanDefinitionParserDelegate delegate) { if (delegate.isDefaultNamespace(root)) { NodeList nl =

Spring——使用自定义标签

文章内容参考了<Spring源码深度解析>一书.自己照着书中内容做了一遍,不懂的地方以及采坑的地方会在文中记录. 推荐一篇post,关于Spring配置文件的命名空间: https://www.cnblogs.com/gonjan-blog/p/6637106.html 我们暂时只是知道使用Spring的常规标签,加个bean,事务,Aop等等.随着满足业务的需求,同时降低程序员的工作量,我们有时需要自己定制一些标签.话补多少,下面进入主题. 自定义标签的使用 扩展Spring自定义标签大致需

Spring框架学习笔记(5)——自动装配

1.通过bean标签的autowire属性可以实现bean属性的自动装配. 创建一个新的Spring配置文件beans-autowire.xml,这里我们配置了3个bean,Address.Car.People,其中People自动装配了另外两个bean,使用的是bean标签的autowire属性,这个例子里如果将car改为car2打印出来的Person bean 的Car属性为null,即byName根据bean的setter风格进行自动装配有就装没有就不装.而使用byType的话如果配置有两

Spring(二)scope、集合注入、自动装配、生命周期

原文链接:http://www.orlion.ga/189/ 一.scope bean的scope属性中常用的有两种:singleton(单例,默认)和prototype(原型,每次创建新对象) 例:beans.xml <bean id="userService" class="ml.orlion.service.UserService" scope="prototype">     <property name="u