just wanted to let you guy's know that i gave a small demo at my company
(10 employee's)
and it was successfully in that appfuse (struts, spring,hibernate) will
be the default for web applications.
tibi
ps here my demo: (based on the helloworld and crud examples from the site):
(hope not to much dutch)
mysql on with user root and password empty
else change pom.xml
http://appfuse.org/display/APF/AppFuse+QuickStart
mvn archetype:create -DarchetypeGroupId=org.appfuse
-DarchetypeArtifactId=appfuse-basic-struts
-DremoteRepositories=http://static.appfuse.org/repository
-DarchetypeVersion=1.0-m3 -DgroupId=nl.tibi.demo12 -DartifactId=demo12
cd demo12
[wijzig pom.xml voor database]
mvn integration-test
mvn war:inplace
rm -r src/main/webapp/WEB-INF/lib
rm src/main/webapp/WEB-INF/classes/struts.xml
mvn install eclipse:eclipse
[eclipse:file/import]
mvn jetty:run
==================
src/main/webapp/hello.jsp
hoi
==================
src/main/webapp/hello.jsp
<%@ include file="/common/taglibs.jsp"%>
<s:action name="wereld" id="action" namespace="default"/>
<strong>From struts:</strong>
<span style="color:blue"><s:property value="#action.message"/></span>
==================
src/main/java/nl/tibi/demo12/action/HelloAction.java
package nl.tibi.demo12.action;
import com.opensymphony.xwork2.ActionSupport;
public class HelloAction extends ActionSupport {
String message;
public String getMessage() {
return message;
}
public String execute() {
message = "hoi";
return SUCCESS;
}
}
=================
src/main/resources/struts.xml
<action name="wereld" class="nl.tibi.demo12.action.HelloAction"/>
========================================================================
src/main/java/nl/tibi/demo12/model/Person.java
package nl.tibi.demo12.model;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
@Entity
public class Person {
Long id;
String firstName;
String lastName;
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
public Long getId() {
return id;
}
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public void setId(Long id) {
this.id = id;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
}
========================================================================
src/main/java/nl/tibi/demo12/action/PersonAction.java
package nl.tibi.demo12.action;
import java.util.List;
import nl.tibi.demo12.model.Person;
import org.appfuse.service.GenericManager;
import org.appfuse.webapp.action.BaseAction;
public class PersonAction extends BaseAction {
GenericManager<Person, Long> manager;
Person person;
Long id;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public GenericManager<Person, Long> getManager() {
return manager;
}
public void setPersonManager(GenericManager<Person, Long> manager) {
this.manager = manager;
}
public Person getPerson() {
return person;
}
public void setPerson(Person person) {
this.person = person;
}
public String execute() {
if (id != null) {
person = manager.get(id);
}
return SUCCESS;
}
public String save() {
manager.save(person);
super.saveMessage("Person updated succesfully");
return "form";
}
}
========================================================================
src/main/resources/struts.xml
<action name="person" class="personAction">
<result>/WEB-INF/pages/person.jsp</result>
<result name="form" type="redirect">person.html</result>
</action>
========================================================================
src/main/webapp/WEB-INF/applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.0.xsd">
<!-- xmlns:tx="http://www.sprigfromework.org/schema/beans"-->
<bean
class="org.appfuse.dao.spring.HibernateExtensionPostProcessor">
<property name="annotatedClasses">
<list>
<value>nl.tibi.demo12.model.Person</value>
</list>
</property>
</bean>
<bean id="personManager"
class="org.appfuse.service.impl.GenericManagerImpl">
<constructor-arg>
<bean class="org.appfuse.dao.hibernate.GenericDaoHibernate"
autowire="byType">
<constructor-arg value="nl.tibi.demo12.model.Person" />
</bean>
</constructor-arg>
</bean>
<bean id="personAction" class="nl.tibi.demo12.action.PersonAction"
scope="prototype" autowire="default">
<property name="personManager" ref="personManager" />
</bean>
</beans>
========================================================================
src/main/webapp/WEB-INF/pages/person.jsp
<%@ include file="/common/taglibs.jsp"%>
<title>Hallo person</title>
<p>
veel plezier moet onderstaand formulier.
</p>
<s:form name="personForm" action="person" method="post" validate="true">
<s:hidden name="person.id" value="%{person.id}" />
<s:textfield label="First Name" name="person.firstName"
value="%{person.firstName}" required="true" cssClass="text
medium" />
<s:textfield label="Last Name" name="person.lastName"
value="%{person.lastName}" required="true" cssClass="text medium" />
<li class="buttenBar left">
<s:submit method="save" value="Save" cssClass="button" />
</li>
</s:form>
========================================================================
mvn jetty:run
========================================================================
src/main/webapp/WEB-INF/pages/person.jsp
<br/>
<div style="maring-top: 50px">
<s:action name="person!list" id="action" namespace="default" />
<strong>Current persons</strong>
<ul class="classList">
<s:iterator value="#action.persons">
<li>
<s:a href="person.html?id=%{id}">
<s:property value="firstName" />
<s:property value="lastName" />
</s:a>
</s:iterator>
</ul>
</div>
========================================================================
src/main/java/nl/tibi/demo12/action/PersonAction.java
private List persons;
public List getPersons() {
return persons;
}
public String list(){
persons = manager.getAll();
return SUCCESS;
}
========================================================================
src/main/webapp/WEB-INF/pages/person.jsp
<s:submit method="delete" value="Delete" cssClass="button" />
========================================================================
src/main/java/nl/tibi/demo12/action/PersonAction.java
public String delete() {
manager.remove(person.getId());
saveMessage(MessageFormat.format("{0} removed succesfully", person
.getFirstName()
+ ' ' + person.getLastName()));
return "form";
}
=========================================================================src/test/java/nl/tibi/demo12/PersonActionTest
package nl.tibi.demo12.action;
import nl.tibi.demo12.MyBaseManagerMockTestCase;
import nl.tibi.demo12.model.Person;
import org.appfuse.service.GenericManager;
import org.appfuse.service.impl.BaseManagerMockTestCase;
import org.appfuse.webapp.action.BaseActionTestCase;
import org.jmock.Mock;
public class PersonActionTest extends BaseActionTestCase {
private PersonAction personAction;
public void setPersonAction(PersonAction personAction) {
this.personAction = personAction;
}
public void testSave() throws Exception {
BaseManagerMockTestCase testManager = new
MyBaseManagerMockTestCaseDummy();
Mock mockManager = testManager.mock(GenericManager.class);
personAction.setPersonManager((GenericManager<Person, Long>)
mockManager.proxy());
Person person = new Person();
person.setFirstName("testFirstName");
person.setLastName("testLastName");
mockManager.expects(testManager.once()).method("save").with(testManager.eq(person));
personAction.setPerson(person);
String result = personAction.save();
assertEquals(result, "form");
}
}
=========================================================================
src/test/java/nl/tibi/demo12/MyBaseManagerMockTestCaseDummy
package nl.tibi.demo12;
import org.appfuse.service.impl.BaseManagerMockTestCase;
/**
* just for extending baseamangerMocktestCase which is abstract.
*
* @author tibi
*
*/
public class MyBaseManagerMockTestCaseDummy extends
BaseManagerMockTestCase {
}
=========================================================================src/test/java/nl/tibi/demo12/action/PersonManagerTest
src/test/java/nl/tibi/demo12/action/PersonManagerTest
package nl.tibi.demo12.action;
import nl.tibi.demo12.model.Person;
public class PersonManagerTest extends
AbstractTransactionalDataSourceSpringContextTests {
GenericManager<Person, Long> manager;
public void setPersonManager(GenericManager<Person, Long> manager) {
this.manager = manager;
}
protected String[] getConfigLocations() {
return new String[] {
"classpath*:/applicationContext-resources.xml",
"classpath*:/applicationContext-dao.xml",
"classpath*:/applicationContext-service.xml",
"/WEB-INF/applicationContext*.xml",
"/WEB-INF/security.xml" };
}
protected void onSetUpInTransaction() throws Exception {
deleteFromTables(new String[] { "Person" });
}
public void testGetUsers() {
Person person1 = new Person();
person1.setFirstName("test1firstname");
person1.setLastName("test1lastname");
Person person2 = new Person();
person2.setFirstName("test2firstname");
person2.setLastName("test2lastname");
manager.save(person1);
manager.save(person2);
assertEquals(2, manager.getAll().size());
}
}
========================================================================
src/test/resources/web-tests.xml
[replace]
<target name="run-all-tests"
depends="Login,Logout,PasswordHint,Signup,UserTests,FlushCache,FileUpload,PeopleTests"
description="Call and executes all test cases (targets)" />
<!-- runs people-related tests -->
<target name="PeopleTests" depends="AddPerson" description="Call and
executes all people test cases (targets)">
<echo>Successfully ran all People UI tests!</echo>
</target>
<target name="AddPerson">
<webtest name="addPerson">
&config;
<steps>
&login;
<invoke description="add person." url="/person.html" />
<setinputfield description="set first name"
name="person.firstName" value="tibor" />
<setinputfield description="set last name"
name="person.lastName" value="strausz" />
<clickbutton label="Save" description="Click the save
button" />
<verifytext description="succes message should be
displayed" text="Person updated succesfully" />
<verifytext description="user should be displayed on
screen" text="tibor.+strausz" regex="true" />
<clicklink description="try to delete made user"
label="tibor strausz" />
<clickbutton description="Click the delete button"
label="Delete" />
<verifytext description="succes message should be
displayed" text="tibor strausz removed succesfully" />
</steps>
</webtest>
</target>
=========================================================================
pom.xml
[change]
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>cobertura-maven-plugin</artifactId>
<version>2.0</version>
<configuration>
<instrumentation>
<excludes>
<exclude>nl/tibi/demo12/**/*Test.class</exclude>
</excludes>
</instrumentation>
</configuration>
</plugin>
=========================================================================
src/main/resources/nl/tibi/demo12/action/PersonAction-validation.xml
<!DOCTYPE validators PUBLIC "-//OpenSymphony Group//XWork Validator
1.0.2//EN"
"http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd">
<validators>
<field name="person">
<field-validator type="visitor">
<param name="appendPrefix">false</param>
<message/>
</field-validator>
</field>
</validators>
=========================================================================
src/main/resources/nl/tibi/demo12/model/Person-validation.xml
<!DOCTYPE validators PUBLIC "-//OpenSymphony Group//XWork Validator
1.0.2//EN"
"http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd">
<validators>
<field name="person.firstName">
<field-validator type="requiredstring">
<message key="errors.required"/>
</field-validator>
</field>
<field name="person.lastName">
<field-validator type="requiredstring">
<message key="errors.required"/>
</field-validator>
</field>
</validators>
=========================================================================
src/main/resources/struts.xml
<result name="input">/WEB-INF/pages/person.jsp</result>
=========================================================================
src/main/resources/ApplicationResources.properties
person.lastName=Person Lastname
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]