Tuesday, July 31, 2007

"Hello, world" with Spring MVC

Recently I've started using of Srping MVC for my web apps. So what you need to get started with spring MVC:

1) Download Spring framework and put spring.jar to web server lib path.
2) Add DispathServlet mapping to web.xml
<servlet>
  <servlet-name><strong>spring</strong></servlet-name>
  <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
  <servlet-name>spring</servlet-name>
  <url-pattern>/index.jsp</url-pattern>
</servlet-mapping>


3) We have called servler instance as spring, so we should create a spring-servlet.xml at WEB-INF.


<xml>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">

<beans>

      <bean id="urlMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
              <property name="mappings">
                     <props>
                             <prop key="/*.jsp">dispatchController</prop>
                     </props>
             </property>
     </bean>

    <bean id="dispatchController" class="my.SimpleController">

      <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
              <property name="prefix">
                       <value>/WEB-INF/jsp/</value>
             </property>
             <property name="suffix">
                      <value>.jsp</value>
             </property>
     </bean>

</beans>
</xml>

We described 3 beans here.
urlMaping - is a mapping bean. It should not be registered manually. Spring will automatically parse it during initialization.
dispatchController - is a bean, which will be dispath all requests of *.jsp pages. We write class="my.SimpleController", so we need to create class SimpleController later.
viewResolver - is a bean? which will add prefix and suffix to views for creating valid request.

4) Create class my.SimpleController
package my;

import org.springframework.web.servlet.mvc.Controller;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class SimpleController implements Controller {
    public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
        ModelAndView mav = new ModelAndView("index");
        return mav;
    }
}

This class will dispath all requests to the "index" view. Then "index" view will be changed to "/WEB-INF/jsp/index.jsp" by viewResolver bean.

5) Create "/WEB-INF/jsp/index.jsp".
<html>
  <body>
     "Hello, world!" with Spring MVC.
  </body>
</html>


That's all.

Wednesday, July 25, 2007

Multithreading at JavaScript

Recently I've investigated how work multithreading at JavaScript and particulary IE. So, it is safe to say, there is no multithreading at JavaScript. All parts of script are running at the same thread.
Honestly, I expected that function setTimeout(func, timeInMillis) will run func at new htread. In effect this function just guaranties that func will be not runnig earlier than timeInMillis. Actually if you call it many times, all funcs will be added to the JavaScript engine queue. There is only one queue for all JavaScript at IE.

As for AJAX and particulary letter A, it is really asynchronous. When asynchronous request is posted it handling will run at other thread, but only before response receiving. If response received, callback function will be added to the JavaScript queue. So it will be asynchronous before response handling. Then it became full-synchronous.

Moreover all UI movements related to JavaScropt engine also run at the single thread. So if you have a long-running parts of script UI would be freeze. Thus for evading of UI freezing you need avoid a long-running parts of script. For example, this trick may be used for cycle evading:

iter = function() {
    if (i == 0) return;
    //peace of code
    setTimeout("writeLine();", 10);
}

setTimeout("iter(--i);", 0);

It is better to have many small parts than one big.

Tuesday, July 24, 2007

How to start RMIRegistry programmatically

I often face with the necessity of programmatical RMI registry starting. So, this is a solving:

try {
    java.rmi.registry.LocateRegistry.createRegistry(1099);
    System.out.println("RMI registry ready.");
} catch (Exception e) {
    System.out.println("Exception starting RMI registry:");
    e.printStackTrace();
}