`

serlvet的mvc架构最简版

阅读更多
   写了个最简单的最粗糙的mvc的架构。
   在web的xml中配置过滤器以及在页面上显示的标签。
  
   <filter>
		<filter-name>bushyou</filter-name>
		<filter-class>com.bushyou.servlet.dispatcher.FilterDispatcher</filter-class>
	</filter>
	<!-- Extension -->
	<filter-mapping>
		<filter-name>bushyou</filter-name>
		<url-pattern>*.html</url-pattern>
	</filter-mapping>
	<jsp-config>
		<taglib>
			<taglib-uri>/bushyou</taglib-uri>
			<taglib-location>/WEB-INF/bushyou.tld</taglib-location>
		</taglib>
	</jsp-config>
   

  
   将web的含有.html的请求都经过FilterDispatcher这个过滤器。
  
    在FilterDispatcher中。
/**
 * 拦截请求
 *
 * @author shanzhu
 * @version 1.0 2011-9-29
 */
package com.bushyou.servlet.dispatcher;

import java.io.IOException;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.bushyou.action.IAction;
import com.bushyou.servlet.context.ActionMapper;
import com.bushyou.servlet.context.ListBushyouActionMapper;
import com.bushyou.servlet.context.ValueContext;

public class FilterDispatcher implements Filter {
    private FilterConfig filterConfig;

    @Override
    public void destroy() {
        // TODO Auto-generated method stub

    }

    @Override
    public void doFilter(ServletRequest req, ServletResponse res,
            FilterChain arg2) throws IOException, ServletException {
        HttpServletRequest request = (HttpServletRequest) req;
        HttpServletResponse response = (HttpServletResponse) res;
        ServletContext servletContext = getServletContext();
        //将request,response,servletContext放入值域中。
        ValueContext valueContext = new ValueContext(request, response,
                servletContext);
        //将值域放入request对象中。
        request.setAttribute("bushyou_value_context", valueContext);
        //返回的jsp页面。mvc中的 v
        String pa = "";
        if (ListBushyouActionMapper.map.containsKey(valueContext.getPath())) {
            ActionMapper actionMapper = ListBushyouActionMapper.map.get(valueContext.getPath());
            valueContext.setActionMapper(actionMapper);
            IAction action = null;
            String returnStr = null;
            try {
                //反射出acion对象。
                Class classType = Class.forName(valueContext.getActionMapper().getClassPath());
                //执行构造函数。
                Constructor constructor = classType.getConstructor();
                action  = (IAction) constructor.newInstance();
                //执行excuse方法。得到返回值。
                returnStr = action.excute();
            } catch (ClassNotFoundException e) {
            } catch (SecurityException e) {
            } catch (NoSuchMethodException e) {
            } catch (IllegalArgumentException e) {
            } catch (InstantiationException e) {
            } catch (IllegalAccessException e) {
            } catch (InvocationTargetException e) {
            }
            //将action对象放入值域中。
            valueContext.setAction(action);
            pa = valueContext.getActionMapper().getReturnUrl();
        }
        
        //forward
        RequestDispatcher requestDispatcher = request
                .getRequestDispatcher(pa);
        requestDispatcher.forward(request, response);
    }

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        this.filterConfig = filterConfig;
    }

    protected ServletContext getServletContext() {
        return filterConfig.getServletContext();
    }

}

在上面的代码中。我们已经将整个mvc的过程走完了。
当请求经过这个过滤器的时候,过滤器想将值域放入request对象,然后反射出action对象。执行提供出去的excuse方法。
/**
 * 值栈
 *
 * @author shanzhu
 * @version 1.0 2011-9-29
 */
package com.bushyou.servlet.context;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.bushyou.action.IAction;



public class ValueContext {
     ValueMap valueMap;    //值域,放入的request,response,servletContext,action执行后 对象
     ActionMapper actionMapper ;    //action对象
     List extensions = new ArrayList() {{ add("html");}};
     IAction action;
     String path;

    public ValueContext(HttpServletRequest request,
            HttpServletResponse response, ServletContext servletContext) {
        valueMap = new ValueMap();
        valueMap.setRequest(request);
        valueMap.setResponse(response);
        valueMap.setServletContext(servletContext);
        String path = getServletPath(request);
        this.path = path;
        path = dropExtension(path);
        parseNameAndNamespace(path);
    }
    
    /**
     * 拿到请求的url
     * @param request
     * @return
     */
    public static String getServletPath(HttpServletRequest request) {
        String servletPath = request.getServletPath();

        if (null != servletPath && !"".equals(servletPath)) {
            return servletPath;
        }

        String requestUri = request.getRequestURI();
        int startIndex = request.getContextPath().equals("") ? 0 : request.getContextPath().length();
        int endIndex = request.getPathInfo() == null ? requestUri.length() : requestUri.lastIndexOf(request.getPathInfo());

        if (startIndex > endIndex) { // this should not happen
            endIndex = startIndex;
        }

        return requestUri.substring(startIndex, endIndex);
    }
    
    String dropExtension(String name) {
        if (extensions == null) {
            return name;
        }
        Iterator it = extensions.iterator();
        while (it.hasNext()) {
            String extension = "." + (String) it.next();
            if (name.endsWith(extension)) {
                name = name.substring(0, name.length() - extension.length());
                return name;
            }
        }
        return name;
    }

    /**
     * 解析成 actionMapper对象。
     * @param uri
     */
    void parseNameAndNamespace(String uri) {
        String namespace, name;
        int lastSlash = uri.lastIndexOf("/");
        if (lastSlash == -1) {
            namespace = "";
            name = uri;
        } else if (lastSlash == 0) {
            // ww-1046, assume it is the root namespace, it will fallback to
            // default
            // namespace anyway if not found in root namespace.
            namespace = "/";
            name = uri.substring(lastSlash + 1);
        }else {
            namespace = uri.substring(0, lastSlash);
            name = uri.substring(lastSlash + 1);
        }
        
        if (name != null) {
            int pos = name.lastIndexOf('/');
            if (pos > -1 && pos < name.length() - 1) {
                name = name.substring(pos + 1);
            }
        }
        
        actionMapper = new ActionMapper();
        actionMapper.setActionName(name);
        actionMapper.setNamespace(namespace);
        

    }
   
    public Map getValueMap() {
        return valueMap;
    }


    public IAction getAction() {
        return action;
    }

    public void setAction(IAction action) {
        this.valueMap.setAction(action);
        this.action = action;
    }

    public ActionMapper getActionMapper() {
        return actionMapper;
    }

    public void setActionMapper(ActionMapper actionMapper) {
        this.actionMapper = actionMapper;
    }

    public String getPath() {
        return path;
    }

    public void setPath(String path) {
        this.path = path;
    }
    
    
    

}
上面是放入的值域。主要是用在前台的jsp标签使用。
/**
 * property 标签,用于显示属性。
 *
 * @author shanzhu
 * @version 1.0 2011-9-29
 */
package com.bushyou.servlet.tag;

import java.io.IOException;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.BodyTagSupport;

import com.bushyou.servlet.context.ValueContext;

public class PropertyTag extends BodyTagSupport {

    @Override
    public int doEndTag() throws JspException {
        HttpServletRequest request = (HttpServletRequest) pageContext
                .getRequest();
        ValueContext valueContext = (ValueContext) request
                .getAttribute("bushyou_value_context");
        Object o = valueContext.getValueMap().get(value);
        // 取得标签体对象
        try {
            pageContext.getOut().write((String)o);
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        return super.doAfterBody();
    }

    private String value;
    private boolean escape;
    private static final long serialVersionUID = 8921307524633290358L;

    public String getValue() {
        return value;
    }

    public void setValue(String value) {
        this.value = value;
    }

    public boolean isEscape() {
        return escape;
    }

    public void setEscape(boolean escape) {
        this.escape = escape;
    }

}

上面是jsp的自定义标签的方法。
/**
 * 继承hashmap
 * 
 * 在页面上用于展现的时候,所有的值域都在这个容器内。
 * 
 * 复写他的get方法
 *
 * @author shanzhu
 * @version 1.0 2011-9-29
 */
package com.bushyou.servlet.context;

import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
import java.util.HashMap;

import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.bushyou.action.IAction;

public class ValueMap<K, V> extends HashMap<K, V> {

    /**
     * 
     */
    private static final long serialVersionUID = 4023788960770640801L;

    HttpServletRequest request;
    HttpServletResponse response;
    ServletContext servletContext;
    IAction action;

    public void setRequest(HttpServletRequest request) {
        this.request = request;
    }

    public void setResponse(HttpServletResponse response) {
        this.response = response;
    }

    public void setServletContext(ServletContext servletContext) {
        this.servletContext = servletContext;
    }

    @Override
    public V get(Object key) {
        V v = null;
        Class classType = action.getClass();
        try {
            Field field = classType.getDeclaredField((String) key);
            if (!Modifier.isPublic(field.getModifiers())) {
                field.setAccessible(true);
            }
            v = (V) field.get(action);
        } catch (SecurityException e) {
        } catch (NoSuchFieldException e) {
        } catch (IllegalArgumentException e) {
        } catch (IllegalAccessException e) {
        }
        if (v != null) {
            return v;
        }
        v = super.get(key);
        if (v != null) {
            return v;
        }
        v = (V) request.getAttribute(key + "");
        if (v != null) {
            return v;
        }

        return v;
    }

    public void setAction(IAction action) {
        this.action = action;
    }

}

从标签中取值的相应的类。


<?xml version="1.0" encoding="UTF-8" ?>
<taglib 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-jsptaglibrary_2_0.xsd"
	version="2.0">
	<tlib-version>1.0</tlib-version>
	<short-name>b</short-name>
	<uri>http://www.koubei.com</uri>
	<tag>
		<name>property</name>
		<tag-class>com.bushyou.servlet.tag.PropertyTag</tag-class>
		<body-content>JSP</body-content>
		<attribute>
			<name>value</name>
			<required>false</required>
			<rtexprvalue>false</rtexprvalue>
			<description><![CDATA[Value to be displayed]]></description>
		</attribute>
		<attribute>
			<name>escape</name>
			<required>false</required>
			<rtexprvalue>false</rtexprvalue>
			<description><![CDATA[ Whether to escape HTML]]></description>
		</attribute>
	</tag>

</taglib> 

tld文件。
现在写点测试的例子:
/**
 * mvc的m的入口
 *
 * @author shanzhu
 * @version 1.0 2011-9-29
 */
package com.bushyou.action;

import java.io.Serializable;

public interface IAction extends Serializable{
    String excute();
}

/**
 * hello的例子
 *
 * @author shanzhu
 * @version 1.0 2011-9-29
 */
package com.bushyou.action;

public class YeXiaoGangHelloAction implements IAction{

    /**
     * 
     */
    private static final long serialVersionUID = -5712396283469842107L;
    private String str1;
    private String str2;
    @Override
    public String excute() {
        str1 = "hello str1";
        str2 = "hello str2";
        return "success";
    }
    public String getStr1() {
        return str1;
    }
    public void setStr1(String str1) {
        this.str1 = str1;
    }
    public String getStr2() {
        return str2;
    }
    public void setStr2(String str2) {
        this.str2 = str2;
    }

}
/**
 * test的例子
 *
 * @author shanzhu
 * @version 1.0 2011-9-29
 */
package com.bushyou.action;

public class YeXiaoGangTestAction implements IAction{

    /**
     * 
     */
    private static final long serialVersionUID = -5712396283469842107L;
    private String str1;
    private String str2;
    @Override
    public String excute() {
        str1 = "test str1";
        str2 = "test str2";
        return "success";
    }
    public String getStr1() {
        return str1;
    }
    public void setStr1(String str1) {
        this.str1 = str1;
    }
    public String getStr2() {
        return str2;
    }
    public void setStr2(String str2) {
        this.str2 = str2;
    }

}

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%><%@taglib prefix="b" uri="/bushyou" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>First HelloWorldServlet</title>
</head>
<body>
11
<br />
<b:property value="str1"></b:property>
<br />
22222
<br />
<b:property value="str2"></b:property>
</body>
</html>
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%><%@taglib prefix="b" uri="/bushyou" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>test</title>
</head>
<body>
<b:property value="str1"></b:property>
||
<b:property value="str2"></b:property>
</body>
</html>

在浏览器上输入http://localhost/testweb/yexiaogang/hello.html
              http://localhost/testweb/yexiaogang/test.html
就可以看到效果了。
分享到:
评论

相关推荐

    精简源码-spring-mvc 入门级使用,亲测好用

    总结来说,这个压缩包提供了一个精简版的 Spring MVC 入门教程,包含了源码和配置,适合初学者进行实践学习。通过这个项目,你可以学习到如何使用 Spring MVC 构建 Web 应用,理解 MVC 设计模式,熟悉 Spring MVC 中...

    JAVA留言版精简版

    【JAVA留言版精简版】是一个基于JAVA技术的开发项目,旨在为学习和探讨JAVA技术的用户...通过参与这样的项目,开发者可以提升自己的技能,更好地理解MVC架构和数据库交互,从而为实际工作中的软件开发打下坚实基础。

    2018精简版ssh框架

    Struts2是MVC(Model-View-Controller)架构的实现,它简化了Java Servlet的开发,提供了一种组织应用逻辑的方式。在Struts2中,Action类是业务逻辑的核心,通过配置文件或注解与URL进行绑定,接收并处理用户请求,...

    J2EE复习冲刺精简版1

    J2EE复习冲刺精简版1主要涵盖了Spring MVC和Struts框架的相关知识,这两个都是Java企业级开发中常用的MVC(Model-View-Controller)架构模式实现。以下是这些知识点的详细说明: **Spring MVC** Spring MVC是Spring...

    基于JAVA的选课管理系统(精简版)

    《基于JAVA的选课管理系统(精简版)》是一个实用的教育信息化解决方案,它结合了JAVA编程语言、Bootstrap前端框架和MySQL数据库技术,为教育机构提供了便捷的学生选课管理服务。下面将详细介绍这个系统的相关知识点...

    Java之SSH深入浅出——精简剖析

    ### Java之SSH深入浅出——精简剖析:Struts框架详解 #### Struts框架起源与发展历程 Struts框架,作为Apache Jakarta项目的重要组成部分,自诞生之初便承载着推动JavaServer Pages(JSP)、Servlet、标签库及面向...

    使用IntelliJ IDEA开发基于Maven+Spring MVC的入门Java项目下载

    Spring MVC是Spring框架的一部分,用于构建Web应用程序的模型-视图-控制器(MVC)架构。 描述中提到的“最简单最精简的Java Spring Mvc项目”意味着这个项目具有最小化的依赖和配置,适合初学者快速上手。它应该...

    javaweb bbs项目精简

    【JavaWeb BBS项目精简】是一个专注于简化和优化基于JavaWeb技术的...通过对这个精简版BBS项目的探索和实践,开发者不仅可以提升JavaWeb开发技能,还能加深对SSH2框架的理解,为未来更复杂的Web应用开发打下坚实基础。

    Java之SSH深入浅出—精简剖析

    - **MVC架构**: Struts采用MVC(Model-View-Controller)架构,将程序代码划分为三个部分: - **Model**: 负责业务逻辑和数据管理。 - **View**: 负责展示数据和接收用户输入。 - **Controller**: 控制业务流程,...

    Java从小白到大牛精简版-综合文档

    11. **Java EE**:包括Servlet、JSP、JDBC等技术,是构建Web应用的基础,理解MVC架构和数据库操作。 12. **Spring框架**:Spring是Java企业级应用的主流框架,涵盖IoC、AOP、Spring MVC、Spring Boot等内容,理解其...

    ssh精简jar包下载

    这个框架集合提供了模型-视图-控制器(MVC)架构模式,数据库持久化,以及业务逻辑管理,使得开发者能够高效地构建动态、数据驱动的Web应用。 Struts2作为MVC框架,负责处理HTTP请求,展示视图,并控制应用的流程。...

    CXF开发最精简包

    3. `org.springframework.web.servlet-3.1.1.RELEASE.jar`:Web MVC模块,用于构建基于Servlet的Web应用程序,提供了模型-视图-控制器架构的支持。 4. `org.springframework.web-3.1.1.RELEASE.jar`:Web基础模块,...

    springmv4.2框架项目demo,可以学习用。简洁的demo

    在描述中提到的"简洁的demo"是一个用于学习的项目,表明它是精简版,方便初学者理解和实践。 1. **Spring MVC基本概念**: - **Model**:模型层,通常由JavaBean对象组成,负责存储和处理业务数据。 - **View**:...

    j2ee课件专业的精简的Java的高端

    J2EE是一个多层架构的开放标准,它为开发和部署分布式企业应用提供了全面的框架。这个平台包括了一系列的服务、API和协议,用于构建可伸缩、安全、跨平台的应用程序。 **Struts框架详解** Struts是J2EE生态中的一个...

    Spring、Hibernate、Struts(SSH)精简jar包

    而Struts则专注于MVC(Model-View-Controller)架构模式,协调应用程序的行为。"SSH整合之后的精简jar包"意味着这个压缩包包含了这三个框架的核心组件,去除了不必要的额外资源,方便开发者快速搭建和运行基于SSH的...

    基于jsp的新闻发布系统(LW).zip

    1. **源码结构**:可能包括`src`目录,其中按照MVC(Model-View-Controller)架构组织代码,分为模型类、控制器类和视图JSP页面。 - **模型**(Model):负责业务逻辑和数据处理,可能包含数据库操作和实体类。 - ...

    jboss-3.2.1_tomcat-4.1.24.zip

    书中不仅详细介绍了Struts框架的核心概念和技术细节,还通过实例展示了如何使用Struts来实现MVC架构模式,从而帮助读者快速上手并掌握Struts框架。 ### 3. 其他标签相关知识点 #### .NET与Ajax .NET Framework是...

    struts-2.5.26-min-lib.zip

    Struts 2.5.26-min-lib.zip是一个精简版的库文件集合,主要包含了运行Struts 2应用程序所需的最小依赖库。这个压缩包可能包含了核心库、插件和其他必要的组件,旨在帮助开发者快速搭建Struts 2环境,而不必下载完整...

    struts-2.3.31-min-lib

    总结来说,"struts-2.3.31-min-lib"是一个精简版的Struts 2框架库,适用于需要快速搭建基于Struts 2的Java Web应用程序的开发者。在使用时,开发者需了解Struts 2的基本概念和配置,结合项目需求选择必要的依赖和...

Global site tag (gtag.js) - Google Analytics