从一本书上看到一个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. <br>
*
* @throws ServletException if an error occure
*/
public void init() throws ServletException {
ServletContext context=this.getServletContext();
String config_file=this.getServletConfig().getInitParameter("config");
String dispatcher_name=this.getServletConfig().getInitParameter("dispatcher");
if(config_file==null||config_file.equals(""))
config_file="/WEB-INF/classes/am-config.xml";
if(dispatcher_name==null||dispatcher_name.equals(""))
dispatcher_name=Const.DEFAULT_DISPATCHER;
try{
Map<String,ActionModel> resources=ConfigXMLParser.newInstance().parse(config_file,context);
System.out.println(resources);
context.setAttribute(Const.ACTIONS_ATTR, resources);
log.info("初始化配置文件成功");
}catch(Exception e){
log.error("初始化配置文件失败");
e.printStackTrace();
}
try{
Class c=Class.forName(dispatcher_name);
Dispatcher dispatcher=(Dispatcher)c.newInstance();
context.setAttribute(Const.DISPATCHER_ATTR, dispatcher);
log.info("初始化Dispatcher成功");
}catch(Exception e){
log.error("初始化Dispatcher失败");
e.printStackTrace();
}
}
/**
* The doGet method of the servlet. <br>
*
* 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. <br>
*
* 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(".");
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("/"+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<String,ActionModel> actions=
(Map<String,ActionModel>)context.getAttribute(Const.ACTIONS_ATTR);
String reqPath=(String)request.getAttribute(Const.REQUEST_ATTR);
ActionModel actionModel=actions.get(reqPath);
String forward_name="";
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("can not find action"+actionModel.getClassName());
}
actionForward=actionModel.getForwards().get(forward_name);
if(actionForward==null){
log.error("can not find page for forward "+forward_name);
return null;
}else{
return actionForward.getViewUrl();
}
}
public void setServletContext(ServletContext context) {
// TODO Auto-generated method stub
this.context = context;
}
}
实现原理和struts差不多,有助于我们理解struts,具体代码可见附件。
分享到:
相关推荐
本教程将详细讲解如何使用.NET MVC实现文件上传功能,这是一个常见的Web开发需求。 首先,我们需要理解.NET MVC中的控制器(Controller)是处理用户请求的地方。在文件上传场景中,控制器会接收HTTP POST请求,该...
【标题】"mystruts简易MVC框架实现" 在软件开发中,Model-View-Controller(MVC)架构模式是一种广泛应用于创建用户界面的设计模式,它将应用程序的业务逻辑、数据处理和用户界面分离,提高了代码的可维护性和可...
“用mvc实现的一个小型计数器”这个标题表明了这是一个基于MVC(Model-View-Controller)架构设计的简单计数器应用。MVC是一种流行的设计模式,广泛应用于Web开发中,它将应用程序的业务逻辑、用户界面和数据处理...
例如,一个简单的模型类可能包含获取和设置属性的方法,以及与数据库交互的业务逻辑。 **视图(View)** 视图层负责展示数据,通常由HTML、JSP或JSF等技术实现。视图从模型获取数据并渲染成用户可以理解的格式。在...
本项目“基于MVC实现的简单注册登录小Demo”旨在为初学者提供一个直观的学习实例,帮助理解MVC模式如何应用于实际的注册登录功能。通过分析这个Demo,我们可以深入探讨MVC模式、注册登录的实现细节以及数据库配置。 ...
本文将详细介绍如何使用Qt5实现一个MVC的例子,以及涉及的相关知识点。 首先,我们来理解MVC模式的基本概念: 1. Model(模型):负责处理数据和业务逻辑,它是应用程序的核心部分。在Qt中,我们可以使用...
在“MVC实现多媒体播放”的项目中,我们主要关注如何利用ASP.NET MVC框架来构建一个后台管理系统,支持多媒体资源(包括图片、音频和视频)的上传、查看和播放功能。以下是一些关键知识点: 1. **ASP.NET MVC框架**...
本项目是用C++实现的一个简单的MVC框架,名为MVCDemo,旨在帮助开发者理解MVC设计模式的基础概念。 首先,我们来详细解释MVC的三个组成部分: 1. Model(模型):模型层是应用的核心,它负责管理数据和业务逻辑。...
C#的mvc框架,实现简单的web功能。可以应用在泛微oa等需要基础开发简单功能的网站。erp,crm等系统。
总结,这个简单的MVC实例为我们提供了一个理解MVC模式如何应用于实际项目中的示例,尤其是对于初学者来说,它能帮助我们更好地掌握J2EE环境下的MVC架构,从而提升我们的Web开发技能。通过分析stu.sql和Student,我们...
本教程将以JSP为基础,深入浅出地介绍如何实现一个简单的MVC模式。对于初学者来说,这是一个很好的起点,有助于理解MVC架构的工作原理。 首先,让我们来了解一下MVC的三个组成部分: 1. **Model(模型)**:模型层...
不过,对于这个简单的MVC代码,我们可能看到的是一个基础的实现,没有使用框架,而是手动编排了模型、视图和控制器之间的交互。 总之,一个简单的MVC代码旨在演示如何将应用程序的职责划分为模型、视图和控制器,以...
本教程将引导新手了解如何使用MVC架构实现一个登录注册系统,并与数据库进行交互。 首先,我们需要理解MVC模式的基本构成: 1. **Model(模型)**:模型层是应用的核心,负责处理业务逻辑和数据操作。在Java Web中...
总结,这个“jsp mvc实现简单BBS”项目是一个基础的在线讨论平台,展示了如何运用JSP和Servlet实现MVC模式,以及基础的BBS功能。在实践中,我们可以不断学习和引入更多先进的技术,以提高系统的稳定性和用户体验。
本项目“mvc框架实现留言板”就是这样一个例子,它通过JSP、Servlet和JavaBean的组合,展示了如何构建一个简单的互动式留言板应用。 1. **MVC框架概述** MVC模式是一种设计模式,它将业务逻辑(Model)、用户界面...
在本项目中,我们将探讨如何使用Spring MVC、MyBatis和MySQL来搭建一个简单的用户查询系统。 首先,我们需要在项目中引入Spring MVC的依赖。通常,我们会在`pom.xml`或`build.gradle`文件中添加对应的Maven或Gradle...
libgitlmvc 是一个基于Qt构建的的C++ MVC 框架 概览: View<====>Front Controller<====>Commands<====>Model 该框架包括四个部分: 视图: 用户交互界面 前端控制其(Front Controller): 处理所有的视图请求 ...
这个小例子为初学者提供了一个简单的MVC模式实践,展示了如何在实际项目中结合Java EE技术栈实现基本的CRUD操作。通过学习和理解这个例子,开发者可以进一步掌握MVC模式的应用,以及相关框架的使用。
本文将详细探讨如何利用.NET MVC和Redis来创建一个简单的抢购队列,并着重讲解`RPush`和`LPop`这两个Redis命令在其中的作用。 首先,理解.NET MVC框架。ASP.NET MVC(Model-View-Controller)是一种设计模式,用于...