感谢阿仁(一个香港程序员)告诉了我这个非常棒的网站,让我有时间他塌下心来学习基本的servlet。包括我在内,虽然很多大陆的程序员都声称什么ssh\jsf\jdo其实很多人连最基本的servlet、multi-thread、transaction-level还搞不清楚就去跟风搞ssh实在是本末倒置,没有必要。我觉得甚至还不如下点功夫把基础好好补习一下,看看struts、tomcat的源代码学习一下,然后实现一些自己的框架,哪怕就是单纯的模仿。
根据我自己的分析:struts使用的底层技术:xml\reflection\servlet\multi-thread; spring的底层技术:xml\aop\reflection\multi-thread; hibernate的底层技术:reflection\multi-thread\xml\jdbc\数据库基础。所以,花点时间把基础仔细的学习学习还是很有必要的~j
使用、学习java确实是很幸福的,因为有太多现成的开源软件供你使用,但是同时也有一些问题:如果你只会用,而不能深入学习,那你一辈子只能跟着开源组织走,而不能自己开发一套框架。很高兴,自己能够意识到这些,希望在3、5年之内我能自己实现一些框架,当然一定要是有生产力里的框架!3、5年,应该没有什么问题,至少现在我就能够体会到struts\hibernate\spring的一些底层实现方法。
非话太多了,上代码,转自:Gossip@caterpillar。一个最简单的mvc实现,看看这段代码,对struts有一种豁然开朗的感觉,用了那么久,现在才意识到其中的具体实现方法,太神奇了~~其中对于invoker类我做了一点修改:以保证线程安全。
package com.cxz.mvc;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public interface Action {
public void execute(HttpServletRequest request, HttpServletResponse response);
}
package com.cxz.mvc;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class DispatcherServlet extends HttpServlet {
private static final long serialVersionUID = 4617894412082217211L;
private Invoker invoker;
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doPost(request, response);
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
invoker.request(request, response);
}
public void init() throws ServletException {
invoker = new Invoker();
invoker.addCommand("/welcome.action", null);//a action
invoker.addCommand("/login.action", null);//a action
invoker.setDefaultPage("/welcome.action");
}
}
package com.cxz.mvc;
import java.io.IOException;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class Invoker {
private String defaultPage;
private Map<String, Action> actions = null;
public Invoker() {
actions = Collections.synchronizedMap(new HashMap<String, Action>());
}
public void addCommand(String name, Action action) {
actions.put(name, action);
}
public void request(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
Action action = actions.get(request.getServletPath());
if (action != null) {
action.execute(request, response);
} else {
request.getRequestDispatcher(defaultPage)
.forward(request, response);
}
}
synchronized void setDefaultPage(String defaultPage) {
this.defaultPage = defaultPage;
}
public String getDefaultPage() {
return defaultPage;
}
}
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.4"
xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
<servlet>
<description>This is the description of my J2EE component</description>
<display-name>This is the display name of my J2EE component</display-name>
<servlet-name>DispatcherServlet</servlet-name>
<servlet-class>com.cxz.mvc.DispatcherServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>DispatcherServlet</servlet-name>
<url-pattern>*.action</url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>