I can add my 2 cents from my own experiences (although its more of a compilation of development best practises, you might find it useful to keep them in mind while designing your application):
- There is no one-size-fits-all design
- Try to keep application as light weight as possible.
- Use Maven/Gradle to manage dependencies
- Don't rely excessively on IDE. Make sure your project builds without IDE (If you are using maven/gradle, It will :) Try to open you project with IDEA, Netbeans and Eclipse.
- For the technologies mentioned above, appfuse makes a good starting point.
- Design your database/entities first
- Use libraries sensibly and judiciously. Do NOT overuse them.
- Dont forget to write JUnit/TestNG (at least for service layer)
- Test application on all major browsers (not just your favorite one :)
- Determine how many total users and how many concurrent users your web app will have.
- Then decide whether you need caching or not.
- you will use app server clustering or not.
- Select the application server based on its capabilities and more importantly 'your needs'
- Tomcat / Jetty are absolutely fine for most of the cases
- Avoid using any app-server specific api
- Use JPA interfaces/annotations even if using hibernate as JPA implementation
- Be extra cautious while mapping relationships in entities. Decide which properties and relationships will load lazily and which will load eagerly
- Keep application security in mind while designing the app. Spring security is excellent choice.
- Never abuse HttpSession. Dont store too much in it.
- Keep entities Serializable. Enforce developers to use toString(), hashCode() and equals()
- Dont Forget to use version controlling from Day 1
- Dont just assume that spring/hibernate/spring-mvc will be best choice for you. create small proof of concepts with atleast 3 to 4 options.
- Try to automate integration/build/deploy with CI tools like Jenkins
- Check and Tune SQL generated by Hibernate (time to time)
- Do not let business logic creep into view layer. Hate jsp scriptlets? Consider Velocity/Freemarker. JSP is not the only option.
- externalize the environment specific configuration by using Spring's PropertyPlaceholderConfigurator.
- If possible, try to integrate with existing User Authentication mechanism (Like LDAP/ OpenID) rather than writing your own. This will save you from reinventing the wheel and your users from remembering yet another set of username and password.