3 minute read

This is a blog on how I implemented webservices using the spring framework.
In part 1 we setup a simple spring web application. A simple contact
application which allows users to store names and addresses.
In part 2 we then extend it to a web services that displays the list of
contacts. With a simple console application to call this web service.
We assume you have already setup a working environment ie. eclipse setup
with tomcat.
Create a web application project in eclipse.

We will be using spring 3.1 so download it and extract the following
jars to WEB-INF/lib
org.springframework.aop-3.1.0.M1.jar
org.springframework.asm-3.1.0.M1.jar
org.springframework.aspects-3.1.0.M1.jar
org.springframework.beans-3.1.0.M1.jar
org.springframework.context-3.1.0.M1.jar
org.springframework.core-3.1.0.M1.jar
org.springframework.expression-3.1.0.M1.jar
org.springframework.jdbc-3.1.0.M1.jar
org.springframework.orm-3.1.0.M1.jar
org.springframework.transaction-3.1.0.M1.jar
org.springframework.web-3.1.0.M1.jar
org.springframework.web.servlet-3.1.0.M1.jar
Include the hibernate and database jars:
hibernate3.jar
hsqldb.jar
We will be using the embedded hsqldb database.

Add to web.xml
 <context-param>  
<param-name>log4jConfigLocation</param-name>
<param-value>/WEB-INF/log4j.properties</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>
</listener>
<!-- this looks for applicationContext.xml -->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!-- this looks for springwebapp-servlet.xml -->
<servlet>
<servlet-name>springwebapp</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springwebapp</servlet-name>
<url-pattern>*.htm</url-pattern>
</servlet-mapping>

springwebapp-servlet.xml
Use the XML schema style beans definition ie use:
 <beans xmlns:context="http://www.springframework.org/schema/context">http://www.springframework.org/schema/context"  
xmlns:mvc="http://www.springframework.org/schema/mvc">http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/mvc">http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd">http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd
http://www.springframework.org/schema/beans">http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://www.springframework.org/schema/context">http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-2.5.xsd">http://www.springframework.org/schema/context/spring-context-2.5.xsd">
<!-- We will be using annotations -->
<context:component-scan base-package="com.mycompany" />
<mvc:annotation-driven />
<bean id="viewResolver"
class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property
name="viewClass"><value>org.springframework.web.servlet.view.JstlView</value></property>
<property name="prefix"><value>/WEB-INF/jsp/</value></property>
<property name="suffix"><value>.jsp</value></property>
</bean>
<beans>

applicationContext.xml
 <!-- Setup hsqldb datasource -->  
<bean id="dataSource"
class="org.apache.commons.dbcp.BasicDataSource"
destroy-method="close">
<property name="driverClassName">
<value>org.hsqldb.jdbcDriver</value>
</property>
<property name="url">
<value>jdbc:hsqldb:mem:contactdb</value>
</property>
<property name="username">
<value>sa</value>
</property>
<property name="password">
<value></value>
</property>
</bean>
<!-- Hibernate sessionFactory -->
<bean id="sessionFactory"
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="mappingResources">
<list>
<value>com/mycompany/Contact.hbm.xml</value>
</list>
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">org.hibernate.dialect.HSQLDialect</prop>
<prop key="hibernate.show_sql">true</prop>
<prop key="hibernate.cglib.use_reflection_optimizer">true</prop>
<prop
key="hibernate.cache.provider_class">org.hibernate.cache.HashtableCacheProvider</prop>
<prop key="hibernate.hbm2ddl.auto">create</prop>
</props>
</property>
<property name="dataSource">
<ref bean="dataSource"/>
</property>
</bean>
<bean id="jdbcExceptionTranslator"
class="org.springframework.jdbc.support.SQLErrorCodeSQLExceptionTranslator">
<property name="dataSource"><ref bean="dataSource"/></property>
</bean>
<!-- Hibernate Template Defintion -->
<bean id="hibernateTemplate"
class="org.springframework.orm.hibernate3.HibernateTemplate">
<property name="sessionFactory"><ref bean="sessionFactory"/></property>
<property name="jdbcExceptionTranslator"><ref
bean="jdbcExceptionTranslator"/></property>
</bean>
<!-- Contact DAO Definition: Hibernate implementation -->
<!-- Just use the hibernateTemplate for saving and getting the objects -->
<bean id="contactDao" class="com.mycompany.dao.ContactDAOHibernate">
<property name="hibernateTemplate"><ref
bean="hibernateTemplate"/></property>
</bean>
<!-- Separate Business layer from DAO layer -->
<bean id="contactApp" class="com.mycompany.ContactAppImpl">
<property name="contactDao">
<ref bean="contactDao"/>
</property>
</bean>

java code
ContactAppController.java
 package com.mycompany.web;  
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.stereotype.Controller;
import com.mycompany.ContactApp;
@Controller
public class ContactAppController {
protected final Log logger = LogFactory.getLog(getClass());
String command;
@Autowired
ContactApp contactApp;
public ContactApp getContactApp() {
return contactApp;
}
public void setContactApp(ContactApp contactApp) {
this.contactApp = contactApp;
}
public String getCommand() {
return command;
}
public void setCommand(String command) {
this.command = command;
}
@RequestMapping(value="/listcontacts.htm")
public void listcontactsHandler(Model model) {
model.addAttribute("contactList",contactApp.getAllContacts());
}
@RequestMapping(value="/occupied.htm")
public @ResponseBody boolean isOccupiedHandler(@RequestParam String
email) {
logger.debug("inside isOccupiedHandler containsEmail is " +
contactApp.containsEmail(email));
return contactApp.containsEmail(email);
}
}

ContactDAOHibernate.java
 package com.mycompany.dao;  
import java.sql.SQLException;
import java.util.List;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.hibernate.HibernateException;
import org.hibernate.Query;
import org.hibernate.Session;
import org.springframework.orm.hibernate3.HibernateCallback;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
import com.mycompany.Contact;
public class ContactDAOHibernate extends HibernateDaoSupport implements
ContactDAO{
protected final Log logger = LogFactory.getLog(getClass());
public void insertContact(Contact contact) {
logger.debug("Inside ContactDAOHibernate.insert() method");
this.getHibernateTemplate().save(contact);
}
public List getContacts() {
logger.debug("Inside ContactDAOHibernate.getContacts() method");
return getHibernateTemplate().executeFind(new HibernateCallback() {
public Object doInHibernate(Session session)
throws HibernateException, SQLException {
StringBuffer sb = new StringBuffer(100);
sb.append("select distinct contact ");
sb.append("from Contact contact ");
sb.append("order by contact.contactId");
Query query = session.createQuery(sb.toString());
List list = query.list();
return list;
}
});
}
public Contact getContact(int contactId) {
logger.debug("Inside ContactDAOHibernate.getContact() method");
return (Contact)getHibernateTemplate().get(Contact.class,
contactId);
}
public void updateContact(Contact contact) {
logger.debug("Inside ContactDAOHibernate.updateContact() method");
this.getHibernateTemplate().update(contact);
}
public void deleteContact(int contactId) {
logger.debug("Inside ContactDAOHibernate.deleteContact() method");
this.getHibernateTemplate().delete(contactId);
}
}

ContactAppImpl.java
 package com.mycompany;  
import java.util.Collection;
import java.util.List;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import com.mycompany.dao.ContactDAO;
/**
* @author testuser
*
*/
public class ContactAppImpl implements ContactApp {
protected final Log logger = LogFactory.getLog(getClass());
private List<Contact> contactList;
private ContactDAO contactDao;
public ContactAppImpl() {
}
public List<Contact> getContactList() {
return contactList;
}
public void setContactList(List<Contact> contactList) {
this.contactList = contactList;
}
public ContactDAO getContactDao() {
return contactDao;
}
public void setContactDao(ContactDAO contactDao) {
this.contactDao = contactDao;
}
/* (non-Javadoc)
* @see com.sample.ContactApp#getContact(java.lang.String)
*/
public Contact getContact(String firstName) {
Contact c = new Contact();
c.setFirstName(firstName);
return c;
}
@Override
public List<Contact> getAllContacts() {
return contactDao.getContacts();
}
@Override
public void insertContacts(List<Contact> contactList) {
for (Contact c : contactList)
{
logger.debug("c firstname = " + c.getFirstName());
logger.info("Returning hello view firstname;" +
c.getFirstName());
contactDao.insertContact(c);
}
}
@Override
public int getNumberOfContacts() {
return contactList.size();
}
@Override
public void insertAcontact(Contact contact) {
contactDao.insertContact(contact);
}
@Override
public boolean containsEmail(String email) {
Collection<Contact> c = contactDao.getContacts();
for (Contact contact : c)
{
if (contact.getEmail().equals(email))
{
return true;
}
}
return false ;
}
}

Simple page to show that everything is working ok.
listcontacts.jsp
 <%@ page language="java" contentType="text/html; charset=UTF-8"  
pageEncoding="UTF-8"%>
<%@ include file="/WEB-INF/jsp/include.jsp" %>
<%@ include file="/WEB-INF/jsp/header.jsp" %>
<p>Show the contact list</p>
<c:forEach items="${contactList}" var="contact">
firstname: <c:out value="${contact.firstName}"/> lastname: <i><c:out
value="${contact.lastName}"/></i><br><br>
</c:forEach>
<%@ include file="/WEB-INF/jsp/footer.jsp" %>

Access page via http://localhost:8080/springwebapp/listcontacts.htm

Tags:

Updated:

Comments