`
kerrysk
  • 浏览: 17098 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

一个简单的mvc实现

阅读更多

  从一本书上看到一个mvc的简单实现,有点像struts2,大家分享一下
  1、核心一个FrontController拦截所有请求,web.xml如下: 

<?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>FrontController</servlet-name>
    <servlet-class>am.core.FrontController</servlet-class>
    <init-param>
    	<param-name>config</param-name>
    	<param-value>/WEB-INF/classes/am-config.xml</param-value>
    </init-param>
    <load-on-startup>0</load-on-startup>
  </servlet>

  <servlet-mapping>
    <servlet-name>FrontController</servlet-name>
    <url-pattern>*.action</url-pattern>
  </servlet-mapping>
  <welcome-file-list>
    <welcome-file>login.jsp</welcome-file>
  </welcome-file-list>
</web-app>

 
 
FrontController:

package am.core; 

import java.io.IOException; 
import java.util.Map; 

import javax.servlet.RequestDispatcher; 
import javax.servlet.ServletContext; 
import javax.servlet.ServletException; 
import javax.servlet.http.HttpServlet; 
import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 

import org.apache.commons.logging.Log; 
import org.apache.commons.logging.LogFactory; 

import am.common.Const; 
import am.util.ConfigXMLParser; 

public class FrontController extends HttpServlet { 
private static final Log log=LogFactory.getLog(ConfigXMLParser.class); 
/** 
* Initialization of the servlet. &lt;br&gt; 
* 
* @throws ServletException if an error occure 
*/ 
public void init() throws ServletException { 
ServletContext context=this.getServletContext(); 
String config_file=this.getServletConfig().getInitParameter(&quot;config&quot;); 
String dispatcher_name=this.getServletConfig().getInitParameter(&quot;dispatcher&quot;); 
if(config_file==null||config_file.equals(&quot;&quot;)) 
config_file=&quot;/WEB-INF/classes/am-config.xml&quot;; 
if(dispatcher_name==null||dispatcher_name.equals(&quot;&quot;)) 
dispatcher_name=Const.DEFAULT_DISPATCHER; 
try{ 
Map&lt;String,ActionModel&gt; resources=ConfigXMLParser.newInstance().parse(config_file,context); 
System.out.println(resources); 
context.setAttribute(Const.ACTIONS_ATTR, resources); 
log.info(&quot;初始化配置文件成功&quot;); 
}catch(Exception e){ 
log.error(&quot;初始化配置文件失败&quot;); 
e.printStackTrace(); 
} 
try{ 
Class c=Class.forName(dispatcher_name); 
Dispatcher dispatcher=(Dispatcher)c.newInstance(); 
context.setAttribute(Const.DISPATCHER_ATTR, dispatcher); 
log.info(&quot;初始化Dispatcher成功&quot;); 
}catch(Exception e){ 
log.error(&quot;初始化Dispatcher失败&quot;); 
e.printStackTrace(); 
} 
} 

    /** 
* The doGet method of the servlet. &lt;br&gt; 
* 
* This method is called when a form has its tag value method equals to get. 
* 
* @param request the request send by the client to the server 
* @param response the response send by the server to the client 
* @throws ServletException if an error occurred 
* @throws IOException if an error occurred 
*/ 
public void doGet(HttpServletRequest request, HttpServletResponse response) 
throws ServletException, IOException { 
        this.process(request, response); 

} 

/** 
* The doPost method of the servlet. &lt;br&gt; 
* 
* This method is called when a form has its tag value method equals to post. 
* 
* @param request the request send by the client to the server 
* @param response the response send by the server to the client 
* @throws ServletException if an error occurred 
* @throws IOException if an error occurred 
*/ 
public void doPost(HttpServletRequest request, HttpServletResponse response) 
throws ServletException, IOException { 
this.process(request, response); 

} 
protected void process(HttpServletRequest request, 
HttpServletResponse response)throws ServletException,IOException{ 
ServletContext context=this.getServletContext(); 
String reqURL=request.getRequestURL().toString(); 
int i=reqURL.lastIndexOf(&quot;.&quot;); 
String contextPath=request.getContextPath(); 
int j=reqURL.indexOf(contextPath); 
String path=reqURL.substring(contextPath.length()+j,i); 
request.setAttribute(Const.REQUEST_ATTR, path); 
Dispatcher dispatcher=(Dispatcher)context.getAttribute(Const.DISPATCHER_ATTR); 
String nextPage=dispatcher.getNextUrl(request, response, context); 
RequestDispatcher forwarder=request.getRequestDispatcher(&quot;/&quot;+nextPage); 
forwarder.forward(request,response); 
} 

} 

 
am-config.xml为配置文件,结构如下:

<?xml version="1.0" encoding="UTF-8"?>
<actions>
<action path="/login" class="am.action.LoginAction">
<forward name="success" url="hello.jsp"/> 
<forward name="error" url="login.jsp"/> 
</action>
</actions>

 
FrontController拦截所有请求,根据请求URL解析出path,根据path由Dispatcher执行具体action,返回nextpage。
ActionDispatcher如下: 
 

package am.core; 
import java.util.Map; 
import javax.servlet.ServletContext; 
import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 
import org.apache.commons.logging.Log; 
import org.apache.commons.logging.LogFactory; 
import am.common.Const; 

public class ActionDispatcher implements Dispatcher { 
private ServletContext context; 
private static final Log log=LogFactory.getLog(ActionDispatcher.class); 
public String getNextUrl(HttpServletRequest request, 
HttpServletResponse response, ServletContext context) { 
setServletContext(context); 
Map&lt;String,ActionModel&gt; actions= 
(Map&lt;String,ActionModel&gt;)context.getAttribute(Const.ACTIONS_ATTR); 
String reqPath=(String)request.getAttribute(Const.REQUEST_ATTR); 
ActionModel actionModel=actions.get(reqPath); 
String forward_name=&quot;&quot;; 
ActionForward actionForward; 
try{ 
Class c=Class.forName(actionModel.getClassName()); 
Action action=(Action)c.newInstance(); 
if(ValuesSetter.setValues(request, action)){ 
forward_name=action.execute(request, response, context); 
}else{ 
forward_name=Action.ERROR; 
} 
}catch(Exception e){ 
log.error(&quot;can not find action&quot;+actionModel.getClassName()); 
} 
actionForward=actionModel.getForwards().get(forward_name); 
if(actionForward==null){ 
log.error(&quot;can not find page for forward &quot;+forward_name); 
return null; 
}else{ 
return actionForward.getViewUrl(); 
} 
     } 

public void setServletContext(ServletContext context) { 
// TODO Auto-generated method stub 
this.context = context; 
} 
} 

 
实现原理和struts差不多,有助于我们理解struts,具体代码可见附件。

 

1
0
分享到:
评论

相关推荐

    .NET MVC实现文件上传

    本教程将详细讲解如何使用.NET MVC实现文件上传功能,这是一个常见的Web开发需求。 首先,我们需要理解.NET MVC中的控制器(Controller)是处理用户请求的地方。在文件上传场景中,控制器会接收HTTP POST请求,该...

    mystruts简易MVC框架实现 .

    【标题】"mystruts简易MVC框架实现" 在软件开发中,Model-View-Controller(MVC)架构模式是一种广泛应用于创建用户界面的设计模式,它将应用程序的业务逻辑、数据处理和用户界面分离,提高了代码的可维护性和可...

    用mvc实现的一个小型计数器

    “用mvc实现的一个小型计数器”这个标题表明了这是一个基于MVC(Model-View-Controller)架构设计的简单计数器应用。MVC是一种流行的设计模式,广泛应用于Web开发中,它将应用程序的业务逻辑、用户界面和数据处理...

    MVC的简单实现

    例如,一个简单的模型类可能包含获取和设置属性的方法,以及与数据库交互的业务逻辑。 **视图(View)** 视图层负责展示数据,通常由HTML、JSP或JSF等技术实现。视图从模型获取数据并渲染成用户可以理解的格式。在...

    基于MVC实现的简单注册登录小Demo

    本项目“基于MVC实现的简单注册登录小Demo”旨在为初学者提供一个直观的学习实例,帮助理解MVC模式如何应用于实际的注册登录功能。通过分析这个Demo,我们可以深入探讨MVC模式、注册登录的实现细节以及数据库配置。 ...

    Qt5实现的一个mvc 的例子

    本文将详细介绍如何使用Qt5实现一个MVC的例子,以及涉及的相关知识点。 首先,我们来理解MVC模式的基本概念: 1. Model(模型):负责处理数据和业务逻辑,它是应用程序的核心部分。在Qt中,我们可以使用...

    MVC实现多媒体播放

    在“MVC实现多媒体播放”的项目中,我们主要关注如何利用ASP.NET MVC框架来构建一个后台管理系统,支持多媒体资源(包括图片、音频和视频)的上传、查看和播放功能。以下是一些关键知识点: 1. **ASP.NET MVC框架**...

    C++实现简单的MVC框架

    本项目是用C++实现的一个简单的MVC框架,名为MVCDemo,旨在帮助开发者理解MVC设计模式的基础概念。 首先,我们来详细解释MVC的三个组成部分: 1. Model(模型):模型层是应用的核心,它负责管理数据和业务逻辑。...

    C#的mvc框架,实现简单的web功能

    C#的mvc框架,实现简单的web功能。可以应用在泛微oa等需要基础开发简单功能的网站。erp,crm等系统。

    一个简单的mvc实例

    总结,这个简单的MVC实例为我们提供了一个理解MVC模式如何应用于实际项目中的示例,尤其是对于初学者来说,它能帮助我们更好地掌握J2EE环境下的MVC架构,从而提升我们的Web开发技能。通过分析stu.sql和Student,我们...

    简单jsp的mvc实现

    本教程将以JSP为基础,深入浅出地介绍如何实现一个简单的MVC模式。对于初学者来说,这是一个很好的起点,有助于理解MVC架构的工作原理。 首先,让我们来了解一下MVC的三个组成部分: 1. **Model(模型)**:模型层...

    一个简单的MVC代码

    不过,对于这个简单的MVC代码,我们可能看到的是一个基础的实现,没有使用框架,而是手动编排了模型、视图和控制器之间的交互。 总之,一个简单的MVC代码旨在演示如何将应用程序的职责划分为模型、视图和控制器,以...

    mvc 实现登录注册+数据库

    本教程将引导新手了解如何使用MVC架构实现一个登录注册系统,并与数据库进行交互。 首先,我们需要理解MVC模式的基本构成: 1. **Model(模型)**:模型层是应用的核心,负责处理业务逻辑和数据操作。在Java Web中...

    jsp mvc实现简单BBS

    总结,这个“jsp mvc实现简单BBS”项目是一个基础的在线讨论平台,展示了如何运用JSP和Servlet实现MVC模式,以及基础的BBS功能。在实践中,我们可以不断学习和引入更多先进的技术,以提高系统的稳定性和用户体验。

    mvc框架实现留言板

    本项目“mvc框架实现留言板”就是这样一个例子,它通过JSP、Servlet和JavaBean的组合,展示了如何构建一个简单的互动式留言板应用。 1. **MVC框架概述** MVC模式是一种设计模式,它将业务逻辑(Model)、用户界面...

    spring mvc架构搭建,实现简单的查询用户查询功能

    在本项目中,我们将探讨如何使用Spring MVC、MyBatis和MySQL来搭建一个简单的用户查询系统。 首先,我们需要在项目中引入Spring MVC的依赖。通常,我们会在`pom.xml`或`build.gradle`文件中添加对应的Maven或Gradle...

    Qt5实现的一个mvc的例子

    libgitlmvc 是一个基于Qt构建的的C++ MVC 框架 概览: View&lt;====&gt;Front Controller&lt;====&gt;Commands&lt;====&gt;Model 该框架包括四个部分: 视图: 用户交互界面 前端控制其(Front Controller): 处理所有的视图请求 ...

    一个MVC模式的小例子(实现了增、删的功能)

    这个小例子为初学者提供了一个简单的MVC模式实践,展示了如何在实际项目中结合Java EE技术栈实现基本的CRUD操作。通过学习和理解这个例子,开发者可以进一步掌握MVC模式的应用,以及相关框架的使用。

    .NET MVC Redis 实现简单的抢购队列

    本文将详细探讨如何利用.NET MVC和Redis来创建一个简单的抢购队列,并着重讲解`RPush`和`LPop`这两个Redis命令在其中的作用。 首先,理解.NET MVC框架。ASP.NET MVC(Model-View-Controller)是一种设计模式,用于...

Global site tag (gtag.js) - Google Analytics