jsp自定标签(并且注入spring容器中的bean)

本文介绍了一种在JSP中使用自定义标签的方法,通过创建一个简单的自定义标签来从数据库查询用户昵称并显示。该标签简化了代码结构,使得美工可以独立进行界面设计,同时便于开发者后期维护。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

作用

在我们开发中,界面和程序代码是分开做的美工做界面但是美工不懂得Java语言如果我们把Java代码写在jsp文件中,会影响美工工作如果我们使用自定义标签,到时再jsp中我们只需要加入一段引用标签代码就好了不会影响美工工作此外jsp文件简单,方便我们以后修改

1创建类

package com.eyugame.common.tag;

import java.io.IOException;

import javax.servlet.jsp.JspException;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.tagext.TagSupport;

import org.springframework.web.context.ContextLoader;
import org.springframework.web.context.WebApplicationContext;

import com.eyugame.common.service.hibernate.HibernateBaseService;
import com.eyugame.security.entity.SysUser;

public class MyTag extends TagSupport {

	private static HibernateBaseService hibernateBaseService;
	
	private String username;

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;

	@Override
	public int doStartTag() throws JspException {
		JspWriter writer = this.pageContext.getOut();
		/*获取bean*/
		if(hibernateBaseService==null){
			WebApplicationContext webApplicationContext = ContextLoader.getCurrentWebApplicationContext();
			hibernateBaseService = (HibernateBaseService) webApplicationContext.getBean("hibernateBaseService");
		}
		/*查询数据库*/
		SysUser user = hibernateBaseService.findUniqueByHql(SysUser.class, "from SysUser as u where u.username='" + username + "'");
		try {
			writer.print(user.getNickname());
		} catch (IOException e) {
			e.printStackTrace();
		}
		return SKIP_BODY;
	}

	@Override
	public int doEndTag() throws JspException {
		return super.doEndTag();
	}

	public String getUsername() {
		return username;
	}

	public void setUsername(String username) {
		this.username = username;
	}

}

创建tld文件

my.tld

<?xml version="1.0" encoding="UTF-8"?>
<taglib version="2.0" xmlns="http://java.sun.com/xml/ns/j2ee"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee web-jsptaglibrary_2_0.xsd">
	<tlib-version>1.0</tlib-version>
	<jsp-version>2.0</jsp-version>
	<short-name>cc</short-name>
	<uri>/mytaglib</uri>
	<tag>
		<name>myTag</name>
		<tag-class>com.eyugame.common.tag.MyTag</tag-class>
		<body-content>empty</body-content>
		<attribute>
			<name>username</name>
			<required>true</required>
			<rtexprvalue>true</rtexprvalue>
		</attribute>
	</tag>
</taglib>
3.web.xml加入以下配置

 <jsp-config>
  <taglib>  
    <taglib-uri>/tagTest </taglib-uri>  
    <taglib-location>/tld/my.tld</taglib-location>  
  </taglib>
  </jsp-config>
4.jsp页面加入以下内容
<!--jsp顶部加入, uri是在web项目的上下文路径 -->
<%@taglib prefix="cc" uri="/tld/my.tld" %>

   <!-- 在body内加入 -->
   <cc:myTag username="admin" />

先看我数据库有条记录


jsp展示后

结果正确


<think>首先,用户的问题是关于Spring框架中的视图解析器:"我想了解Spring框架中视图解析器是否将视图对象注入Spring容器"。用户想知道视图解析器是否会将生成的视图对象注入Spring容器中。 现在,我需要参考提供的引用内容来回答这个问题。引用包括: - [^1]: 讨论了Spring容器SpringMVC容器的父子关系。 - [^2]: 解释了Spring容器如何工作,包括依赖注入和控制反转。 - [^3]: 描述了IoC容器作为工厂,管理对象和依赖关系。 - [^4]: 提到在项目中,Spring容器负责非controller的Bean,而SpringMVC负责controller相关的Bean。 - [^5]: 展示了属性注入的XML配置示例。 这些引用中没有直接提到视图解析器或视图对象。所以,我需要基于我的知识来回答,但确保回答真实可靠,并尽量引用或参考这些内容。 关键点: - 在Spring MVC中,视图解析器(如InternalResourceViewResolver)负责将逻辑视图名解析为实际的视图对象(如JSP视图)。 - 视图对象通常不是由Spring容器直接管理的Bean。相反,视图解析器在请求处理过程中动态创建视图对象。 - 视图解析器本身是一个Bean,由Spring容器管理(通常在SpringMVC容器中),但生成的视图对象不是注入容器中的Bean。 从引用[^1]和[^4]:Spring容器SpringMVC容器是父子容器Spring容器管理服务和DAO等Bean,而SpringMVC容器管理控制器、视图解析器等Web相关的Bean。 视图解析器是一个Bean,定义在SpringMVC配置中,由SpringMVC容器管理。当控制器返回一个视图名时,视图解析器解析它并创建视图对象(例如,InternalResourceView)。这个视图对象是临时的,用于渲染响应,而不是一个长期存在的Bean容器中。 因此,视图对象没有被注入Spring容器中;它们是在运行时动态创建和使用的。 回答结构: 1. **清晰解释视图解析器的作用**:简要说明视图解析器在Spring MVC中做什么。 2. **直接回答问题**:视图对象是否被注入容器?不,它们不是容器管理的Bean。 3. **解释原因**:基于Spring MVC的工作原理,视图对象是短暂的,每次请求时创建。 4. **参考引用**:自然地融入引用内容来支持回答。例如,引用[^1]和[^4]讨论容器结构。 5. **生成相关问题**:在末尾添加相关问题,以帮助用户深入学习。 6. **使用中文回答**:整个响应必须用中文。 7. **LaTeX格式**:如果有数学表达式,使用$...$或$$...$$,但这里可能不需要,除非涉及公式。 最后,生成相关问题:基于主题,如Spring MVC视图解析器、容器管理等。 相关问题示例: 1. 视图解析器是如何配置的? 2. Spring MVC中的视图对象生命周期是什么? 3. 如何自定义视图解析器? 确保响应结构清晰:一步一步解释。</think>### Spring框架中视图解析器是否将视图对象注入Spring容器Spring框架中,视图解析器(如`InternalResourceViewResolver`)是Spring MVC模块的核心组件,负责将控制器返回的逻辑视图名(例如"home")解析为实际的视图对象(如JSP视图或Thymeleaf视图)。针对您的问题,我结合Spring的工作原理和相关引用内容,逐步解释视图对象是否被注入Spring容器中。 #### 1. **视图解析器的基本作用** - 视图解析器在请求处理过程中动态创建视图对象。例如,当控制器方法返回一个字符串(如"index")时,视图解析器会根据配置(如前缀`/WEB-INF/views/`和后缀`.jsp`)生成一个具体的视图对象(如`InternalResourceView`),用于渲染响应。 - 这些视图对象是临时的、请求级别的对象,每次请求时都会根据需要创建新的实例。它们不是长期存在的Bean,而是用于处理单个HTTP请求的运行时组件。 #### 2. **视图对象是否被注入Spring容器?** - **否,视图对象不会被注入Spring容器中**。原因如下: - **视图对象的生命周期短暂**:视图对象在请求处理结束后就被销毁,不会被Spring IoC容器管理。Spring容器(包括根容器SpringMVC子容器)主要管理Bean的定义、依赖注入和单例生命周期[^2][^3]。视图对象不符合这种模型,因为它们不是通过配置定义的Bean,而是动态生成的。 - **容器结构限制**:Spring框架中,Spring容器(根容器)负责管理服务层、数据访问层等非Web Bean,而SpringMVC容器(子容器)负责管理控制器、视图解析器等Web相关Bean[^1][^4]。视图解析器本身是一个Bean(由SpringMVC容器管理),但**它生成的视图对象不是注册为Bean的实例**。例如,在XML配置中,视图解析器可能这样定义: ```xml <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/WEB-INF/views/" /> <property name="suffix" value=".jsp" /> </bean> ``` 这里,`viewResolver`是容器管理的Bean,但通过`resolveViewName()`方法创建的视图对象(如`InternalResourceView`)不会被添加到容器中。 - **依赖注入机制不适用**:Spring的IoC容器通过依赖注入(DI)管理对象间的关系[^2][^5],但视图对象通常不需要被其他Bean引用或注入。它们由DispatcherServlet在内部使用,用于渲染视图,而不涉及容器级别的依赖管理。 #### 3. **为什么视图对象不被注入?** - **性能与设计考虑**:视图对象通常是轻量级的、无状态的,且每次请求可能不同(例如,基于不同参数)。如果将它们作为Bean注入容器,会增加不必要的开销(如Bean初始化和销毁),并违反Spring的“按需创建”原则[^3]。 - **实际工作流程**:在Spring MVC中,视图解析器只是将逻辑名映射到视图实现,视图对象本身不参与容器的依赖注入链。这类似于其他临时对象(如HTTP请求对象),它们由框架管理,而非IoC容器[^1][^4]。 #### 4. **如何验证这一点** - 您可以检查视图解析器的源码(如`InternalResourceViewResolver`),其`resolveViewName()`方法直接返回一个新视图实例,而不调用`getBean()`或类似容器方法。 - 在配置中,视图对象没有对应的`<bean>`或`@Component`定义,这与服务层Bean不同[^5]。 总之,视图解析器不会将生成的视图对象注入Spring容器中;视图对象是运行时动态创建的临时组件。如果您需要自定义视图行为,可以通过扩展视图解析器或配置视图类来实现,但无需涉及容器注入[^4]。 ### 相关问题 1. **Spring MVC中如何配置和自定义视图解析器?** 2. **视图对象在Spring MVC的生命周期是怎样的?** 3. **Spring容器SpringMVC容器的父子关系如何影响Bean管理?** 4. **如何优化视图解析性能在大型应用中?**
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值