我有包含方法[void return]的bean,并希望在JSP中访问这个bean。
public class A {
public void run() {}
}
将以下代码添加到spring配置文件中。
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="exposeContextBeansAsAttributes" value="true"/>
</bean>
<bean id="a" class="com.example.A"
>
</bean>
现在在我的JSP页面中:
${a.run}
但是这个解决方案不起作用。请帮助我在JSP页面上访问spring bean。
答案 0 :(得分:4)
将bean注入控制器并将其作为模型的一部分公开。
但为什么需要从JSP调用run
?
JSP EL期望遵循JavaBean命名约定;此示例将无法按预期方式工作。 最简单选项是重命名方法,或提供遵循JavaBean命名约定并调用run
的其他方法
编辑以回复评论。
如果需要从链接调用方法,则有两个(合理的)选项:链接到调用注入服务的控制器操作,或者对调用注入服务的控制器方法进行Ajax调用。
直接从视图层(JSP)进行服务调用仍然没有理由。
答案 1 :(得分:0)
您无法使用${a.run}
来调用#{a.run}
方法{。}}。
答案 2 :(得分:0)
@ Dave Newton的评论:“直接从视图层进行服务调用仍然没有理由”。 考虑一个场景,您要在其中开发自定义标记(例如,在您的核心Web项目中根据标记的属性值从服务类中获取值的下拉列表)。并在.tag文件中提供TAG实现。 将服务调用保留在.tag文件中似乎比更新每个控制器中的模型更好,在渲染使用标记的视图之前调用。你有什么建议,在.tag文件中使用onload AJAX调用来获取dorpdown内容?
答案 3 :(得分:0)
你试过这个吗?
$ {a.run()}
我没有使用org.springframework.web.servlet.view.InternalResourceViewResolver
(改为使用它的超类),但是如果你的控制器注入了一个实现了profile
方法的Java对象toJson()
,这就行了。只要a
可以被JSP访问并实现run()
,就不明白为什么相同的语法不起作用。
<script>
$(function() {
var profileJson = ${profile.toJson()};
....
})
</script>
这是如何使用初始内容预加载我的页面并在页面加载时保存到后端的行程。
答案 4 :(得分:-2)
您可以为
这样的东西编写一个scriptlet<%
ApplicationContext ctx = RequestContextUtils.getWebApplicationContext(request);
A a = (A) ctx.getBean("yourBeanName");
%>
如果通过DispatcherServlet路由请求,请使用或使用WebApplicationContextUtils。
你应该研究Spring MVC。这更适合你。