如何将自动弹簧服务转换为jsp?

时间:2016-06-22 21:36:01

标签: jsp spring-mvc autowired

如标题中所述,我需要在我的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 选项..

感谢您的任何建议..

5 个答案:

答案 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();