- 浏览: 90372 次
最新评论
-
守望者:
我也是出现了同样的错误,应该不是楼上这位仁兄说的Tomcat的 ...
appfuse 1.9.4 错误 -
huanghero0663:
不是tomcat的问题,而是你在电脑上的环境变量写错了,app ...
appfuse 1.9.4 错误
1、Servlet Filter概述
凡是开发过J2EE的web application的人员都知道,经常需要处理以下几种情况:
访问特定资源(Web 页、JSP 页、servlet)时的身份认证
应用程序级的访问资源的审核和记录
应用程序范围内对资源的加密访问,它建立在定制的加密方案基础上
对被访问资源的及时转换, 包括从 servlet 和 JSP 的动态输出
在servlet2.3之前这些功能处理是很难实现的,但是Java Servlet 2.3 规范新增了不少激动人心的功能,其中之一便是过滤器(Filter),其实这就是我们所说的管道和过滤器体系架构在J2EE中的应用实践. 通过使用该模式使得Web Application开发者能够在请求到达Web资源之前截取请求,在处理请求之后修改应答。其结构图如下:
一个执行过滤器的Java 类必须实现javax.servlet.Filter 接口。这一接口含有三个方法:
init(FilterConfig):这是容器所调用的初始化方法。它保证了在第一次 doFilter() 调用前由容器调用。它能获取在 web.xml 文件中指定的filter初始化参数。
doFilter(ServletRequest, ServletResponse, FilterChain):这是一个完成过滤行为的方法。它同样是上一个过滤器调用的方法。引入的 FilterChain 对象提供了后续过滤器所要调用的信息。
destroy():容器在销毁过滤器实例前,doFilter()中的所有活动都被该实例终止后,调用该方法。
2、Filter链介绍
所有过滤器都服从调用的过滤器链,并通过定义明确的接口得到执行。WebApplication可以指定许多过滤器来完成相关的工作.那么它们就组成一个过滤器链来完成相应的工作.其结构如下图:
3、例子
3.1 简单filter
在PetStore1.3.1中的就存在两个Filter过滤器.其中一个过滤器,完成字符集的编码的转化,如大家经常遇到的汉字编码问题,你只需配置为GBK即可.它从Web.xml之中读取这些参数的配置信息,然后进行编码的转化.另一个是安全校验Fliter,它负责进行安全检查哪些页面可以进行,哪些不可。它们组成一个Filter链,结构图和实现代码如下:
public class EncodingFilter implements Filter { private FilterConfig config = null; // default to ASCII private String targetEncoding = "ASCII"; public void init(FilterConfig config) throws ServletException { this.targetEncoding = config.getInitParameter("encoding"); } //在过滤器中实现字符集编码转化 public void doFilter(ServletRequest srequest, ServletResponse sresponse, FilterChain chain) throws IOException, ServletException { HttpServletRequest request = (HttpServletRequest)srequest; request.setCharacterEncoding(targetEncoding); // move on to the next chain.doFilter(srequest,sresponse); } public void destroy() { ................. } } public class SignOnFilter implements Filter { public void init(FilterConfig config) throws ServletException { this.config = config; URL protectedResourcesURL = null; try { protectedResourcesURL = config.getServletContext().getResource("/WEB-INF/signon-config.xml"); ............... } catch (java.net.MalformedURLException ex) { System.out.println("SignonFilter: malformed URL exception: " + ex); } } public void destroy() { config = null; } public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { ........ } } |
容器通过 Web 应用程序中的配置描述符 web.xml 文件解析过滤器配置信息。有两个新的标记与过滤器相关:<filter> 和 <filter-mapping>。<filter> 标记是一个过滤器定义,它必定有一个 <filter- name> 和 <filter-class> 子元素。<filter-name> 子元素给出了一个与过滤器实例相关的名字。<filter-class> 指定了由容器载入的实现类。您能随意地包含一个 <init-param> 子元素为过滤器实例提供初始化参数。<filter-mapping> 标记代表了一个过滤器的映射,指定了过滤器会对其产生作用的 URL 的子集。
<!-- Encoding Filter Declaration Start --> <filter> <filter-name>EncodingFilter</filter-name> <display-name>Encoding Filter</display-name> <description>no description</description> <filter-class>com.sun.j2ee.blueprints.encodingfilter.web.EncodingFilter</filter-class> <init-param> <param-name>encoding</param-name> <param-value>UTF-8</param-value> </init-param> </filter> <!-- Encoding Filter Declaration End --> <!-- Signon Filter Declaration Start --> <filter> <filter-name>SignOnFilter</filter-name> <display-name>SignOn Filter</display-name> <description>no description</description> <filter-class>com.sun.j2ee.blueprints.signon.web.SignOnFilter</filter-class> </filter> <!-- Signon Filter Declaration End --> <!-- Encoding Filter Mapping Start--> <filter-mapping> <filter-name>EncodingFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <!-- Encoding Filter Mapping End --> <!-- Signon Filter Mapping Start--> <filter-mapping> <filter-name>SignOnFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <!-- Signon Filter Mapping End --> |
3.2 复杂的filter
上面是petstore的例子,演示了通过Fliter修改字符编码和安全认证的功能。下面提供一个示例演示通过修改返回数据(通过过滤器把response的字符串变成大写)。
public class UCaseResponse extends HttpServletResponseWrapper { public UCaseResponse(HttpServletResponse response) { super(response); } public PrintWriter getWriter() throws IOException { return new UCaseWriter(super.getWriter()); } } public class UCaseWriter extends PrintWriter { public UCaseWriter(Writer out) { super(out); } public void write(int c) { super.write(Character.toUpperCase( (char) c)); } public void write(char buf[], int off, int len) { for (int i = 0;i < len;i++) { write(buf[off + i]); } } public void write(String s, int off, int len) { for (int i = 0;i < len;i++) { write(s.charAt(off + i)); } } } public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain) { try { filterChain.doFilter(request, new UCaseResponse((HttpServletResponse)(response))); }catch(Exception sx) { filterConfig.getServletContext().log(sx.getMessage()); } |
该示例使用HttpServletResponseWrapper技术,它是对HttpServletResponse的包装,其实就是装饰(decorate)设计模式的应用.这个例子能够工作的关键是UCaseResponse和UCaseWriter类,它实现了对每个要输出的字符都转成了大写后再写入实际的输出流的功能。
4、体系架构的实现
实现一个管道和过滤器一般要注意以下几个方面:
把系统任务分成一系列处理阶段。
根据管道和过滤器的设计方案,必须把系统处理的任务分割成相应独立的任务,如日志,数据转化,安全认证等。这样每个阶段仅依赖其前一阶段的输出。通过数据流将所有阶段相连起来。并且你可以进行替换每个步骤,或者可以调整它们之间的顺序,以产生新的结果.如petstore中的编码转化Filter和安全Filter,分成两个独立的处理阶段。
定义沿每个管道传输的数据格式。
我们知道每个过滤器,定义一个统一格式以获得最大的灵活性,因为它使过滤器的重组变得容易。如:每个过滤器的方法是doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain)它们的参数是必须相同的。
决定如何实现每个管道连接
Filter过滤器的连接是推得方式来实现的.前一个过滤器主动的调用filterChain.doFilter(request, response);来实现转向下一个过滤器。
设计和实现过滤器
设计每个Filter具有独立的功能,如编码转化,安全校验,等功能.并且每个Fliter都应该在实现javax.servlet.Filter接口。
建立处理流水线
过滤器的部署是在Web.xml中进行配置,描述过滤器的实现类以及它们的map关系,来确定它们的顺序。
其他应用实例
1、JBOSS
如果大家对EJB了解,应该知道客户调用EJB实际上并不是直接引用EJB实例(ejb instance).它通过容器来截获客户端的请求,然后按照EJB描述符做些许多相应的工作如,安全校验,事务的处理,线程并发处理等.这样就可以使开发人员仅关心自己的业务逻辑,而不需对复杂的基础服务进行实现.使开发人员从繁琐的工作中解脱出来.集中精力处理自己的业务逻辑,它的结构图如下:
笔者有幸阅读了JBOSS的源码,分析了Jboss的EJB容器的实现. EJB的容器通过许多拦截器(Inteceptor)来实现,每个拦截器处理一定的功能,一个处理结束后转发给下一个拦截器,最后一个拦截器才把真正调用EJB的实例.其中它的EntityBean 容器的拦截器的结构如下:
我们看其中的log拦截器
public class LogInterceptor extends AbstractInterceptor{ public Object invoke(Invocation invocation) throws Exception { boolean trace = log.isTraceEnabled(); // Log call details if (callLogging) { ......进行log的处理 } //处理结束,把请求转发给下一个拦截器 return getNext().invoke(invocation); } |
这些拦截器配置在standardjboss.xml文件中,如下:
<container-interceptors> <interceptor>org.jboss.ejb.plugins.LogInterceptor</interceptor> <interceptor>org.jboss.ejb.plugins.SecurityInterceptor</interceptor> <interceptor>org.jboss.ejb.plugins.TxInterceptorCMT</interceptor> <interceptor metricsEnabled="true">org.jboss.ejb.plugins.MetricsInterceptor</interceptor> <interceptor>org.jboss.ejb.plugins.EntityLockInterceptor</interceptor> <interceptor>org.jboss.ejb.plugins.EntityInstanceInterceptor</interceptor> <interceptor>org.jboss.resource.connectionmanager.CachedConnectionInterceptor</interceptor> <interceptor>org.jboss.ejb.plugins.EntitySynchronizationInterceptor</interceptor> <interceptor>org.jboss.ejb.plugins.cmp.jdbc.JDBCRelationInterceptor</interceptor> </container-interceptors> |
这就是Jboss容器架构最巧妙的地方,最初这个架构就是由天才少年Rickard Oberg提出的.其实这个架构就应用我们讨论的管道和过滤器模式,其实每个拦截器就是一个过滤器,使用该模式给Jboss带来了如下的好处:
使系统的架构更容易理解,因为每个过滤器完成单一的功能。
使系统更加模块化,有利于系统的模块重用和扩展,如果系统想增加某种功能只需增加一个实现Interceptor接口的拦截器,然后配置在standardjboss.xml文件中即可。
使系统的容易进行错误处理,如果在一个拦截器中发现错误(error)或者异常(exception),只需返回即可.
2、AXIS
无独有偶,同样在Axis上也应用了管道和过滤器模式.Aixs是apache开源的webservice实现服务器。简单的说,axis就是处理Message,它首先截获客户端的请求,然后转发到真正的实现业务逻辑上处理客户端的请求,在这之前经过一系列的handler处理.它的结构很像EJB容器.其实就是管道和过滤器模式的应用,Handler就是过滤器.它的处理顺序主要考虑两个方面一个是部署描述符(deployment configuration )另一个就是是客户端还是服务器端。Handler处理的对象是MessageContext它的由3个重要的部分组成,一是一个request Message,一个是response message,还有许多属性。
我们经研究源码分析,在服务器端,有一个Transport Listener 它监听客户端的请求, 可以通过多种协议,一旦有客户请求,它将按照协议的规范把数据解析生成生成一个Message对象,然后把它设置到MessageContext,然后调用一系列的Handler进行处理。
其结构图如下:
相关设计模式
在使用管道和过滤器模式时,一般会使用以下的GOF设计模式。
1、职责链模式(Chain Of Responsibility)
职责链设计模式的意图就是使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。其实管道和过滤器模式就是职责链模式的抽象,把它应用到软件体系架构中。
2、 命令模式(Command)
命令模式的意图将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤消的操作。在管道和过滤器模式中每个过滤器一般使用命令模式,把请求封装成一个命令进行处理。
3、装饰模式(Decorator)
装饰模式的意图就是动态地给一个对象添加一些额外的职责。就增加功能来说,Decorator模式相比生成子类更为灵活。
在管道和过滤器模式中,在每个过滤器中经常需要对请求进行动态的增加功能,或者修改请求的内容,这时一般会使用装饰模式.如Servlet filter的javax.servlet.http.HttpServletRequestWrapper, javax.servlet.http.HttpServletResponseWrapper就是装饰模式的应用.
总结
本文讨论了管道和过滤器模式的解决方案,以及它的优缺点.然后以J2EE规范的Servlet Filter为例详细介绍了怎样应用该模式,同时简单的介绍了在Jboss,Axis中的应用。
struts中文的解决 filter的一种用法
1.使ApplicationResources.properties支持中文
建立一个ApplicationResources_ISO.properties文件,把应用程序用的message都写进去,然后在dos下执行这个命令,
native2ascii -encoding gb2312 ApplicationResources_ISO.properties ApplicationResources.properties
这样就会将ISO编码的ApplicationResources转换成GB2312编码的格式了,同时保存到ApplicationResources.properties.
native2ascii这个工具是jdk自带的一个东东,所以如果path都设定正确就可以直接运行了,你可以在$java_home$/bin下找到他。
转换后的中文类似于这个样子
iso 格式下 :tj.type=商品车类型
gb2312格式下 :tj.type=\u5546\u54c1\u8f66\u7c7b\u578b
然后在struts-config.xml中设置应用这个资源文件
<message-resources parameter="com.huahang.tj.ApplicationResources" key="org.apache.struts.action.MESSAGE"></message-resources>
开发jsp时在jsp的开头写上<!---->,将字符集设置成gb2312就可以了。
2.使数据库操作支持中文。
数据库操作支持中文一直让我比较头痛,但是感谢善解人衣向我推荐了www.chinaxp.org,这个网站是用struts框架开发的,而且
开放源码,下载了源码后发现它的中文处理得很好,阅读部分源码,没有发现什么特殊的字符集转换,很纳闷,偶然看到楼上网友
留言知道原来servlet可以统一设置字符转换。chinaxp.org就是这么做的。
在web.xml中加上
- <filter>
- <filter-name>Set Character Encoding</filter-name>
- <filter-class>com.huahang.tj.struts.filters.SetCharacterEncodingFilter</filter-class>
- <init-param>
- <param-name>encoding</param-name>
- <param-value>GB2312</param-value>
- </init-param>
- <init-param>
- <param-name>ignore</param-name>
- <param-value>true</param-value>
- </init-param>
- </filter>
- <filter-mapping>
- <filter-name>Set Character Encoding</filter-name>
- <servlet-name>action</servlet-name>
- </filter-mapping>
这里会涉及一个bean,源码如下:
- /*
- * XP Forum
- *
- * Copyright (c) 2002-2003 RedSoft Group. All rights reserved.
- *
- */
- package com.huahang.tj.struts.filters;
- import javax.servlet.*;
- import java.io.IOException;
- /**
- * <p>Filter that sets the character encoding to be used in parsing the
- * incoming request, either unconditionally or only if the client did not
- * specify a character encoding. Configuration of this filter is based on
- * the following initialization parameters:</p>
- * <ul>
- * <li><strong>encoding</strong> - The character encoding to be configured
- * for this request, either conditionally or unconditionally based on
- * the <code>ignore</code> initialization parameter. This parameter
- * is required, so there is no default.</li>
- * <li><strong>ignore</strong> - If set to "true", any character encoding
- * specified by the client is ignored, and the value returned by the
- * <code>selectEncoding()</code> method is set. If set to "false,
- * <code>selectEncoding()</code> is called <strong>only</strong> if the
- * client has not already specified an encoding. By default, this
- * parameter is set to "true".</li>
- * </ul>
- *
- * <p>Although this filter can be used unchanged, it is also easy to
- * subclass it and make the <code>selectEncoding()</code> method more
- * intelligent about what encoding to choose, based on characteristics of
- * the incoming request (such as the values of the <code>Accept-Language</code>
- * and <code>User-Agent</code> headers, or a value stashed in the current
- * user's session.</p>
- *
- * @author <a href="mailto:jwtronics@yahoo.com">John Wong</a>
- *
- * @version $Id: SetCharacterEncodingFilter.java,v 1.1 2002/04/10 13:59:27 johnwong Exp $
- */
- public class SetCharacterEncodingFilter implements Filter {
- // ----------------------------------------------------- Instance Variables
- /**
- * The default character encoding to set for requests that pass through
- * this filter.
- */
- protected String encoding = null;
- /**
- * The filter configuration object we are associated with. If this value
- * is null, this filter instance is not currently configured.
- */
- protected FilterConfig filterConfig = null;
- /**
- * Should a character encoding specified by the client be ignored?
- */
- protected boolean ignore = true;
- // --------------------------------------------------------- Public Methods
- /**
- * Take this filter out of service.
- */
- public void destroy() {
- this.encoding = null;
- this.filterConfig = null;
- }
- /**
- * Select and set (if specified) the character encoding to be used to
- * interpret request parameters for this request.
- *
- * @param request The servlet request we are processing
- * @param result The servlet response we are creating
- * @param chain The filter chain we are processing
- *
- * @exception IOException if an input/output error occurs
- * @exception ServletException if a servlet error occurs
- */
- public void doFilter(ServletRequest request, ServletResponse response,
- FilterChain chain)
- throws IOException, ServletException {
- // Conditionally select and set the character encoding to be used
- if (ignore || (request.getCharacterEncoding() == null)) {
- String encoding = selectEncoding(request);
- if (encoding != null)
- request.setCharacterEncoding(encoding);
- }
- // Pass control on to the next filter
- chain.doFilter(request, response);
- }
- /**
- * Place this filter into service.
- *
- * @param filterConfig The filter configuration object
- */
- public void init(FilterConfig filterConfig) throws ServletException {
- this.filterConfig = filterConfig;
- this.encoding = filterConfig.getInitParameter("encoding");
- String value = filterConfig.getInitParameter("ignore");
- if (value == null)
- this.ignore = true;
- else if (value.equalsIgnoreCase("true"))
- this.ignore = true;
- else if (value.equalsIgnoreCase("yes"))
- this.ignore = true;
- else
- this.ignore = false;
- }
- // ------------------------------------------------------ Protected Methods
- /**
- * Select an appropriate character encoding to be used, based on the
- * characteristics of the current request and/or filter initialization
- * parameters. If no character encoding should be set, return
- * <code>null</code>.
- * <p>
- * The default implementation unconditionally returns the value configured
- * by the <strong>encoding</strong> initialization parameter for this
- * filter.
- *
- * @param request The servlet request we are processing
- */
- protected String selectEncoding(ServletRequest request) {
- return (this.encoding);
- }
- }//EOC
加上这个后,在action中就可以直接从form中接收gb2312编码的数据了,返回时自然也是gb2312了。
但是这个好像需要servlet 2.2以上的容器
发表评论
-
出现java.lang.UnsupportedClassVersionError 错误的原因
2007-04-18 13:55 2330出现java.lang.UnsupportedClassVer ... -
log4cplus学习笔记(二)
2007-03-27 13:11 8901log4cplus在很多方面做的都很出色,但是使用过程有些地 ... -
log4cplus学习笔记(一)
2007-03-27 13:00 59391(一)log4cplus是C++编写的开源的日志系统,功能非常 ... -
Java基础知识总结
2007-02-08 16:32 181、对象的初始化 ... -
Java及相关字符集编码问题研究
2007-01-09 10:45 12451. ... -
编写安全的Java代码
2007-01-09 09:54 1329本文是来自Sun官方站点的一篇关于如何编写安全的Java代码的 ... -
Filter的作用
2006-12-14 15:27 10189你可以在两种情况下使用本文: ·学习过滤器的功用, ·作为你写 ... -
java 日期的处理2
2006-12-12 11:22 63cal1.add(Calendar.WEEK_OF_ ... -
关于Oracle9i日期格式几点要说明的问题
2006-12-12 11:02 751. 在 Oracle9i 之前, 日期格式的数据类型默认格式 ... -
java 日期的处理1
2006-12-12 11:22 40java中常见的日期时间类 Date 类 最基础的日期时间 ... -
SQL语句集
2006-12-12 10:35 62--语 句 功 能 --数据操作 S ... -
JDBC
2006-12-11 11:47 54java 代码 String strDri ...
相关推荐
labview源码参考示例,可供参考学习使用
labview源码参考示例,可供参考学习使用
混合策略改进的麻雀搜索算法 matlab代码 改进1:佳点集种群初始化 改进2:采用黄金正弦策略改进发现者位置更新公式 改进3:采用Levy飞行策略增强算法跳出局部最优的能力 - 仿真图中包含改进后的ISSA算法与原始SSA算法的比较 - 包含23种测试函数
1. 用户角色 普通用户 交通执法人员 管理员 2. 功能描述 普通用户功能 账号注册与登录 支持使用邮箱、手机号或社交媒体账户进行注册和登录。 提供个人资料管理功能,包括姓名、联系方式、车辆信息等。 交通信息查询 实时查询交通路况,包括拥堵情况、事故报告和施工信息。 查询公交、地铁等公共交通的实时到站信息和运营时间。 导航与路线规划 提供最优路线规划功能,根据实时交通数据优化行车路线。 支持多种出行方式选择(驾车、步行、公共交通等)。 违章查询与处理 查询个人车辆的违章记录,查看详细信息。 提供在线支付违章罚款的功能,简化处理流程。 交通安全举报 提供交通违法行为的在线举报功能,附带照片和位置标注。 跟踪举报处理进度,获取反馈信息。 活动与公告信息 查看交通管理部门发布的最新公告、政策和交通活动信息。 参与公众咨询和意见征集,提升参与感。 社区互动 提供讨论区,让用户分享出行经验、提供建议和交流信息。 用户可以互相解答问题,增强社区氛围。 交通执法人员功能 执法管理 登录系统后可查看自己负责区域的交通动态和违章记录。 在现场执法过程中,能够实时更新违章信息并生成执法记
1. 用户角色 管理员 养老服务人员 老年人 家属/亲友 2. 功能描述 管理员功能 用户管理 管理各类用户(老年人、家属、服务人员)的注册、审核和信息维护。 设置不同角色的权限,确保系统安全性。 服务项目管理 创建、编辑和删除养老服务项目,包括护理服务、陪伴、康复、餐饮等。 审核新增服务内容,确保服务质量和合规性。 预约管理 管理老年人的服务预约,包括预约确认、修改和取消。 跟踪服务人员的工作安排和服务记录。 数据统计与分析 生成各类统计报告,如服务使用频率、用户满意度等,帮助优化服务。 分析老年人需求趋势,为决策提供数据支持。 财务管理 管理服务费用及收费记录,支持发票开具和支付管理。 预算编制和财务报表生成,确保资金透明。 养老服务人员功能 个人资料管理 注册并创建个人账户,填写基本信息(如姓名、专业技能、联系方式等)。 上传相关资格证明和培训证书。 服务项目查看 查看可提供的养老服务项目及相关要求。 跟进服务需求,了解老年人的具体需要。 预约服务 接受老年人的服务预约请求,确认服务时间和内容。 记录每次服务的具体情况和反馈。 沟通与反馈 与老年人及其家属保持沟
ONE·ONE,图文微信小程序-开源代码_ eapp ONE
古月居ROS机械臂开发代码和笔记_Development-of-robot-with-ROS
主播运营拉爆自然流,做懂流量的主播.mp4
将多个图像显示为子图的蒙太奇Matlab代码.rar
基于WordPress小程序API插件创建的WordPress小节目旅游主题,包括微信小程序、QQ小程序、百度智能小程序、今日头条小程序_旅游小程序
python数据挖掘分析可视化-武汉市出租车轨迹的数据挖掘与分析(数据集+源码+分析结果),个人大四毕业设计项目、经导师指导并认可通过的高分设计项目,评审分99分,代码完整确保可以运行,小白也可以亲自搞定,主要针对计算机相关专业的正在做毕设的学生和需要项目实战练习的学习者,也可作为课程设计、期末大作业。 python数据挖掘分析可视化-武汉市出租车轨迹的数据挖掘与分析(数据集+源码+分析结果)python数据挖掘分析可视化-武汉市出租车轨迹的数据挖掘与分析(数据集+源码+分析结果)python数据挖掘分析可视化-武汉市出租车轨迹的数据挖掘与分析(数据集+源码+分析结果)python数据挖掘分析可视化-武汉市出租车轨迹的数据挖掘与分析(数据集+源码+分析结果)python数据挖掘分析可视化-武汉市出租车轨迹的数据挖掘与分析(数据集+源码+分析结果)python数据挖掘分析可视化-武汉市出租车轨迹的数据挖掘与分析(数据集+源码+分析结果)python数据挖掘分析可视化-武汉市出租车轨迹的数据挖掘与分析(数据集+源码+分析结果)python数据挖掘分析可视化-武汉市出租车轨迹的数据挖掘与分
springboot183基于java的公寓报修管理系统,含有完整的源码和报告文档
基于蚁群算法的路径规划算法matlab代码,求解常见的路径规划问题。 内含算法的注释,模块化编程,新手小白可快速入门。 ACO算法,路径规划算法。
labview源码参考示例,可供参考学习使用
Java小程序项目源码,该项目包含完整的前后端代码、数据库脚本和相关工具,简单部署即可运行。功能完善、界面美观、操作简单,具有很高的实际应用价值,非常适合作为Java毕业设计或Java课程设计使用。 所有项目均经过严格调试,确保可运行!下载后即可快速部署和使用。 1 适用场景: 毕业设计 期末大作业 课程设计 2 项目特点: 代码完整:详细代码注释,适合新手学习和使用 功能强大:涵盖常见的核心功能,满足大部分课程设计需求 部署简单:有基础的人,只需按照教程操作,轻松完成本地或服务器部署 高质量代码:经过严格测试,确保无错误,稳定运行 3 技术栈和工具 前端:小程序 后端框架:SSM/SpringBoot 开发环境:IntelliJ IDEA 数据库:MySQL(建议使用 5.7 版本,更稳定) 数据库可视化工具:Navicat 部署环境:Tomcat(推荐 7.x 或 8.x 版本),Maven
windows 11系统打印机共享修复工具
汽车lar lqg 半主动 主动悬架 simulink
1.版本:matlab2014/2019a/2024a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。
springboot182基于springboot的网上服装商城,含有完整的源码和报告文档
1.版本:matlab2014/2019a/2024a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。