自定义MVC框架
学习过程中的一些记录,很多东西也许不正确,还希望大家能不吝赐教呀!
初级版MVC
1、定义Action接口
接口中定义execute方法。
public interface Action {
public String execute(HttpServletRequest request,HttpServletResponse response);
}
2、实现Action
根据具体的业务逻辑实现Action,在实现类中定义不同的业务处理逻辑。
public class HelloAction implements Action {
@Override
public String execute(HttpServletRequest request,
HttpServletResponse response) {
request.setAttribute("hello", "hello world!");
return "HelloAction.jsp";
}
}
3、定义控制器
其实就是个servlet,相当于struts2中的dispatcher,对所有的请求进行分派,根据请求的URI指定相应的action对象进行处理,并且根据返回的视图对用户进行响应。本质是一个servlet,因此需要配置web.xml。
public class Controller extends HttpServlet {
private Map<String,Action> actions;//维护所有的action,struts2中是在访问时候通过反射创建action对象的。
@Override
public void init() throws ServletException {
actions = new HashMap<String,Action>();
actions.put("HelloAction", new HelloAction());
super.init();
}
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
Action action = determineActionByUri(request, response);
if(action == null){
request.getRequestDispatcher("错误路径").forward(request, response);
return;
}
String result = action.execute(request, response);
if(result!= null)
request.getRequestDispatcher(result).forward(request, response);
}
//根据uri获取对应的ACtion对象
private Action determineActionByUri(HttpServletRequest request, HttpServletResponse response){
String requestURI = request.getRequestURI();
String requestAction = requestURI.substring(requestURI.lastIndexOf("/")+1,requestURI.length()-7);
Action action = actions.get(requestAction);
return action;
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
4、配置web.xml
保证所有的请求都经过servlet处理。servlet是单例的,第一次访问之后创建对象,之后就不再创建对象了。当然也可以在web.xml中配置启动tomcat服务器时候就创建对象,这样在第一次访问时候不会感觉到延迟。
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
<display-name></display-name>
<servlet>
<servlet-name>Controller</servlet-name>
<servlet-class>action.Controller</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>Controller</servlet-name>
<url-pattern>*.action</url-pattern>
</servlet-mapping>
</web-app>
5、创建必要的视图
视图的路径需要个返回的路径匹配,在struts2中根据struts.xml配置文件配置了action对象和result结果集,其原理也是差不多的。
到这里,一个简单的MVC框架就能跑起来了。
其中
- M:Model部分并没有过多的设计,model部分更多的是涉及持久层的东西,这里由于业务逻辑太简单(其实根本就没有业务逻辑),所以就没有POJO类。
- V:View。JSP,这个还是有的,主要是和用户的一些交互,接受请求,返回响应都需要在JSP上进行展示。
- C:Controller,在这里是一个Servlet,负责对用户的请求进行分发处理。struts2中用的是filter,并且struts2中定义了很多的拦截器,来对请求的业务进行处理。个人理解拦截器和过滤器其实是一个东西,只不过过滤器是JavaEE中的概念,拦截器(inteceptor)只有Struts2才有的吧。
Model1模型中,不涉及分层结构,当项目过大时难以管理和维护。
Model2采用了MVC的模型,也就是分层结构,将持久层和视图层通过控制层分隔解耦开来。能让项目更大时解耦。
进阶版MVC
进阶版相对于简单版的一些主要的差别:
1. 利用反射技术创建action
2. result采用了面向对象编程的思想,因此result更加强大。
reference:http://blog.csdn.net/jackfrued/article/details/42774459