Tuesday, December 05, 2006

Data Access with Spring and Struts: Part 1

The struts pagination post contained an example of using Hibernate for data access too. In this post, I use the same example to implement the same pagination example using Spring. In this part we will see how to get a struts application ready for spring, the next part describes how to implement data access in spring. Follow these steps to run the example.
  1. Start with the struts-blank application
  2. Create the search.jsp file
    <%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%>
    <%@ taglib uri="http://struts.apache.org/tags-bean" prefix="bean"%>
    <%@ taglib uri="http://struts.apache.org/tags-html" prefix="html"%>
    <%@ taglib uri="http://struts.apache.org/tags-logic" prefix="logic"%>
    <%@ taglib uri="http://displaytag.sf.net" prefix="display"%>
    <%@ page import="beans.Employee,business.Sorter,java.util.List,org.displaytag.tags.TableTagParameters,org.displaytag.util.ParamEncoder"%>
    <html:html>
    <head>
    <title>Search page</title>
    <link rel="stylesheet" type="text/css"
    href="/StrutsPaging/css/screen.css" />
    </head>
    <body bgcolor="white">
    <html:form action="/search.do">
    <table>
    <tr>
    <td>Minimum Salary:</td>
    <td><html:text property="minSalary"></html:text></td>
    </tr>
    <tr>
    <td colspan="2"><html:submit property="submit" /></td>
    </tr>
    </table>
    </html:form>
    <logic:notEqual name="empList" value="null">
    <jsp:scriptlet>
    if (session.getAttribute("empList") != null) {
    String sortBy = request.getParameter((new ParamEncoder("empTable")).encodeParameterName(TableTagParameters.PARAMETER_SORT));
    Sorter.sort((List) session.getAttribute("empList"), sortBy);
    }
    </jsp:scriptlet>

    <display:table name="sessionScope.empList" pagesize="4" id="empTable" sort="external" defaultsort="1" defaultorder="ascending" requestURI="">
    <display:column property="empId" title="ID" sortable="true" sortName="empId" headerClass="sortable" />
    <display:column property="empName" title="Name" sortName="empName" sortable="true" headerClass="sortable" />
    <display:column property="empJob" title="Job" sortable="true" sortName="empJob" headerClass="sortable" />
    <display:column property="empSal" title="Salary" sortable="true" headerClass="sortable" sortName="empSal" />
    </display:table>
    </logic:notEqual>
    </body>
    </html:html>
    pages/search.jsp
  3. Create the Action class:
    public class SearchAction extends Action {
    private BusinessInterface businessInterface;
    public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse httpservletresponse) throws Exception {
    if (form == null) {
    return mapping.findForward("success");
    }
    try {
    SearchForm searchForm = (SearchForm) form;
    if (searchForm.getMinSalary() == null || searchForm.getMinSalary().equals("")) {
    return mapping.findForward("success");
    }
    long minSal = Long.parseLong(searchForm.getMinSalary());
    System.out.println("Business Interface: " + businessInterface);
    List data = businessInterface.getData(minSal);
    System.out.println("Data : " + data);
    request.getSession().setAttribute("empList", data);

    } catch (Exception e) {
    e.printStackTrace();
    }
    return mapping.findForward("success");
    }

    public void setBusinessInterface(BusinessInterface bi) {
    businessInterface = bi;
    }
    }
    SearchAction.java

    Note that the action class has a property businessInterface. This property will be set by spring when loading the action class.
  4. Define the form and action beans in struts-config.xml
    <form-beans>
    <form-bean name="searchForm" type="forms.SearchForm" />
    </form-beans>
    <action-mappings>
    <action path="/Welcome" forward="/pages/Welcome.jsp" />
    <action name="searchForm" path="/search" scope="session" type="org.springframework.web.struts.DelegatingActionProxy">
    <forward name="success" path="/pages/search.jsp"></forward>
    </action>
    </action-mappings>
    Note that, in the action-mapping, the action type is defined as "org.springframework.web.struts.DelegatingActionProxy". This will ensure that Spring will take care of handling struts actions.

  5. Integrate Struts And Spring: The final step of integration is to add a spring plugin to struts-config.xml. The plugin defines the location of the spring bean-factory definitions.
    <plug-in className="org.springframework.web.struts.ContextLoaderPlugIn">
    <set-property property="contextConfigLocation"
    value="/WEB-INF/applicationContext.xml"/>
    </plug-in>
    This is one way of integrating struts and spring, for other ways of integration, refer to : Get a better handle on Struts actions, with Spring
Continue to part 2 of "Data access with spring and struts".

10 comments:

  1. do you have any idea of integrating struts with spring 2... i mean is theare any proxy class for Spring2. The example you have given is for Spring 1.x

    ReplyDelete
  2. This example was implemented on Spring 2.0.1.

    ReplyDelete
  3. Hi, Im having some problems while trying to use Spring AOP with Struts Actions, and I wonder if you could help me?

    Im using spring 2.0.4, and struts 1.3, I dont know if that makes any difference?

    So my struts-config is something like this:
    ....
    < action-mappings>
    < action path="/prueba"
    type="org.springframework.web.struts.DelegatingAct ionProxy"
    scope="request" validate="false" parameter="cmd">
    < /action>
    < /action-mappings>

    < plug-in className="org.springframework.web.struts.ContextL oaderPlugIn">
    < set-property property="contextConfigLocation"
    value="WEB-INF/classes/applicationContext.xml"/>
    < /plug-in>
    ..

    And my bean definition is:

    ....
    < bean name="/prueba" scope="prototype" autowire="byName"
    class="prueba.integracion.PruebaAction" />

    < aop:aspectj-autoproxy proxy-target-class="true" />
    ...

    The error Im getting is org.springframework.beans.factory.BeanNotOfRequire dTypeException, Bean named '/prueba' must be of type [org.apache.struts.action.Action], but was actually of type [$Proxy6]

    Im a bit stuck with this, so Id appreciatte any help.

    Thanks

    ReplyDelete
  4. Try in struts instead this:

    &gt action path="/prueba"
    type="org.springframework.web.struts.DelegatingAct ionProxy"
    scope="request" validate="false" parameter="cmd"&lt


    something like this(without DelegatingAct ionProxy):

    &gtaction path="/edit" name="inputForm"
    type="example.action.ViewAction" validate="false" scope="request"
    parameter="op"&lt
    &gtforward name="list" path="/jsp/index.jsp" /&lt
    &ltforward name="add" path="/jsp/input.jsp" /&gt
    &lt/action&gt

    and add:
    &ltcontroller&gt
    &ltset-property property="processorClass"
    value="org.springframework.web.struts.DelegatingRequestProcessor" /&gt
    &lt/controller&gt

    ReplyDelete
  5. From the tons of comments on your articles, Thank you.

    ReplyDelete
  6. So wonderful to discover somebody with some original thoughts on this topic.

    ReplyDelete
  7. We actually installed a roof on one of their homes in Texas! Great guys.

    ReplyDelete
  8. Appreciating the time and effort you put into your site and detailed information you offer.

    ReplyDelete
  9. As a marketing communications student, thank you!!

    ReplyDelete
  10. Your post is very interesting to me. Reading was so much fun.

    ReplyDelete

Popular Posts