- 浏览: 19537 次
- 性别:
- 来自: 杭州
最新评论
-
mozhenghua:
月工!!!!
【转】 spring自定义标签实现 -
Sweblish:
仔细拜读中。。。。
struts的include标签的修改,使支持http形式 -
jiangfangyuan:
nb。。刚哥 顶起
struts的include标签的修改,使支持http形式 -
lwg2001s:
牛B啊,山猪...
struts的include标签的修改,使支持http形式 -
mozhenghua:
刚哥加油!!!!
struts的include标签的修改,使支持http形式
写了个最简单的最粗糙的mvc的架构。
在web的xml中配置过滤器以及在页面上显示的标签。
将web的含有.html的请求都经过FilterDispatcher这个过滤器。
在FilterDispatcher中。
在上面的代码中。我们已经将整个mvc的过程走完了。
当请求经过这个过滤器的时候,过滤器想将值域放入request对象,然后反射出action对象。执行提供出去的excuse方法。
上面是jsp的自定义标签的方法。
从标签中取值的相应的类。
tld文件。
现在写点测试的例子:
在浏览器上输入http://localhost/testweb/yexiaogang/hello.html
http://localhost/testweb/yexiaogang/test.html
就可以看到效果了。
在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 构建 Web 应用,理解 MVC 设计模式,熟悉 Spring MVC 中...
【JAVA留言版精简版】是一个基于JAVA技术的开发项目,旨在为学习和探讨JAVA技术的用户...通过参与这样的项目,开发者可以提升自己的技能,更好地理解MVC架构和数据库交互,从而为实际工作中的软件开发打下坚实基础。
Struts2是MVC(Model-View-Controller)架构的实现,它简化了Java Servlet的开发,提供了一种组织应用逻辑的方式。在Struts2中,Action类是业务逻辑的核心,通过配置文件或注解与URL进行绑定,接收并处理用户请求,...
J2EE复习冲刺精简版1主要涵盖了Spring MVC和Struts框架的相关知识,这两个都是Java企业级开发中常用的MVC(Model-View-Controller)架构模式实现。以下是这些知识点的详细说明: **Spring MVC** Spring MVC是Spring...
《基于JAVA的选课管理系统(精简版)》是一个实用的教育信息化解决方案,它结合了JAVA编程语言、Bootstrap前端框架和MySQL数据库技术,为教育机构提供了便捷的学生选课管理服务。下面将详细介绍这个系统的相关知识点...
### Java之SSH深入浅出——精简剖析:Struts框架详解 #### Struts框架起源与发展历程 Struts框架,作为Apache Jakarta项目的重要组成部分,自诞生之初便承载着推动JavaServer Pages(JSP)、Servlet、标签库及面向...
Spring MVC是Spring框架的一部分,用于构建Web应用程序的模型-视图-控制器(MVC)架构。 描述中提到的“最简单最精简的Java Spring Mvc项目”意味着这个项目具有最小化的依赖和配置,适合初学者快速上手。它应该...
【JavaWeb BBS项目精简】是一个专注于简化和优化基于JavaWeb技术的...通过对这个精简版BBS项目的探索和实践,开发者不仅可以提升JavaWeb开发技能,还能加深对SSH2框架的理解,为未来更复杂的Web应用开发打下坚实基础。
- **MVC架构**: Struts采用MVC(Model-View-Controller)架构,将程序代码划分为三个部分: - **Model**: 负责业务逻辑和数据管理。 - **View**: 负责展示数据和接收用户输入。 - **Controller**: 控制业务流程,...
11. **Java EE**:包括Servlet、JSP、JDBC等技术,是构建Web应用的基础,理解MVC架构和数据库操作。 12. **Spring框架**:Spring是Java企业级应用的主流框架,涵盖IoC、AOP、Spring MVC、Spring Boot等内容,理解其...
这个框架集合提供了模型-视图-控制器(MVC)架构模式,数据库持久化,以及业务逻辑管理,使得开发者能够高效地构建动态、数据驱动的Web应用。 Struts2作为MVC框架,负责处理HTTP请求,展示视图,并控制应用的流程。...
3. `org.springframework.web.servlet-3.1.1.RELEASE.jar`:Web MVC模块,用于构建基于Servlet的Web应用程序,提供了模型-视图-控制器架构的支持。 4. `org.springframework.web-3.1.1.RELEASE.jar`:Web基础模块,...
在描述中提到的"简洁的demo"是一个用于学习的项目,表明它是精简版,方便初学者理解和实践。 1. **Spring MVC基本概念**: - **Model**:模型层,通常由JavaBean对象组成,负责存储和处理业务数据。 - **View**:...
J2EE是一个多层架构的开放标准,它为开发和部署分布式企业应用提供了全面的框架。这个平台包括了一系列的服务、API和协议,用于构建可伸缩、安全、跨平台的应用程序。 **Struts框架详解** Struts是J2EE生态中的一个...
而Struts则专注于MVC(Model-View-Controller)架构模式,协调应用程序的行为。"SSH整合之后的精简jar包"意味着这个压缩包包含了这三个框架的核心组件,去除了不必要的额外资源,方便开发者快速搭建和运行基于SSH的...
1. **源码结构**:可能包括`src`目录,其中按照MVC(Model-View-Controller)架构组织代码,分为模型类、控制器类和视图JSP页面。 - **模型**(Model):负责业务逻辑和数据处理,可能包含数据库操作和实体类。 - ...
书中不仅详细介绍了Struts框架的核心概念和技术细节,还通过实例展示了如何使用Struts来实现MVC架构模式,从而帮助读者快速上手并掌握Struts框架。 ### 3. 其他标签相关知识点 #### .NET与Ajax .NET Framework是...
Struts 2.5.26-min-lib.zip是一个精简版的库文件集合,主要包含了运行Struts 2应用程序所需的最小依赖库。这个压缩包可能包含了核心库、插件和其他必要的组件,旨在帮助开发者快速搭建Struts 2环境,而不必下载完整...
总结来说,"struts-2.3.31-min-lib"是一个精简版的Struts 2框架库,适用于需要快速搭建基于Struts 2的Java Web应用程序的开发者。在使用时,开发者需了解Struts 2的基本概念和配置,结合项目需求选择必要的依赖和...