BEST PRACTICES - Java By www.PPTSWorld.com Configuration Use global-forwards/results • Helps to avoid duplicate jsp files and redundancy forward mapping in all the actions in struts.xml – E.g Global error pages Success message pages. Base class • Have a Base class for each of the layers used • This will help – common operations need to be included in all the classes in each layer can be defined/implemented in the base class to reduce code redundancy E.g. Methods to read data from properties – Have base class implement multiple interfaces required, so that each subclass need not implement them. E.g. In struts2.0 base action class can implement multiple interfaces like SessionAware, ServletRequestAware, ServletResponseAware, ServletRequestAware, etc. Application start up servlet • Create a servlet class and have it invoked while application status up. • Include methods – – To load static data from data base which is frequently accessed. This will reduce the DB calls – To read properties from property file. This will eliminate the I/O operation, when ever a property value is need to be read and used. Exception handling • Define a Application level Exception handling mechanism, and configure struts global exception handler. • Don’t throw multiple exception to the calling method in other layer’s class (e.g. business class method calling a DAO class method) to handle, Instead wrap to a user defined Exception and re throw, so that the calling method need not to handle multiple exceptions and also it eliminates the layer coupling. • Don’t handle any exception other than in action layer Unless if you know what should be done on the exception condition (e.g it may call another business case on exception) • Don’t handle all the exception in action class, let global exception handle the exception and forward to common error page unless if you want to catch a specific exception and show custom error message to the user. Logging • Reduce unnecessary logger statements. More the logger statement lesser the performance • Avoid logging same date in multiple places of a single sequence in same class • Use appropriate logger level for logging information. • Don’t log each data in a separate logger statement instead concat and log them into a single logger statement. • Have maximum only one INFO level logger statement in layers other than DAO to identify data flow • DAO layer you method start time and end time can be in INFO. Java Server Pages • Use a global error page. • Always link to Actions, never to server pages. • Use the action attributes tag to avoid embedding Action extension. • Use s:url to reference HTML assets. • Use s:include to include pages Handle Duplicate Form Submission • The problem of duplicate form submission arises when a user clicks the Submit button more than once before the response is sent back. • Handle it by using the Token interceptor, tokenSession. This checks for valid token presence in action, stores the submitted data in session when handed an invalid token and prevents double submission. • Don’t use button type as submit while submitting a form thorough script to avoid duplicate form submit. Use html:messages (instead of html:errors) • For displaying error messages to the end user, use html:messages instead of html:errors Errors • To display the error messages of different categories, define these categories such as FATAL, ERROR, WARNING, or INFO, in an interface • In the Action or form-bean class, you can then use the following – errors.add("fatal", new ActionError("....")); or – errors.add("error", new ActionError("....")); or – errors.add("warning", new ActionError("....")); or – errors.add("information", new ActionError("....")); – saveErrors(request,errors); Errors (contd..) • To display them according to those categories, use the following code: <logic:messagePresent property="error"> <html:messages property="error" id="errMsg" > <bean:write name="errMsg"/> </html:messages> </logic:messagePresent > Or use: <logic:messagePresent property="error"> <html:messages property="error" id="errMsg" > showError('<bean:write name="errMsg"/>'); // JavaScript Function </html:messages> </logic:messagePresent > Common best practices • Use static methods for util class which contains commonly used util methods • Don’t hardcode any value instead use Constance. • Constance should be static final. • Have only one util class for an application • If server side validation is used for input values, then use separate util class for action layer to hold only the validation methods. Common best practices - (contd..) Where ever passable use switch case statement then if else Avoid iterating a collection multiple times Avoid executing DB call with in a loop. Don’t use static instance variable in action class (Struts 2.0) Action Classes should not implement complex business functionalities, rather delegate these to the Business/Service layer • Don’t use instance variable to store transactional data in spring Business Service class • Don’t use egger fetching (lazy=false) for one-to-many mapping in hibernate, instead use lazy fetching (lazy=true). • • • • • Common best practices - (contd..) • Don’t get hibernate session directly using session = getSession(); to execute query, instead use HibernateTemplate’s call back method. Common best practices - (contd..) Incorrect code Session session = getSession(); String sqlQuery = "SELECT * FROM employee"; Query query = session.createSQLQuery(sqlQuery); List list = query.list(); Correct Code String final sqlQuery = "SELECT * FROM employee"; List list = getHibernateTemplate().executeFind( new HibernateCallback(){ List list = null; public Object doInHibernate(Session session) throws HibernateException, SQLException{ Query query = session.createSQLQuery(sqlQuery); list = query.list(); return list; } } );