I have always used Spring framework (3.x) in my projects, using such features as:
security: Spring security API
persistence: Hibernate (auto-generate/update database scheme)
full text search: Hibernate Search (based on Apache Lucene)
IOC: Spring dependency injections
I want to migrate some of my previous projects to Play framework.
Recently I've started studying Scala language along with Play framework 2.x. And I want to use the same features as before.
For database I'm going to use Slick library.
Could you advise me what to use for security and full text search?
Migration to new technology is always a bumpy road, so don't expect the first thing you try to work for you - might be you need to implement something yourself. I'll get to this with a specific example in a bit.
First, Scala means scalable, not integratable. That is, if you choose to code anything in Scala, keep in mind that frameworks meant for automating things in Java mostly do not work on the Scala side. ORM is a very good example of this since Scala methods are not always exactly Java methods, so the metadata will end up in incorrect places and you'll end up having corrupt data. So the general pointer is that if you go with Scala, you really can't look into the Java ecosystem for helpers unless the helpers are completely isolated from language semantics.
Security
Assuming you took full advantage of Spring Security, you were using role-based access control. If you go with Java, you actually should be able to use Spring Security which definitely helps you with the migration and saves time writing more code. All you really need is a Spring container in your Play app and thankfully others have already solved that: Integrating Play framework 2.0 and Spring framework
On Scala side RBAC seems to be a civilized fight about semantics betwen RBAC and ACL with no clear winner. This is problematic since it seems like no one's actually working on one which means you may have to roll your own.
Persistence
With Java you should be able to use Hibernate/any JPA solution since it's not tied to a web container. Play also comes with EBeans but from what I've observed it can't be used for the most exotic use cases. Might be you'll never hit those though so it's worth trying out since it's already there.
On Scala side, as you already thought, Slick should be alright.
Full text search
Search is a really complex thing so I'd actually setup standalone Solr/ElasticSearch and integrate to its APIs instead of embed it to the app itself, no matter what language or framework is being used.
IOC
Latest Play just about supports Guice, Scala itself tries to enforce the cake pattern. Spring should be possible with the container integration linked earlier.
I hope someone else actually has good insights to comment on this because the way Play is built, especially on the Java side seems to be very IOC hostile.
You could actually try http://www.playframework.com/documentation/2.0.1/ScalaSecurity for security and zentask for a sample.
Further for text search - you could use reactive driver in scala.
Related
Without even attempting to start a flame war between Rails/Ruby and Java guys.
I don't want to discuss why, but I want to rewrite/migrate my existing rails app in Java.
Here are the things that I need to find alternatives for:
PostgreSQL. I can use any DB, but with a capable ORM in Java which is comparable to ActiveRecord.
Resque. For background processing in Rails app. I need to find a similar solution in Java.
MVC. Though strictly not as elegant as Rails MVC, but anything closer to it in Java will be fine.
Any experienced views on this?
EDIT: I want to develop in Java language (so this rules out Scala,Groovy, JRuby and similar languages)
I was developing web applications in Java for about 8 years before I switched to Ruby/RoR. A standard set of libraries that I would recommend is:
Spring MVC
Hibernate ORM
maybe Quartz as a Sidekiq equivalent
Spring ROO to tie it all together and bootstrap things
I would recommend freemarker or velocity as a replacement for JSP.
But whatever you choose, you will regret it :)
ORM: Hibernate is pretty much the standard. Any which implements JPA would do, though.
Background processing: Often provided by your app server (e.g. JBoss).
The JavaLite stack is the closest thing to Rails in Java, complete with ActiveWeb (web part - controllers, testing, dynamic compilation, custom tags, etc.). ActiveJDBC - ActiveRecord implementation, DB-Migrator for migrations: http://javalite.io/database_migrations, HornetNest ( JMS - based command pattern replacing Sidekiq), and a lot more. Entire stack for modern Java Web development in one package.
Check out: http://javalite.io
I'm building a web application that needs high performance. I intended using Java EE but after researching about it, there are many negative comments about Java EE applications.
I'm thinking about the Lift framework, but it seems that Lift only support Scala, and I only know Java. Does Lift actually support Java? (I can't find any project example that uses Lift with java). I downloaded a Lift framework project application and there is a boot file in it, can we create a same boot file but for Java?
I'm pretty sure Lift is Scala only. If you're looking for high performance and Java then you should check out the Play Framework as it also has the benefit of not requiring a Servlet container to be deployed.
The Lift framework is Scala only. I want to note that in my experience the transition from Java to Scala was not that hard and now that I know it, there are many language features that make development easier and faster for me. You can take a look at this guide for transitioning between languages: http://www.scala-lang.org/node/960 to see if it might be something that might be right for you. From experience, I really enjoy using the Lift framework as it offers a lot of performance and functionality. The documentation is a bit lacking, but the community is great and makes up for that if you get stuck.
As for Java EE having negative comments, that is a bit vague. The Java EE spec includes everything from Servlets to JSF and EJB. Parts of the spec you will find in almost any web framework (including Lift) and others are more specialized. JSF for example has a lot of overhead, but tries to simplify a lot of the typical application lifecycle. EJB similarly tries to simplify the persistence layer through object relationship management (ORM).
High performance sites can be accomplished with most frameworks, but a lot of it will come down how you develop it. Also, because the framework supports it does not mean you need to use a particular component. Spring (http://www.springsource.org/) is a framework that many people have used on high performance sites, and is incredibly configurable (Supports EJB and JSF, but you don't need to use it). Also, Wicket (http://wicket.apache.org/) is a Java framework that offers a similar feel to Lift that might be interesting to you.
I worked with Lift only for a year now, and was never really interested if it would run from java (I wanted to learn new effective conceptions anyway).
So, I don't fully know the subject. But what I know for sure is that Liftweb has java methods almost everywhere to support java, too. So, you can build your app if not fully in java, then most part of it.
Prooflinks are like these:
http://main.scala-tools.org/mvnsites/liftweb-2.4-M4/net/liftweb/actor/LiftActorJ.html
Classes that add support for java by adding java-acceptable method names and such. These classes usually have a "J" letter at the end.
Anyway, I'd suggest to try out Scala, too -- it's great. And even if you use java only -- you probably will get used to Scala anyway, because you probably would want to read the source code sometimes.
I need to port a legacy internal Java EE application (JSPs, EJBs/stored procedures, Weblogic) over to a newer Java web framework and revamp the features/UI substantially. I'm somewhat limited because the backend will remain Oracle Stored Procedures (no direct SQL), so that rules out many ORM/JPA technologies.
At this point, I'm leaning towards using Spring JDBC to wrap the stored procedure access and a combination of Spring MVC, REST & perhaps Twitter Bootstrap for the frontend. Overall, I'd like to be better positioned to support iterative/agile feature development, etc.
Any other (Java) web technologies worth looking into?
This is just my humble opinion, I would recommend looking into Grails. Although it sounds like you won't be able to leverage GORM, Grails still provides an excellent MVC framework approach, and the convention-over-configuration means that you do not need to deal with the XML configuration files and/or annotations that you do with many other frameworks.
Here is another Stackoverflow post regarding Grails without Gorm: https://stackoverflow.com/a/4600991/463196
In Grails, Taglib support is great (writing custom Taglibs has never been easier) and the plugin ecosystem is incredible.
Also, Groovy means not having to write a lot of the boilerplate getter/setters, overloaded constructors of old. The easiest line of code to support is the one that was never written.
I know this is not really an answer to your question since you've given it already. But from personal experience on similar setups (Java EE/Oracle stored procs/functions) I cannot recommend enough the combo you've suggested with Spring Core/MVC and SimpleJdbcCall to link to your existing Oracle stored procs. I particularly like this setup since it scales very nicely and you can start refactoring bit-by-bit non-intrusively.
I have just started learning java and i have about 8 months time. My main aim is to build web application using java. But as there are many java technologies/frameworks available i am conufused how should i go
IDE i am using is eclipse
The path which i am thinking is below
1)Learn Core Java
2)Project: Build Java Invoicing System with JDBC or mysql to test java knowledge
3)Learn Servlets / JSP to
4)Build small site like simple logon/memberarea/catalogue using servlets/jsp
Now guys I really don't know where the following things stand in my path and which things they will help
1)Java EE
2)Spring or spring MVC, what's the difference?
3)Hibernate
4)Wicket
5)Struts
I really don't know how should i learn those and which things to choose from.
what should be my final project which can be build using those because if i see from my current stage even website can be build using servlets/jsp. then why do i need those other technologies
Can anyone give an example of a project which can be build using new technologies and not using jsp/servlet, so that I can get an idea why we need those?
Lot's of stuff to learn in here so I would take it a bit at a time. I'm going to assume you are relatively comfortable with the Java language and core APIs.
First learn about JDBC and databases. Get a basic functional JDBC example app working (not visual just some a vanilla Java app) that does read/insert/update/delete of some records in a table. This will give you the basis for building whatever app you choose. Almost all interesting applications involve some sort of persistence/database.
Learn the main JDBC APIs (Connection, PreparedStatement, ResultSet) and write some code that uses these to get comfortable.
Learn about how transactions work in databases if you aren't familiar already and how JDBC uses them (Connection.commit and rollback)
Next you could look into the spring framework. This has a several useful features that come in handy when building these applications. The main ones to get to know the dependency injection functionality and the JDBC libraries it has. The DI stuff is a bit of a "duh"? if you haven't used it before but it is very useful/powerful especially for medium size + apps. The JDBC libraries help with the cruft of dealing with the raw JDBC APIs and make your code less error-prone.
Once you've got some basic JDBC and Spring stuff worked out you can then start bringing in a web framework.
This is more difficult because there are so many. In the interest of getting something up and running quickly I would probably go with Wicket. It runs inside a servlet container like Jetty, easy to get up and running with a basic web page or two and relatively easy to evolve of the project over time without going down too many blind alleys. I've found that frameworks like JSF (the Java EE default web/view framework) takes a lot of up front time investment to get going on. Most of these frameworks, including Wicket, can leverage the spring stuff you've got above.
Avoid JSP, it's unpleasent technology and outdated by virtually everything else.
To answer some of your other points.
Hibernate is a tool for mapping an object model to a relational model. In it's most basic form you define a Java class for each DB table with the class having one Java property (variable+getter+setter) for each DB column. You can also add references from one class to another to model database relations. It is good but it takes a bit of getting used to.
Spring I've explained partly above. Spring is much bigger than just DI and some JDBC libraries. It also has transaction management libs and bunch of other stuff. Spring MVC is a web framework which lives under the spring umbrella and makes use of a lot of the spring libraries internally. I've never used it so can't offer an opinion on it.
Java EE is an umbrella term for a large set of "enterprise" specifications/libraries. JSF is a web view framework that is part of Java EE.
That's my very high level advice. To summarise I would learn basic DB/JDBC then some spring stuff and then start building a basic web app using what you've learned already.
Hope that helps. There's plenty of info out there on the web on all these topics and you can always ask questions here on more specific parts if you need help. Good luck and enjoy!
EDIT (to address comment):
All of the above is my recommendation/opinion on how to approach learning Java web development.
In summary
Learning JDBC/transactions/databases is a must
Spring is optional but I strongly recommend. Spring is a big library but you can pick and choose the bits you like/need.
Web frameworks the choice is really yours. From what I have tried (JSF/JSP/Wicket) Wicket is the easiest to get going with so you don't spend too much time frustrated with the getting the initial setup. JSP is awful, it's very easy to make a mess with it. JSF is powerful but heavy and probably more suited to very enterprisy projects than a first web app.
Hibernate is optional but can make life easier simply because you can work with Java objects when you do DB queries/updates rather than writing tedious insert/update statements. Hibernate isn't the only tool like this but it's the one I've used most and does the job well. Just don't go too overboard with the "clever" hibernate features initially.
You could easily use Spring MVC instead of Wicket. That may be a perfectly good choice, I've not used Spring MVC myself so can't comment. I'm sure it will integrate well with spring stuff tho so that would certainly be a positive factor.
Do some more research if you're not sure, there's no end of people happy to give their opinion! But really you just have to dive in and try something.
You are correct. If all your applications are served by servlets, JSPs, and JDBC, then maybe you don't need to learn anything else.
I commend you for learning the fundamentals first before diving into a thicket of frameworks that you don't understand. That's a good thing.
But if you reach the point where you have those down cold, maybe looking at these other technologies can help you improve your game.
1)Java EE
You are learning (part) of Java EE when you use servlets, JSPs, and JDBC. They're a subset of the full Java EE machinery - EJBs, JMS, JNDI, etc.
2)Spring or spring MVC whats
difference
Spring is an alternative framework developed by Rod Johnson and Springsource, now part of VMWare, that is based on dependency injection, aspect-oriented programming, and framework modules. Spring web MVC is one module in the Spring framework, based on servlets, that acts as the front end for web applications.
3)Hibernate
An object-relational mapping technology (ORM), built on top of SQL and JDBC, that lets you map objects to tables. It has its own object-based query language.
4)Wicket
Another web MVC alternative to Spring MVC, Struts, JSF, etc.
5)Struts
The first web MVC framework. It's gone through versions 1.0 and 2.0, and has now been supplated by Java Server Faces. It's still used, though. Like all other web MVC frameworks in Java, it's based on servlets and JSPs.
From a Java perspective it might be best to start looking at Java EE. All the others you mentioned are alternative technologies, which might be useful to you if you decide that what the standard framework offers isn't your cup of tea. But for that to decide, it's never a bad idea to at least know what the standard framework is about.
Truth be told, before 2006 the standard framework had a bad reputation and some of the sentiments that form the basis for recommending alternative technologies are still based on that. Starting with version 5, Java EE got dramatically better. The latest version, Java EE 6 is arguably one of the best Java frameworks that's out there. Of course, the best is a highly subjective term and naturally it won't be the best one for each and every person out there.
At any length, Java EE 6 is a very complete framework that allows a large range of application to be written without depending on any additional library. Being the standard framework, most other frameworks at least depend on some parts of it.
Most typically EJB, CDI and JSF are replaced by alternative technologies. E.g. the core Spring container replaces EJB and CDI and Spring MVC replaces JSF. A full Spring stack typically still uses JPA, JTA, JMS and Servlet from Java EE. Wicket on its turn only replaces JSF, or when used with a Spring stack replaces Spring MVC.
Hibernate is a special case. It doesn't replace anything from Java EE, but is instead often used as an implementation for one of the key APIs of Java EE: JPA. The original creator of Hibernate, Gavin King, is one of the prime supporters of the Java EE framework and is in fact the spec lead of one of the most important parts of modern Java EE: CDI.
Wicket by itself is a very nice web framework, but in practice it isn't used as often as JSF. I won't go into the discussion whether Wicket or JSF is 'better' (this is mostly a religious battle anyway), but due to the popularity of JSF there are simply more people experienced with it and there is a large community offering many things for JSF like component libraries and extensions.
Struts has historically been completely replaced by JSF. The original creator or Struts, Craig Mcclanahan, was the one who started JSF as the successor of Struts. Nevertheless, Struts was once the absolute de-facto standard for web frameworks in Java. It's not often advised to be used for new projects, but till this day it's still used in a huge number of existing applications. So even though it's not really 'hot' to learn Struts anno 2011 knowledge of it may still be very practical for when you have to maintain existing applications.
ps
See this answer for a general description about Java EE: Frameworks for Layering reusable Architectures
I'm sure that nobody seriously can tell you the best way, because this would mean that (s)he would have tried all. Why do you want to learn a Java web application framework? Just to learn it to be prepared for the (next) job? In that case it is likely that you've learned the wrong one.
The next question would be what you want to do with the web application framework. Do you want to make a website a little bit active, e.g. make each page look similar (corporate design), auto-generate menus from an internal structure, or do you want to write a real web application, e.g. with database access.
I'd first define the goal what you want to achieve. IMHO a good way to motivate you to make it right is to take a small project which helps you to solve a small problem.
Then I would start with Java Server Pages (JSP) and servlets to understand the basic concepts. Then you can try to do the same with a few well-known web application frameworks, e.g. Wicket.
Currently working on a Spring 2.5 web application, looks as if the business has at least a 5+ year plan for it's usage.
There isn't anything in terms of a technology roadmap in place for the app.
Spring 2.5.6 is stable, and working smoothly. Staying with it won't be a mistake.
Spring 3 gives additional features and support for newer JavaEE specifications. I wouldn't say it gives something extraordinary.
I agree with #Bozho's answer. One significant new Spring core feature that isn't mentioned in the page linked is the Expression Language feature, which allows you to do a variety of things in XML wiring files that previously had to be implemented as custom code.
SpringSecurity in 3.0 is a mixed bag. On the one hand, there are new features and improvements to existing ones. On the other hand, they have broken source code compatibility in a lot of areas. People who cannot do everything with the SpringSecurity namespaces and the standard classes may be in for some head scratching, recoding, and in some cases pain.
Spring Roo generates spring 3 based applications. Not immediately applicable to existing apps, but it's great to be able to compare roo's best-practice output, and if you were 3.x based then you could copy roo config / code output into your existing application to get functionality for free.