欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

最简单的一个mvc实现

程序员文章站 2022-07-08 16:44:09
...
感谢阿仁(一个香港程序员)告诉了我这个非常棒的网站,让我有时间他塌下心来学习基本的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的一些底层实现方法。
非话太多了,上代码,转自:[email protected]。一个最简单的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>