i am able to update the database so for each section a user saves it saves there work fine, in the correct column of the database, but what i am now trying to achieve is instead of saving into a new row, check there studentNumber and if it already has a record in the table (which it will have to to get this far ) update the columns to that record rather than starting a new one
how can i do that ?
currently this is my code :
this is the u.i. where they select the value and press submit
<p:spinner id="ajaxspinner80-100" value="#{editMarkingBean.markSectionTwo.markSectionTwo}"
stepFactor="1" min="80" max="100" disabled="#{formBean.number != 8}">
<p:ajax update="ajaxspinnervalue" process="#this" />
</p:spinner>
the save button
<p:commandButton action="#{editMarkingBean.markSectionTwo}" value="#{bundle.buttonSave}" update=":growl" icon="ui-icon-disk"/>
the backing bean is :
#Named(value = "editMarkingBean")
#ViewScoped
public class EditMarkingController {
private String searchString;
private String ordering;
private String criteria;
private String match;
private Date today;
private String caseMatch;
private int spinnerField;
private Marking markSectionOne;
private Marking studentNumber;
private Marking markSectionTwo;
private MarkingService markingService;
private Marking markToEdit;
#Inject
private MarkingFacade markingFacade;
#PostConstruct
public void init() {
//this.markToEdit = this.markingFacade.find(studentNumber);
this.markSectionTwo = new Marking();
}
public String markSectionTwo() {
this.markingFacade.edit(markSectionTwo);
this.setMessage("Mark Saved");
markSectionTwo = new Marking();
this.setMessage("Mark Saved");
// now navigating to the next page
return "/lecturer/marking/marking-section-three";
}
private void setMessage(String message) {
FacesContext fc = FacesContext.getCurrentInstance();
fc.addMessage(null, new FacesMessage(message, ""));
}
public Marking getMarkSectionTwo() {
return markSectionTwo;
}
public void setMarkSectionTwo(Marking markSectionTwo) {
this.markSectionTwo = markSectionTwo;
}
public String getSearchString() {
return searchString;
}
public void setSearchString(String searchString) {
this.searchString = searchString;
}
public String getOrdering() {
return ordering;
}
public void setOrdering(String ordering) {
this.ordering = ordering;
}
public String getCriteria() {
return criteria;
}
public void setCriteria(String criteria) {
this.criteria = criteria;
}
public String getMatch() {
return match;
}
public void setMatch(String match) {
this.match = match;
}
public Date getToday() {
return today;
}
public void setToday(Date today) {
this.today = today;
}
public String getCaseMatch() {
return caseMatch;
}
public void setCaseMatch(String caseMatch) {
this.caseMatch = caseMatch;
}
public int getSpinnerField() {
return spinnerField;
}
public void setSpinnerField(int spinnerField) {
this.spinnerField = spinnerField;
}
public Marking getMarkSectionOne() {
return markSectionOne;
}
public void setMarkSectionOne(Marking markSectionOne) {
this.markSectionOne = markSectionOne;
}
public Marking getStudentNumber() {
return studentNumber;
}
public void setStudentNumber(Marking studentNumber) {
this.studentNumber = studentNumber;
}
public MarkingService getMarkingService() {
return markingService;
}
public void setMarkingService(MarkingService markingService) {
this.markingService = markingService;
}
public MarkingFacade getMarkingFacade() {
return markingFacade;
}
public void setMarkingFacade(MarkingFacade markingFacade) {
this.markingFacade = markingFacade;
}
}
but currently only adds a new row with the data to the database rather than trying to merge it with the data already contained in the database for a student with a certain student number
how can i achieve this ? thanks guys for your help :)
EDIT :
I have tried :
private Marking markToEdit;
#Inject
private MarkingFacade markingFacade;
#PostConstruct
public void init() {
this.markToEdit = this.markingFacade.find(studentNumber);
//this.markSectionTwo = new Marking();
}
public String markSectionTwo() {
this.markingFacade.edit(markSectionTwo);
this.setMessage("Mark Saved");
// markSectionTwo = new Marking();
//this.setMessage("Mark Saved");
// now navigating to the next page
return "/lecturer/marking/marking-section-three";
}
but get the error :
exception
javax.servlet.ServletException: WELD-000049 Unable to invoke public void sws.control.EditMarkingController.init() on sws.control.EditMarkingController#4109691f
root cause
org.jboss.weld.exceptions.WeldException: WELD-000049 Unable to invoke public void sws.control.EditMarkingController.init() on sws.control.EditMarkingController#4109691f
root cause
java.lang.reflect.InvocationTargetException
root cause
javax.ejb.EJBException
root cause
java.lang.IllegalArgumentException: An instance of a null PK has been incorrectly provided for this find operation.
I use a quite similar approach as yours, but with different names. I'll post it here, so I think you can have some idea.
My way is to check the entity explicitly before merging it.
My JSF CRUD looks like this
xhtml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:p="http://primefaces.org/ui">
<h:head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>DataSource Manager</title>
</h:head>
<h:body>
<h:form id="ds">
<p:spacer height="10" />
<p:fieldset legend="Insert/Edit Data Source">
<p:panel id="insertUpdateForm">
<h:panelGrid columns="2">
<p:outputLabel for="name" value="Data Source Name:" style="width:100px;"/>
<p:inputText id="name" value="#{dataSourceMB.dataSource.name}"/>
<p:outputLabel for="user" value="User:" style="width:100px;"/>
<p:inputText id="user" value="#{dataSourceMB.dataSource.user}"/>
<p:outputLabel for="driver" value="Driver:" style="width:100px;"/>
<p:inputText id="driver" value="#{dataSourceMB.dataSource.driver}" />
</h:panelGrid>
</p:panel>
<p:panel>
<p:commandButton value="Save" action="#{dataSourceMB.saveDataSource}" update="dsList,insertUpdateForm" />
<p:commandButton value="Clear" action="#{dataSourceMB.clearDataSource}" update="insertUpdateForm" />
<p:commandButton value="Test Connection" action="#{dataSourceMB.testConnection}"/>
</p:panel>
</p:fieldset>
<p:spacer height="10" />
<p:fieldset legend="Data Sources">
<p:panel>
<p:dataTable
var="ds"
value="#{dataSourceMB.listDataSources}"
paginator="true" rows="10"
paginatorTemplate="{RowsPerPageDropdown} {FirstPageLink} {PreviousPageLink} {CurrentPageReport} {NextPageLink} {LastPageLink}"
rowsPerPageTemplate="10,50,100"
id="dsList">
<p:column headerText="ID">
<h:outputText value="#{ds.id}" />
</p:column>
<p:column headerText="Name">
<h:outputText value="#{ds.name}" />
</p:column>
<p:column headerText="JDBC">
<h:outputText value="#{ds.jdbc} " />
</p:column>
<!-- check http://jqueryui.com/themeroller/ for icons -->
<p:column headerText="" style="width:2%">
<p:commandButton icon="ui-icon-pencil" action="#{dataSourceMB.editDataSource}" title="Edit" update=":ds:insertUpdateForm">
<f:setPropertyActionListener value="#{ds}" target="#{dataSourceMB.selectedDataSource}" />
</p:commandButton>
</p:column>
<p:column headerText="" style="width:2%">
<p:commandButton icon="ui-icon-trash" action="#{dataSourceMB.removeDataSource}" title="Remove" update=":ds:insertUpdateForm,dsList">
<f:setPropertyActionListener value="#{ds}" target="#{dataSourceMB.selectedDataSource}" />
</p:commandButton>
</p:column>
</p:dataTable>
</p:panel>
</p:fieldset>
</h:form>
</h:body>
</html>
my managed bean
import java.io.Serializable;
import java.util.List;
import javax.annotation.PostConstruct;
import javax.ejb.EJB;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import org.apache.log4j.Logger;
import DataSourceEJB;
import JSFUtilEJB;
import DataSource;
#ManagedBean
#ViewScoped
public class DataSourceMB implements Serializable {
private static final long serialVersionUID = 871363306742707990L;
private static Logger log = Logger.getLogger(DataSourceMB.class);
#EJB
private JSFUtilEJB jsfUtilEJB;
#EJB
private DataSourceEJB dataSourceEJB;
private DataSource dataSource;
private DataSource selectedDataSource;
private List<DataSource> listDataSources;
#PostConstruct
public void init() {
try {
this.dataSource = new DataSource();
this.listDataSources = this.dataSourceEJB.listDataSources();
} catch (Exception e) {
jsfUtilEJB.addErrorMessage(e,"Could not list");
}
}
public void removeDataSource(){
try {
this.dataSourceEJB.removeDataSource(this.selectedDataSource);
jsfUtilEJB.addInfoMessage("Removed "+this.selectedDataSource.getName());
if (this.dataSource != null && this.dataSource.getId() != null && this.dataSource.getId().equals(this.selectedDataSource.getId())){
this.dataSource = null;
}
this.listDataSources = this.dataSourceEJB.listDataSources();
} catch (Exception e) {
jsfUtilEJB.addErrorMessage(e,"Could not remove");
}
}
public void saveDataSource(){
try {
this.dataSourceEJB.saveDataSource(this.dataSource);
jsfUtilEJB.addInfoMessage("Saved "+this.dataSource.getName());
this.dataSource = new DataSource();
this.listDataSources = this.dataSourceEJB.listDataSources();
} catch (Exception e) {
jsfUtilEJB.addErrorMessage(e,"Could not save");
}
}
public void editDataSource(){
this.dataSource = this.selectedDataSource;
}
public void clearDataSource(){
this.dataSource = new DataSource();
}
public DataSource getDataSource() {
return dataSource;
}
public void setDataSource(DataSource dataSource) {
this.dataSource = dataSource;
}
public DataSource getSelectedDataSource() {
return selectedDataSource;
}
public void setSelectedDataSource(DataSource selectedDataSource) {
this.selectedDataSource = selectedDataSource;
}
public List<DataSource> getListDataSources() {
return listDataSources;
}
public void setListDataSources(List<DataSource> listDataSources) {
this.listDataSources = listDataSources;
}
}
my EJB
import java.io.IOException;
import java.sql.SQLException;
import java.util.List;
import javax.ejb.Stateless;
import javax.inject.Inject;
import DataSource;
#Stateless
public class DataSourceEJB {
#Inject
private BaseService baseService;
public List<DataSource> listDataSources() {
return this.baseService.getDataSourceDAO().getAll();
}
public void removeDataSource(DataSource ds) throws Exception {
DataSource a = this.baseService.getDataSourceDAO().find(ds.getId());
this.baseService.getDataSourceDAO().delete(a);
}
public void saveDataSource(DataSource ds) throws Exception {
DataSource a = this.baseService.getDataSourceDAO().find(ds.getId());
if (a == null){
this.baseService.getDataSourceDAO().add(ds);
}else{
this.baseService.getDataSourceDAO().edit(ds);
}
}
public DataSource getById(long id) {
return this.baseService.getDataSourceDAO().find(id);
}
public DataSource getByName(String name) {
return this.baseService.getDataSourceDAO().findByName(name);
}
}
DAO
public E find(Long id) {
return (E)entityManager.find(clazz, id);
}
public void add(E entity) throws Exception {
entityManager.persist(entity);
}
public E edit(E entity) throws Exception {
return entityManager.merge(entity);
}
public void delete(E entity) throws Exception {
entityManager.remove(entity);
}
Related
So this is my first time building an Java EE application. I watched a lot of tutorials but most of them are using eclipse.
So the problem is this:
<h:panelGroup layout="block">
<p:commandButton ajax="false" action="#{loginBean.login()}"
styleClass="btn btn-info" value="Login" />
</h:panelGroup>
When I start Wildfly server and try to access the login page. If there are no
brackets after the login method I get:
The class 'LoginBean' does not have the property login.
If I try it with the brackets. The method is invoked when page is initialized and I get exception that the values for username and pass are null.
When I commented the method content I got the page to initialize properly, but another issue occured.
The JSF components like:
<h:panelGroup>
<h3 class="loginTitle">#{msgs['default.title']}</h3>
</h:panelGroup>
Are rendered correctly, but the Primefaces components
<h:panelGroup layout="block">
<p:inputText value="#{loginBean.username}" id="username"
styleClass="loginInputField" required="true"
requiredMessage="Username is required field">
<p:watermark for="username" value="Username" />
</p:inputText>
</h:panelGroup>
Are rendered with 0px height and width.
Here is my LoginBean.java
public class LoginBean implements Serializable {
private static final String SUCCESS_LOGIN_REDIRECT = "/pages/success?faces-redirect=true";
private static final String LOGIN_PAGE_REDIRECT = "/pages/login?faces-redirect=true";
private static final long serialVersionUID = 1L;
#Inject
private HttpServletRequest request;
private String username;
private String password;
#PostConstruct
public void init() {
//TODO
}
public String login() {
username = "";
password = "";
if(StringUtils.isBlank(username) || StringUtils.isBlank(password)) {
FacesContext.getCurrentInstance().addMessage(null, new FacesMessage("Invalid Credentials"));
return "";
} else if ("admin".equals(username) && "123".equals(password)) {
request.getSession().setAttribute("LOGGED_USER", username);
return SUCCESS_LOGIN_REDIRECT;
}
MessageUtils.addErrorMessage("login.error.invalid.credentials");
return "";
}
public String logout() {
request.getSession().invalidate();
return LOGIN_PAGE_REDIRECT;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
And last here is my project structure https://github.com/M-Veselinov/Java-EE
I think that I'm doing something wrong with web.xml or other config files, but I have no idea what.
I'll appreciate some help. Thanks.
Client Source:
<p:inputtext id="username" styleclass="loginInputField" required="true" requiredmessage="Username is required field">
<p:watermark for="username" value="Username"></p:watermark>
</p:inputtext>
I am trying to upload a file (picture) which is part of a Product object to a database. The file upload is successful according to the jsf confirmation. However, when persisting Product the persistence is completed successfully without the picture. The server is not returning any stack.
This is my form (simplified):
<h:form enctype="multipart/form-data">
<h1><h:outputText value="Create New Product"/></h1>
<h:panelGrid columns="2">
<h:outputLabel value="Name:" for="name" />
<h:inputText id="name" value="#{productController.product.name}" title="Name" />
<h:outputLabel value="Description:" for="description" />
<h:inputText id="description" value="#{productController.product.description}" title="Description" />
<h:outputLabel value="Price:" for="price" />
<h:inputText id="price" value="#{productController.product.price}" title="Price" />
<h:outputLabel value="Category:" for="category_fk" />
<h:selectOneMenu id="category_fk" value="#{productController.product.category_fk}"
converter="#{categoryConverter}" title="Category_fk" >
<f:selectItems value="#{productController.categoryList}" var="prodCat"
itemValue="#{prodCat}" itemLabel="#{prodCat.name}"/>
</h:selectOneMenu>
<p:fileUpload fileUploadListener="#{productController.handleFileUpload}" update="msg" auto="true" />
<p:growl id="msg" showDetail="true"/>
<h:inputHidden id="dateAdded" value="#{productController.product.dateAdded}">
<f:convertDateTime pattern="yyyy/MM/dd HH:mm:ss" />
</h:inputHidden>
</h:panelGrid>
<h:commandButton value="Create Product" action="#{productController.doCreateProduct()}"/>
</h:form>
This the product Controller (Simplified):
#ManagedBean
#RequestScoped
public class ProductController {
#EJB
private ProductEJB productEjb;
#EJB
private CategoryEJB categoryEjb;
private Product product = new Product();
private List<Product> productList = new ArrayList<Product>();
private Category category;
private List<Category> categoryList = new ArrayList<Category>();
// -------------------------------------------------------- Business Methods
public String doCreateProduct()
{
product = productEjb.createProduct(product);
productList = productEjb.findAllProducts();
return "listProduct?faces-redirect=true";
}
public String doDeleteProduct()
{
productEjb.deleteProduct(product);
return "listProduct?faces-redirect=true";
}
public String cancelDeleteAction()
{
return "listProduct?faces-redirect=true";
}
// Update product listing
public void preRenderView()
{
if(product == null)
{
product = new Product();
}
}
public String doUpdateProduct()
{
if(product.getProduct_id() != 0)
{
productEjb.updateProduct(product);
}
else
{
productEjb.createProduct(product);
}
//addFlashMessage("Product " + product.getName() + " (" + product.getProduct_id() + ") has been updated");
return "listProduct?faces-redirect=true";
}
public void handleFileUpload(FileUploadEvent event)
{
byte[] uploadedFile = new byte[event.getFile().getContents().length];
System.arraycopy(event.getFile().getContents(), 0, uploadedFile, 0, event.getFile().getContents().length);
product.setImageFile(uploadedFile);
FacesMessage msg = new FacesMessage("Succesful", event.getFile().getFileName() + "is uploaded.");
FacesContext.getCurrentInstance().addMessage(null, msg);
}
#PostConstruct
public void init()
{
categoryList = categoryEjb.findAllCategory();
productList = productEjb.findAllProducts();
}
This is the product entity(Simplified):
#Entity
#NamedQueries({
#NamedQuery(name="findAllProducts", query = "SELECT p from Product p")
})
public class Product implements Serializable
{
private static final long serialVersionUID = 1L;
#Id #GeneratedValue(strategy= GenerationType.AUTO)
private int product_id;
private String name;
private String description;
#Lob
#Column(name="imageFile")
protected byte[] imageFile;
private Float price;
#Temporal(TemporalType.TIMESTAMP)
private Date dateAdded;
#ManyToOne
private Category category_fk;
#OneToOne(mappedBy = "product_fk")
private SaleDetails saleDetails_fk;
SOLUTION:
I changed the scope of the managed bean to:
#ViewScope
Fileupload happens in a first request.
When form is submited with the input data, a new 2nd request will be initiated. A new requestScoped ManagedBean will be created, that doesnt know about the previous fileupload.
To allow the two requests to share the same Managedbean, Change the scope to:
#ViewScoped
Error: inconvertible types
my loginAction file's code:
public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response) throws Exception
{
LoginForm loginForm = (LoginForm) form;
if (loginForm.getUserName().equals(loginForm.getPassword()))
{
return mapping.findForward(SUCCESS);
}
else
{
return mapping.findForward(FAILURE);
}
}
my struts-config file's code:
<action-mappings>
<action input="/login.jsp" name="LoginForm" path="/Login" scope="session" type="com.strutsmyaction.LoginAction">
<forward name="success" path="/success.jsp" />
<forward name="failure" path="/failure.jsp" />
</action>
</action-mappings>
my loginform file's code
public class LoginForm
{ String userName; String password;
public String getUserName() {
System.out.println("Inside getter "+userName);
return userName;
}
public void setUserName(String userName) {
System.out.println("Inside setter "+userName);
this.userName = userName;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
I think This will work ..
if (loginForm.getUserName().equals(loginForm.getPassword()))
{
return mapping.findForward("success");
}
else
{
return mapping.findForward("failure");
}
I'm searching since one week and couldn't find a proper solution for my problem. So I'm asking the experts here.
I'm trying to implement a page with FileUpload to upload and show the images after upload on same page.
my problem is, if I set my ManagedBean to #RequestScope, the handleFileUpload function will not be triggered.
If I set it to #ViewScope, the function will be triggered but the error "Error in streaming dynamic resource." is shown.
here are my files:
web.xml
<filter>
<filter-name>PrimeFaces FileUpload Filter</filter-name>
<filter-class>org.primefaces.webapp.filter.FileUploadFilter</filter-class>
<init-param>
<param-name>thresholdSize</param-name>
<param-value>2097152</param-value>
</init-param>
<init-param>
<param-name>uploadDirectory</param-name>
<param-value>E:/uploadedImages</param-value>
</init-param>
PrimeFaces FileUpload Filter
Faces Servlet
Bean
#ManagedBean
#RequestScoped
public class ImageManager implements Serializable {
private final static int MAX_UPLOADED_FILES = 5;
private final static String UPLOADED_FILES_PATH = "E:/uploadedImages";
private final Map<UUID, UploadedFile> uploadedFiles = new HashMap<>();
public List<String> getListImages() {
final List<String> result = new ArrayList<>();
for (final UUID uuid : uploadedFiles.keySet())
result.add(uuid.toString());
return result;
}
public StreamedContent getImage() {
final ExternalContext externalContext = FacesContext.getCurrentInstance().getExternalContext();
final String imageId = (String) externalContext.getRequestMap().get("imageId");
if (imageId != null) {
final UUID imageIndex = UUID.fromString(imageId);
return new DefaultStreamedContent(new ByteArrayInputStream(uploadedFiles.get(imageIndex).getContents()), "image/jpg");
}
return null;
}
public void handleFileUpload(FileUploadEvent event) {
if (uploadedFiles.size() < MAX_UPLOADED_FILES) {
final UploadedFile uploadedFile = event.getFile();
if (uploadedFile != null) {
uploadedFiles.put(UUID.randomUUID(), uploadedFile);
}
}
}
}
xhtml
<p:fileUpload fileUploadListener="#{imageManager.handleFileUpload}"
mode="advanced"
multiple="true"
sizeLimit="2097152"
allowTypes="/(\.|\/)(gif|jpe?g|png)$/"
uploadLabel="Hochladen"
auto="false"
cancelLabel="Abbrechen"
invalidFileMessage="Die ausgewählte Datei ist kein zugelassene Bilddatei"
invalidSizeMessage="Die maximale Bildgröße ist 2MB"
label="Datei Auswählen"
update="imageList"
/>
<ui:repeat value="#{imageManager.listImages}" var="imageId" id="imageList">
<h:outputText value="#{imageId}" />
<p:graphicImage value="#{imageManager.image}">
<f:param id="imageId" name="imageId" value="#{imageId}" />
</p:graphicImage>
</ui:repeat>
#Daniel, blieve me. I've searched many days before I post my question here. But I have resolved the Problem by myself.
here is the solution in case that somebody has the same problem:
#Controller
#Scope(WebApplicationContext.SCOPE_REQUEST)
public class ImageManager implements Serializable {
private final static int MAX_UPLOADED_FILES = 5;
private final static String UPLOADED_FILES_PATH = "E:/uploadedImages";
private final static Map<UUID, UploadedFile> uploadedFiles = new HashMap<>();
private final static List<String> listImages = new ArrayList<>();
private StreamedContent image;
private static StreamedContent defaultImage = null;
static {
try {
defaultImage = new DefaultStreamedContent(new FileInputStream(new File("E:\\uploadedImages\\t.jpg")), "image/jpg");
}
catch (FileNotFoundException e) {
e.printStackTrace();
}
}
public List<String> getListImages() {
return listImages;
}
public StreamedContent getImage() {
final ExternalContext externalContext = FacesContext.getCurrentInstance().getExternalContext();
final String imageId = (String) externalContext.getRequestParameterMap().get("imageId");
if (imageId != null) {
final UUID imageIndex = UUID.fromString(imageId);
image = new DefaultStreamedContent(new ByteArrayInputStream(uploadedFiles.get(imageIndex).getContents()), "image/jpg");
return image;
}
return defaultImage;
}
public void handleFileUpload(FileUploadEvent event) {
if (uploadedFiles.size() < MAX_UPLOADED_FILES) {
final UploadedFile uploadedFile = event.getFile();
if (uploadedFile != null) {
final UUID uuid = UUID.randomUUID();
uploadedFiles.put(uuid, uploadedFile);
listImages.add(uuid.toString());
}
}
}
public void setImage(StreamedContent image) {
this.image = image;
}
}
I was learning Struts 1.1 and trying to do some form validation with my code.
But the errors that I had described in the MessageResources.properties file do not get displayed on the JSP. I tried a lot of options but couldn't get it off the ground. I have attached some of the code.
MessageResources.properties
error.name.required = Please mention your name.
error.email.incorrect = You E-Mail ID is Incorrect.
error.phone.numericError = Phone number should consist only of digits.
error.phone.lengthIncorrect = Phone number should be only of 10 digits.
struts-config.xml
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.1//EN"
"http://jakarta.apache.org/struts/dtds/struts-config_1_1.dtd">
<struts-config>
<form-beans>
<form-bean name="detailsForm" type="com.example.form.DetailsForm"/>
</form-beans>
<action-mappings>
<action input="/detailsEntry.jsp" name="detailsForm" path="/DetailsForm" type="com.example.action.DetailsAction" validate="true">
<forward name="success" path="/displayDetails.jsp"/>
<forward name="failure" path="/failure.jsp"/>
</action>
</action-mappings>
</struts-config>
Form Class:
package com.example.form;
import javax.servlet.http.HttpServletRequest;
import org.apache.struts.action.ActionError;
import org.apache.struts.action.ActionErrors;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.action.ActionMessage;
import org.apache.struts.action.ActionMessages;
public class DetailsForm extends ActionForm {
private String name;
private String email;
private String phone;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
#Override
public void reset(ActionMapping mapping, HttpServletRequest request) {
this.name = null;
this.email = null;
this.phone = null;
}
#Override
public ActionErrors validate(ActionMapping mapping,
HttpServletRequest request) {
ActionErrors actionErrors = new ActionErrors();
if (this.name.equals(null) || this.name.length() == 0) {
actionErrors.add("name", new ActionError("error.name.required"));
}
return actionErrors;
}
private boolean isNumeric(String phoneNumber) {
try {
Integer.parseInt(phoneNumber);
return true;
}
catch (NumberFormatException numberFormatException) {
return false;
}
}
}
The default resource filename is ApplicationResources.properties.
Using a different (or multiple) resource files requires configuration in struts-config.xml:
<message-resource parameter="MessageResources" null="false" />
Don't forget to add the following to your jsp:
<html:errors />
Your error messages will appear where ever you put this tag on on your jsp.
And if you want your error message to be displayed next to the field they relates to then use the following:
<html:errors property="custName" />
where "custName" is the name you gave the error message when you created it in your form ex:
ActionMessages errors = new ActionMessages();
errors.add("custName", new ActionMessage("custName.invalid"));
request.setAttribute(Globals.ERROR_KEY, errors);