Hello,
I am building a struts2-hibernate-mysql application. A user after
navigating through some pages reaches a pages where all the records on
the database are listed and can perform crud operations.
The jsp which iterates and displays the records is:
<%@ taglib prefix="s" uri="/struts-tags"%>
<p>Persons found on database</p>
<a href="<s:url action='adduser'/>">Add new User</a>
<s:if test="persons.size > 0">
<table>
<s:iterator value="persons">
<tr id="row_<s:property value="id"/>">
<td>
<s:property value="id" />
</td>
<td>
<s:property value="firstName" />
</td>
<td>
<s:property value="lastName" />
</td>
<td>
<s:url action="remove"
var="remURL">
<s:param name="id"
value="id" />
</s:url>
<a href="<s:property value
="remURL"/>">Remove</a>
</td>
<td>
<s:url action="edit"
var="editURL">
<s:param name="id"
value="id" />
</s:url>
<a href="<s:property value
="editURL"/>">Edit</a>
</td>
<td>
<a style="color: #FF0000"
href="Accounts">View account details</a>
</td>
</tr>
</s:iterator>
</table>
</s:if>
<a href="<s:url action='admin'/>">Back to Administrator's homepage</a>
---As you can see within the above jsp an "edit" link is generated for
every record and the record id is passed as a parameter to the URL,
with: <s:param name="id" value="id" />
When the user follows the "edit" link, the URL forms like this:
http://localhost/MyApp/edit.action?id=38
The record identifier is passed as a parameter in the URL: ?id=38
The link brings the user to a new form to perform a simple edit of the
record; first name and last name:
The jsp with the edit form is the following:
<%@ page contentType="text/html; charset=UTF-8" %>
<%@ taglib prefix="s" uri="/struts-tags" %>
<html>
<head>
<title>Update User</title>
<s:head/>
</head>
<body>
<h4>Edit information for selected user</h4>
<s:form action="save">
<s:textfield name="person.firstName"
value="%{person.firstName}" label="First Name"/>
<s:textfield name="person.lastName" label="Last Name"/>
<s:hidden name="person.id" value="#attr.id" label="Primary Key" />
<s:submit/>
</s:form>
</body>
</html>
The aim is to have the hidden field pre-filled with the value taken
from the URL parameter as soon as the user clicks on the "edit" link
and reaches the new form to update a record. Unfortunately so far I
have not been able to retrieve that parameter and use its value to
fill that texfield. The id value is always null.
The consequence is that the code performs a new insert instead of an
update, it sees the null id and assumes a new record must be inserted.
Could anyone perhaps provide some advice how can I solve this?
If required my struts.xml file is:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<constant name="struts.enable.DynamicMethodInvocation" value="false"/>
<constant name="struts.devMode" value="false"/>
<package name="default" namespace="/" extends="struts-default">
<action name="Menu">
<result>pages/firstpage.jsp</result>
</action>
<action name="user">
<result>pages/user/user_auth.jsp</result>
</action>
<action name="admin">
<result>pages/admin/admin_auth.jsp</result>
</action>
<action name="list" method="execute" class="org.user.PersonAction">
<result>/pages/list.jsp</result>
<result name="input">pages/list.jsp</result>
</action>
<action name="remove" method="remove" class="org.user.PersonAction" >
<result>/pages/list.jsp</result>
<result name="input">pages/list.jsp</result>
</action>
<action name="adduser">
<result>pages/user/Registration.jsp</result>
</action>
<action name="save" method="save" class="org.user.PersonAction" >
<result>/pages/list.jsp</result>
<result name="SUCCESS">pages/list.jsp</result>
</action>
<action name="edit">
<result>pages/user/UpdateAccountForm.jsp</result>
</action>
</package>
<include file="org/visitor/visitor.xml"/>
</struts>
-----And the action class is:
package org.user;
import java.util.List;
import java.util.Map;
//import javax.servlet.http.HttpServletRequest;
import org.apache.struts2.interceptor.ParameterAware;
import com.opensymphony.xwork2.Preparable;
import com.opensymphony.xwork2.Action;
public class PersonAction implements Preparable, ParameterAware{
private PersonService service = new PersonServiceImpl();
private List<Person> persons;
private Person person;
private Integer id;
private Map parameters;
public PersonAction(){}
public PersonAction(PersonService service) {
this.service = service;
}
public String execute() {
System.out.println("Inside execute method");
this.persons = service.findAll();
return Action.SUCCESS;
}
public String save() {
// HttpServletRequest request = (HttpServletRequest)
getServletContext.get("com.opensymphony.xwork2.dispatcher.HttpServletRequest");
Map map = getParameters();
id = (Integer)map.get("id");
System.out.println("In PersonAction rertieving request param "+id );
// parameters = this.getParameters();
// id = (Integer) parameters.get(id);
// person.setId(id);
System.out.println("In PersonAction before service.save");
this.service.save(person);
System.out.println("In PersonAction after service.save");
System.out.println("In PersionAction" + " " +
person.getFirstName()+" "+person.getLastName()+" "+person.getId());
return execute();
}
public String remove() {
service.remove(id);
return execute();
}
public List<Person> getPersons() {
return persons;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public void prepare() throws Exception {
if (id != null)
person = service.find(id);
}
public Person getPerson() {
return person;
}
public void setPerson(Person person) {
this.person = person;
}
public void setParameters(Map parameters) {
this.parameters=parameters;
}
public Map getParameters() {
return parameters;
}
}
---- I have also tried unsuccessfully to retrieve the parameter value
from the action code, but always get null. Also the delegate class
implementing the actual action methods is the following:
package org.user;
import java.util.List;
import org.hibernate.*;
import org.persist.util.*;
//import org.springframework.orm.hibernate3.support.OpenSessionInViewFilter;
//import org.springframework.web.context.ContextLoaderListener;
//import org.hibernate.transaction.JDBCTransactionFactory;
public class PersonServiceImpl implements PersonService {
Session session;
public PersonServiceImpl() {
session = HibernateUtil.getSessionFactory().getCurrentSession();
}
public void setSession(Session s){
this.session = s;
}
public Session getSession(){
if (session == null){
session = HibernateUtil.getSession();
}
return session;
}
@Override
public void clear() {
getSession().clear();
}
@Override
public Person find(int id) {
try {
getSession().beginTransaction();
Query q = session.createQuery("from Person p where
p.id=:id");
q.setInteger("id",id);
return (Person)q.uniqueResult();
}
finally {
//getSession().close();
}
}
@SuppressWarnings("unchecked")
@Override
public List<Person> findAll() {
try {
Session session = HibernateUtil.getSession();
session.beginTransaction();
Query q = session.createQuery("select p FROM Person p");
return q.list();
}
catch(Exception e){
System.out.print("Error while fetching "+e);
return null;
}
finally {
//session.close();
}
}
@Override
public void flush() {
getSession().flush();
}
@Override
public void remove(int id) {
Person person = find(id);
Session session = HibernateUtil.getSession();
Transaction tx = null;
if (person != null){
try {
tx = session.beginTransaction();
person =(Person)session.load(Person.class,id);
session.delete(person);
tx.commit();
}catch (RuntimeException e) {
if(tx != null) tx.rollback();
throw e;
} finally {
session.close();
}
}
}
@Override
public void save(Person person) {
Session session = HibernateUtil.getSession();
Transaction tx = session.beginTransaction();
try {
if (person.getId() == null) {
System.out.println("id = null, inside if
block");
session.persist(person);
System.out.println(person.getFirstName()+"
"+person.getLastName()+" "+person.getId());
} else {
System.out.println("id not null, inside else
block");
session.merge(person);
System.out.println(person.getFirstName()+"
"+person.getLastName()+" "+person.getId());
}
tx.commit();
} catch (RuntimeException e) {
if (tx.isActive()) tx.rollback();
throw e;
}
/*Session session = HibernateUtil.getSession();
System.out.println("1");
Transaction tx=null;
System.out.println("2");
if (person.getId() == null) {
System.out.println("3");
System.out.println(person.getFirstName()+"
"+person.getLastName()+"
"+person.getId());
try {
tx = session.beginTransaction();
session.persist(person);
System.out.println("4");
tx.commit();
System.out.println("5");
} catch (RuntimeException e) {
if(tx != null) tx.rollback();
System.out.println("6");
throw e;
}
} else {
System.out.println("7");
try {
tx = session.beginTransaction();
System.out.println("8");
session.merge(person);
System.out.println("9");
System.out.println(person.getFirstName()+"
"+person.getLastName()+" "+person.getId());
tx.commit();
} catch (RuntimeException e) {
if(tx != null) tx.rollback();
System.out.println("10");
throw e;
}
}*/
/*try {
tx = session.beginTransaction();
session.saveOrUpdate(person);
tx.commit();
} catch (RuntimeException e) {
if(tx != null) tx.rollback();
throw e;
} finally {
session.close();
}*/
}
}
---- Thank you in advance for any help on this situation.
Regards to everyone!
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]