spring mvc里, jsp中怎么获取bean

正厅级二奶 发布于 2014/11/27 11:36
阅读 5K+
收藏 2

 spring mvc里, jsp中怎么调用service,service是使用注解的方式注入的,用WebApplicationContext弄不出来 

service里的代码

 @Service("systemService")
public class SystemService extends BaseService
 {
//数据库操作
}
JSP代码
<%@ page language="java" pageEncoding="UTF-8"%>
<%@ page import="com.bada.service.system.SystemService,java.util.*,
com.bada.model.system.SystemParam,org.springframework.web.context.WebApplicationContext
,org.springframework.web.context.support.WebApplicationContextUtils
,org.springframework.context.ApplicationContext,com.bada.service.SpringUtils" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<c:set var="path" value="${pageContext.request.contextPath }" />
<%
ServletContext context = request.getSession().getServletContext();
ApplicationContext ctx = WebApplicationContextUtils.getWebApplicationContext(context);
WebApplicationContextUtils.getWebApplicationContext(application).getBean("systemService");
//SystemService sysservice=(SystemService)ctx.getBean("systemService"); 
SystemService sysservice=(SystemService)SpringUtils.getApplicationContext().getBean("systemService");
%>

web.xml里配置了监听器

listener> 
	<listener-class>org.springframework.web.context.request.RequestContextListener</listener-class>
</listener>

JSP里报错说:org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'systemService' is defined

或者说,

使用注解的时候,jsp如何获得bean对象

加载中
1
ForEleven
ForEleven

SprintUtils , 在你的jsp页面上面import 这个类。然后通过

SpringUtils.getApplicationContext().getBean("dataSource")
获取指定的bean

package com.jsits.core;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanFactoryPostProcessor;
import org.springframework.beans.factory.config.BeanPostProcessor;
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
import org.springframework.beans.factory.xml.ResourceEntityResolver;
import org.springframework.beans.factory.xml.XmlBeanDefinitionReader;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.core.io.FileSystemResource;
import org.springframework.stereotype.Component;

@Component
public class SpringUtils implements BeanFactoryPostProcessor,
		BeanPostProcessor, ApplicationContextAware {

	protected static Logger logger = LoggerFactory.getLogger(SpringUtils.class);

	private static ConfigurableApplicationContext applicationContext = null;

	private static ConfigurableListableBeanFactory beanFactory = null;

	@Override
	public void setApplicationContext(ApplicationContext applicationContext)
			throws BeansException {
		SpringUtils.applicationContext = (ConfigurableApplicationContext) applicationContext;
	}

	public static ConfigurableApplicationContext getApplicationContext() {
		return applicationContext;
	}
	
	public static ConfigurableListableBeanFactory getConfigurableListableBeanFactory() {
		return beanFactory;
	}

	@Override
	public void postProcessBeanFactory(
			ConfigurableListableBeanFactory beanFactory) throws BeansException {
		SpringUtils.beanFactory = beanFactory;
	}

	@Override
	public Object postProcessBeforeInitialization(Object bean, String beanName)
			throws BeansException {
		return bean;
	}

	@Override
	public Object postProcessAfterInitialization(Object bean, String beanName)
			throws BeansException {
		return bean;
	}


	public static void registerBean(String resource) {
		BeanDefinitionRegistry beanDefinitionRegistry = ((BeanDefinitionRegistry)getConfigurableListableBeanFactory());

		XmlBeanDefinitionReader definitionReader = new XmlBeanDefinitionReader(
				beanDefinitionRegistry);

		definitionReader.setResourceLoader(getApplicationContext());
		definitionReader.setEntityResolver(new ResourceEntityResolver(
				getApplicationContext()));

		definitionReader.setValidating(false);
		definitionReader.setValidationMode(XmlBeanDefinitionReader.VALIDATION_NONE);
		
		definitionReader.loadBeanDefinitions(new FileSystemResource(resource));
	}

	public static void unregisterBean(String beanName) {
		if (containsBean(beanName)) {
			BeanDefinitionRegistry beanDefinitionRegistry = ((BeanDefinitionRegistry)getConfigurableListableBeanFactory());
			beanDefinitionRegistry.removeBeanDefinition(beanName);
		}
	}

	public static boolean containsBean(String beanName) {
		return getConfigurableListableBeanFactory().containsBeanDefinition(beanName);
	}
}



正厅级二奶
正厅级二奶
回复 @ForEleven : 加上了还是不行,我修改了问题,麻烦再帮我看看
ForEleven
ForEleven
回复 @正厅级二奶 : 你的web.xml中 有没有这个Listener <listener> <listener-class>org.springframework.web.context.request.RequestContextListener</listener-class> </listener>
正厅级二奶
正厅级二奶
回复 @ForEleven : 我后来 @Service("sysservice") 这么写了还是获取不到
ForEleven
ForEleven
回复 @正厅级二奶 : 比如 有一个Bean的类名是 DemoService ,使用注解他的默认名是 demoService
ForEleven
ForEleven
回复 @正厅级二奶 : 用了注解不是说没有名字了,比如你@Service注解里面可以定义这个bean的名字,如果不定义,默认是Bean的首字母小写
下一页
0
buglife
buglife
@Autowired啊
0
正厅级二奶
正厅级二奶

引用来自“CrazyHarry”的评论

@Autowired啊
现在需要的是jsp里调用,你这是在java业务代码里的做法啊。
正厅级二奶
正厅级二奶
回复 @CrazyHarry : JSP里不能有注解的
buglife
buglife
jsp里难道就不可以吗,同样的是在写Java code啊
0
ForEleven
ForEleven
Web.xml中 加上这个Listener
<listener>
        <listener-class>org.springframework.web.context.request.RequestContextListener</listener-class>
</listener>

<listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>



或者下面这个,额,忘记具体是哪个了,你都加上吧

正厅级二奶
正厅级二奶
回复 @ForEleven : 改了下代码,解决了
ForEleven
ForEleven
回复 @正厅级二奶 : 用我给你的那个SpringUtils 试试看
正厅级二奶
正厅级二奶
回复 @ForEleven : 都加过了
ForEleven
ForEleven
回复 @正厅级二奶 : 两个都加上呢?
正厅级二奶
正厅级二奶
ContextLoaderListener 我默认就有的
0
平安北京
WebApplicationContextUtils.getWebApplicationContext(application).getBean("studentService");
正厅级二奶
正厅级二奶
还是没搞出来 郁闷
0
sxgkwei
sxgkwei
你的结构上正在走入歧途~~
0
平安北京

引用来自“平安北京”的评论

WebApplicationContextUtils.getWebApplicationContext(application).getBean("studentService");
回复 @正厅级二奶 : web.xml中加入<listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
  </listener>
  <listener>
    <listener-class>
            org.springframework.web.context.request.RequestContextListener
        </listener-class>
  </listener>,然后jsp中写java代码,就是上面那句,就可以获取到了
0
正厅级二奶
正厅级二奶

引用来自“sxgkwei”的评论

你的结构上正在走入歧途~~
有用JSTL,但JSTL表达能力有限,之所以想到在JSP中获取bean,是想在公共引入的JSP中可以随便获取数据,而不需要经过modelAndView这层。
sxgkwei
sxgkwei
我只能呵呵的祝福你旅途愉快了。
0
朱宏青
朱宏青

看到jsp里这么多坑爹的代码 真是醉倒了

你正在走向歧途~祝您旅途愉快~

0
JeffreyLin
JeffreyLin
试试:ctx.getBean(SystemService.class);
公共数据可以考虑用过滤器获取后放入request
返回顶部
顶部