如标题中所述,我需要在我的page.jsp中自动装配服务.. “我知道不建议这样做”
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%@ page import="org.springframework.context.ApplicationContext"%>
<%@ page
import="org.springframework.web.servlet.support.RequestContextUtils"%>
<%@ page import="com.fussa.fyby.service.Test"%>
<%@ page import="com.fussa.fyby.model.PIL_P_APPLCTN"%>
<%
ApplicationContext ac = RequestContextUtils.getWebApplicationContext(request);
Test s = (Test) ac.getBean("fussafyby");
PIL_P_APPLCTN app = s.getByKey(13);
%>
<c:out value="azeerty"></c:out>
<c:out value="${ app.APPLCTN_CD }"></c:out>
<select name="listeGroupes" id="listeGroupes">
<option value="123">123</option>
<option value="${ app.APPLCTN_CD }">${ app.APPLCTN_CD }</option>
<option value="123">${ s.afficher() }</option>
</select>
我的服务:
@Component("fussafyby")
@Transactional
public class Test {
@Autowired
private SessionFactory sessionFactory;
protected Session getSession() {
return sessionFactory.getCurrentSession();
}
public PIL_P_APPLCTN getByKey(int key) {
return (PIL_P_APPLCTN) getSession().get(PIL_P_APPLCTN.class, key);
}
public String affiche() {
return "FuSsA";
}
}
仅显示选择中的 azeerty 消息和 123 选项..
感谢您的任何建议..
答案 0 :(得分:5)
你甚至不应该这样做...... JSP被转换为java源并由servlet容器编译为java类,并且Java EE规范没有说明它们去哪里,所以你不能对它们进行弹簧扫描,因此注释不是一个选项
更糟糕的是,JSP不能是Spring bean,因为它们是由应用程序上下文之外的servlet容器创建的,因此XML注入也无法工作。
甚至完整的AspectJ也无法使用,因为再一次你无法控制JSP类的位置,所以你甚至无法在它们上使用加载时织入器。
问题不在于“不建议这样做”,而是JSP是由servlet容器管理的特殊类。您可以在scriplet中使用Java代码,但不能将它们作为普通的Java类进行管理。
顺便说一句,顺便说一下,你不认为没有在scriptlet中推荐太多Java代码的充分理由吗?答案 1 :(得分:1)
我认为您不能在JSP中使用 @Autowired 注释。但是您使用了一些Support类。我可以帮助你解决这些问题:
解决方案1:
如果你正在使用Spring MVC,
只需使用ModelAndView将您的服务传递给JSP。
示例:
假设您有控制器:
<html>
...
${tService.myMethodIWantToUse(..)}
...
</html>
<强> JSP:强>
@Component("tsc")
public void TestServiceClass{
//Your code goes here
}
解决方案2:
在JSP中使用ApplicationContext来访问任何类似这样的bean
示例:强>
ApplicationContext aC = RequestContextUtils.getWebApplicationContext(request);
TestServiceClass tsc1 = (TestServiceClass) aC.getBean("tsc");
//Code to access your service Classes methods.
内部JSP:
.... , onclick = "return confirm('are you sure?')"
希望这会有所帮助。
答案 2 :(得分:1)
jsp内部:
.btn-circle {
pointer-events: none;
display: inline-block; /* For added support */
}
您还可以对TestService testService = ApplicationContextProvider.getApplicationContext().getBean(TestService.class);
testService.testMethod();
方法
String
参数(服务名称)
答案 3 :(得分:1)
Spring可以通过将bean名称公开到请求上下文中来为您(现在)执行此操作,您只需要在viewResolver中对其进行配置。
发件人:https://raibledesigns.com/rd/entry/spring_mvc_jstlview_and_exposecontextbeansasattributes
<bean id="viewResolver"
class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>
<property name="exposeContextBeansAsAttributes" value="true"/>
<property name="prefix" value="/"/>
<property name="suffix" value=".jsp"/>
</bean>
答案 4 :(得分:0)
你想从JPS页面调用spring服务方法吗? 只需按照以下步骤操作,它对我有用......
假设您要访问AnimalService
类。
步骤1:
AbstractApplicationContext appContext = new AnnotationConfigApplicationContext(AnimalService.class);
如果您的AnimalService依赖于另一个类,请说FoodService
..然后step1应如下所示。
AbstractApplicationContext appContext = new AnnotationConfigApplicationContext(AnimalService.class,FoodService.class);
简而言之,您需要在那里添加所有依赖类。
步骤2:
AnimalService animalservice = appContext.getBean(AnimalService.class);
animalservice.yourMethod();