`

from Struts 2.0.x to 2.1.x

阅读更多

Troubleshooting guide migrating from Struts 2.0.x to 2.1.x

About the Migration guide

This guide describes how to migrate an existing Struts 2.0.x application to Struts 2.1.x. It is intended to be read from top to bottom but you may skip-ahead to known problems and common exceptions. Please edit this page or provide comments if you encounter additional issues.

 

Update Dependencies

Update your project dependences to use struts2-core-2.1.x and the plugins struts2-core-2.1.x.

There have been significant changes to the Configuration API between 2.0 and 2.1. Third-party plugins for 2.0 may not be compatible with 2.1.x.

Maven users can update their project's pom.xml to reference the new core and plugin versions. Ensure no dependencies in the freemarker groupId are used as the latest version used by Struts is now under the org.freeemarker groupId and will cause classpath conflicts.

If you need releases not considered General Availability you can use a staging repository where they are usually available:

<repositories>
    <repository>
      <id>struts2.1.2-staging</id>
      <name>Struts 2.1.2 staging repository</name>
      <layout>default</layout>
      <url>http://people.apache.org/builds/struts/2.1.2/m2-staging-repository/</url>
      <snapshots>
        <enabled>false</enabled>
      </snapshots>
    </repository>
  </repositories>

Non-Maven users can can download the jars and dependencies in a Distribution 2.1.2<!-- [if gte vml 1]><v:shape id="_x0000_i1027" type="#_x0000_t75" alt="" href="http://people.apache.org/builds/struts/2.1.2/" mce_href="http://people.apache.org/builds/struts/2.1.2/" title="&quot;Visit page outside Confluence&quot;" style='width:5.25pt;height:5.25pt' o:button="t"> <v:imagedata src="file:///C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp\msohtml1\01\clip_image002.gif" mce_src="file:///C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp\msohtml1\01\clip_image002.gif" o:href="http://cwiki.apache.org/confluence/images/icons/linkext7.gif" /> </v:shape><![endif]--><!-- [if !vml]--> <!-- [endif]-->

DELETE OLD VERSIONS NOW : It's essential that old versions of the jars are removed from your project as well as the deployment directories . Don't trust your IDE to delete unused versions.
eg. Your application is now be dependent on xwork-2.1.x, not xwork-2.0.x. Ensure xwork-2.0.x is completely removed or you will encounter compile-time and run-time exceptions.

Update Custom Type Converters

If your project implements custom type converters you may need to change the imports statements to use the com.opensymphony.xwork2.conversion package. Failing to do so will cause a compile-time error.

Before:

import com.opensymphony.xwork2.util.TypeConversionException;

After:

import com.opensymphony.xwork2.conversion.TypeConversionException;

Update struts.xml Configuration

Results and Interceptors have been renamed to use camelCase instead of hyphenated names (eg. now redirectAction instead of redirect-action).
Review all custom interceptor stacks, interceptor refs and results in struts.xml and remove the hyphen.

Interceptors:

From

To

external-ref

externalRef

model-driven

modelDriven

static-params

staticParams

scoped-model-driven

scopedModelDriven

servlet-config

servletConfig

token-session

tokenSession

Results:

From

To

redirect-action

redirectAction

plaintext

plainText

 

Forgetting to rename an interceptor or result reference will prevent your WebApp from starting. The following is a typical stacktrace for an invalid result type.

SEVERE: Exception starting filter struts2
Unable to load configuration. - action - file:/home/giaz/code/.metadata/.plugins/
            com.genuitec.eclipse.easie.tomcat.myeclipse/tomcat/webapps/webui/WEB-INF/classes/struts.xml:39:98
        at com.opensymphony.xwork2.config.ConfigurationManager.getConfiguration(ConfigurationManager.java:58)
        at org.apache.struts2.dispatcher.Dispatcher.init_PreloadConfiguration(Dispatcher.java:370)
...
Caused by: Error building results for action ScheduleJob in namespace  - action - file:/home/giaz/code/.metadata/.plugins/
             com.genuitec.eclipse.easie.tomcat.myeclipse/tomcat/webapps/webui/WEB-INF/classes/struts.xml:39:98
        at com.opensymphony.xwork2.config.providers.XmlConfigurationProvider.addAction(XmlConfigurationProvider.java:372)
        ... 30 more
Caused by: There is no result type defined for type 'redirect-action' mapped with name 'success' - result -

<!-- [if !supportLineBreakNewLine]-->
<!-- [endif]-->

 

 

 

Migrate plugin configuration

Tiles 2

If you use the Tiles 2 plugin, check your tiles.xml file(s) to ensure they contain a DOCTYPE.

<!DOCTYPE tiles-definitions PUBLIC "-

//Apache Software Foundation//DTD Tiles Configuration 2.0//EN"



       

"http:

//tiles.apache.org/dtds/tiles-config_2_0.dtd"
>



<tiles-definitions>

...

A missing DOCTYPE in your Tiles configuration will prevent your WebApp from starting. The following is a typical stacktrace for a missing Tiles DOCTYPE.

INFO: Initializing Tiles2 container. . .

Nov 22, 2007 11:38:11 AM org.apache.commons.digester.Digester error

SEVERE: Parse Error at line 2 column 19: Document is invalid: no grammar found.

org.xml.sax.SAXParseException: Document is invalid: no grammar found.

Ajax Theme / Dojo

If your WebApp uses the ajax theme bundled with Struts 2.0 (ajax tags), you need to update every pageas the Dojo support has been moved into a separate plugin and tag library.

1. Add the Dojo plugin as a new dependency for your project

<dependency>

        

<groupId>org.apache.struts</groupId>

        

<artifactId>struts2-dojo-plugin</artifactId>

        

<version>2.1.1</version>

    

</dependency>

2. Modify ALL pages that use the ajax theme to use the Dojo tag library.

For each page there are three tasks to complete:

  1. reference the new Dojo tag library
  2. update the head tag
  3. update all ajax themed tags
  4. check inline scripts
  5. check inline widgets

If this is a major undertaking for your application, it's recommended to modify, test and validate each page one at a time.

Reference the new Dojo Tag Library

Reference the new taglib in your JSP or FTL pages.
Before

<%@ page contentType=



"text/html; charset=UTF-8"



 %>



<%@ taglib prefix=

"s"
 
 uri=

"/struts-tags"
 
%>



After

<%@ page contentType=

"text/html; charset=UTF-8"
 
%>



<%@ taglib prefix=

"s"
 
uri=

"/struts-tags"
 
%>



<%@ taglib prefix=

"sx"

 uri=

"/struts-dojo-tags"

%>



Many pages will require both the core and dojo tags. The sx: prefix is preferred for the Dojo tags.

Update the head tag

Review the new attributes of the new head tag. You need to decide which values for the cache, compressed, parseContent and extraLocales attributes are appropriate for your application. These settings have major performance implications.

Before:

<s:head theme=

"ajax"
 
/>



After:

<sx:head parseContent=

"true"
 
/>



Update all ajax themed tags

Some tags are available only in the Dojo plugin taglib. It will be immediately obvious from your IDE that these tags need to change to the sx: prefix.
Some tags are available in both the core and Dojo plugin taglibs. Any tag that uses the ajax theme needs to be changed to the sx: prefix.

Before:

<s:url id=

"jobStatus"
 
 includeParams=

"get"
 
 value=

"/RefreshOptimizationJobStatus.action"

/>



<s:div id=

"jobStatus"
 
 theme=

"ajax"
 
href=

"%{jobStatus}"
 
updateFreq=

"5000"

 indicator=

"indicator"


>

</s:div>



<img id=

"indicator"

 src=

"img/indicator.gif"

 alt=

"Loading..."
 
 style=

"display:none"

/>



After:

<s:url var=

"jobStatus"

 includeParams=

"get"
 
value=

"/RefreshOptimizationJobStatus.action"

 />



<sx:div id=

"jobStatus"
 
 href=

"%{#jobStatus}"
  
updateFreq=

"5000"
 
 autoStart=

"true"
 
 indicator=


"indicator"

> 

</sx:div>



<img id=

"indicator"
  
src=

"img/indicator.gif"
  
alt=

"Loading..."

 style=

"display:none"

/>



If you forget to migrate a tag reference from the core to the dojo plugin you will receive an exception similar to the one below:

2008-04-19 14:32:30,475 ERROR [http-8443-Processor23] [[jsp]] Servlet.service() for servlet jsp threw exception

org.apache.jasper.JasperException: No tag "datetimepicker" defined in tag library imported with prefix "s"

Check inline javascript

If your ajax html results contain inline javascript that needs to be executed after updating the DOM, ensure your ajax tags set executeScripts="true" and separateScripts="true". These attributes instruct the widget to search for javascript in the result,
extract it, update the DOM with the result and then execute the javascript.

eg. The following bind will execute scripts within the result when the Submit button is pressed

<s:submit value="Submit"
  id="submit3"
/>

<sx:bind targets="div1"
  highlightColor="#ffffcc“  
 highlightDuration="500” 
 sources="submit3"

events="onclick"
  href="%{#fragment3Url}"
  errorNotifyTopics="/error"
  executeScripts="
true
"

 separateScripts="
true
"
/>

Check inline widgets

If your ajax html results include dojo widgets, ensure the head tag's parseContent attribute is true. This instructs dojo to parse the ajax responses for widgets. Note that Struts2.0 always enabled this feature and it could not be turned off. Struts2.1 disables this feature and allows it to be turned on as there is a significant performance impact.

Convert EL expressions to OGNL

Struts2.1 tags do not allow evaluation of JSP EL within their attributes. Instead, Struts2 tags evaluate attribute values as OGNL. Allowing both expression languages within the same attribute opens major security vulnerabilities.

todo: how to convert

Forgetting to convert attributes to OGNL expressions will produce exceptions similar to the one below:

org.apache.jasper.JasperException: /example.jsp(8,6) According to TLD or attribute directive in tag

file, attribute value does not accept any expression

Reduce verbose logging

Struts 2.1 introduces more verbose logging than Struts 2.0. While extremely valuable, some users may find these annoying.

Missing Properties

This message states that the framework searched for a property in the value stack and failed to find it.

2008-04-19 14:21:08,177 WARN  

[http-8443-Processor25] [OgnlValueStack] Could not find property [templateDir]

2008-04-19 14:21:08,177 WARN  

[http-8443-Processor25] [OgnlValueStack] Could not find property [templateDir]

2008-04-19 14:21:08,177 WARN  

[http-8443-Processor25] [OgnlValueStack] Could not find property [templateDir]

2008-04-19 14:21:08,178 WARN  

[http-8443-Processor25] [OgnlValueStack] Could not find property [org.apache.catalina.jsp_file]

To hide these messages, turn off the WARN level logging for OgnlValueStack.

eg. Include a new limit category in your log4j.xml file (only log errors or worse):

<category name=

"com.opensymphony.xwork2.ognl.OgnlValueStack"

>


   <priority value=
"error"
/>

</category>


TextProvider missing keys

These messages state that the framework searched for text in a resource bundle and failed to find it.

2008-04-19 14:32:30,106 WARN  

[http-8443-Processor23] [TextProviderHelper] The first TextProvider in the ValueStack

(package.Action) could not locate the message resource with key 'companyDetails.addressId'

2008-04-19 14:32:30,107 WARN  

[http-8443-Processor23] [TextProviderHelper] The default value expression

'companyDetails.addressId' evaluated to '10'

To hide those messages, turn off the WARN level logging for TextProviderHelper.

eg. Include a new limit category in your log4j.xml file (only log errors or worse):

<category name=

"org.apache.struts2.util.TextProviderHelper"

>


   <priority value=
"error"
/>

</category>


 

 

Update Unit Tests

There are two known major migration issues affecting user's unit tests.

  • The Configuration API now uses a Builder pattern
  • The ActionContext.getContext() method does not create a context on demand.

Review the Unit Tests included with Struts2 for recommended practices to setup the Configuration and context.

A quick fix for ActionContext.getContext() returning null :

ConfigurationManager configurationManager = new
 ConfigurationManager();

configurationManager.addContainerProvider(new
 XWorkConfigurationProvider());

 
Configuration config = configurationManager.getConfiguration();

Container container = config.getContainer();

ValueStack stack = container.getInstance(ValueStackFactory.class).createValueStack();

stack.getContext().put(ActionContext.CONTAINER, container);

        

ActionContext.setContext(new

ActionContext(stack.getContext()));

assertNotNull(ActionContext.getContext());

Trouble-shooting

The issues are listed in the same order as encountered after changing jars over from 2.0.x to 2.1.x. Noteworthy, the migration was done under the following setup: Fedora core 6, JDK 1.6.0_2 and Tomcat 6.0.10 running from MyEclipse plugin.

Result type "redirect-action" was renamed to "redirectAction":

SEVERE: Exception starting filter struts2

Unable to load configuration. - action - file:/home/giaz/code/.metadata/.plugins/

            

com.genuitec.eclipse.easie.tomcat.myeclipse/tomcat/webapps/webui/WEB-INF/classes/struts.xml:39:98

        

at com.opensymphony.xwork2.config.ConfigurationManager.getConfiguration(ConfigurationManager.java:58)

        

at org.apache.struts2.dispatcher.Dispatcher.init_PreloadConfiguration(Dispatcher.java:370)

...

Caused by: Error building results for

 action ScheduleJob in namespace  

- action - file:/home/giaz/code/.metadata/.plugins/

             

com.genuitec.eclipse.easie.tomcat.myeclipse/tomcat/webapps/webui/WEB-INF/classes/struts.xml:39:98

        

at com.opensymphony.xwork2.config.providers.XmlConfigurationProvider.addAction(XmlConfigurationProvider.java:372)

        

... 30 more

Caused by: There is no result type defined for

 type 'redirect-action' mapped with name 'success' - result -

              

file:/home/giaz/code/.metadata/.plugins/com.genuitec.eclipse.easie.tomcat.myeclipse/tomcat/webapps/webui/

              

WEB-INF/classes/struts.xml:40:50

        

at com.opensymphony.xwork2.config.providers.XmlConfigurationProvider.buildResults(XmlConfigurationProvider.java:616)

        

... 35 more

The struts.xml before:

<action name="ScheduleJob"

 class="com.sag.optimizer.ui.web.action.scheduler.ScheduleJobAction"
>

    <result name="success"
  type="redirect-action"
>

          <param name="actionName"
>ListDisplayOptimizationJobStatus</param>

    </result>

    <result name="error"
  type="tiles"
>webui.requestFailed</result>

</action>

To resolve this issue modify the struts.xml action definition to:

<action name="ScheduleJob"

 class="com.sag.optimizer.ui.web.action.scheduler.ScheduleJobAction"
>

 
  <result name="success"
  type="redirectAction"
>

          
<param name="actionName"
>ListDisplayOptimizationJobStatus</param>

   </result>

   <result name="error"
 type="tiles"
>webui.requestFailed</result>

</action>

or to:

<action name="ScheduleJob"
 class="com.sag.optimizer.ui.web.action.scheduler.ScheduleJobAction"
>

    
<result name="success"
  type="redirect"
>ListDisplayOptimizationJobStatus.action</result>

    
<result name="error"
  type="tiles"
>webui.requestFailed</result>

</action>

<!-- [if !supportLineBreakNewLine]-->

<!-- [endif]-->

Tiles 2.1.x plugin tiles.xml now requires DOCTYPE:

Problem Symptom:

Nov 22, 2007 11:38:11 AM org.apache.tiles.impl.BasicTilesContainer init

INFO: Initializing Tiles2 container. . .

Nov 22, 2007 11:38:11 AM org.apache.commons.digester.Digester error

SEVERE: Parse Error at line 2 column 19: Document is invalid: no grammar found.

org.xml.sax.SAXParseException: Document is invalid: no grammar found.

        

at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.createSAXParseException(ErrorHandlerWrapper.java:195)

        

at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.error(ErrorHandlerWrapper.java:131)

Reason for this

This is due to the fact that Tiles 2.0.5 now turns validation on as default.

The tiles.xml page before:

<?xml version="1.0"
  encoding="ISO-8859-1"
 ?>

<tiles-definitions/>

To resolve the issue simply add:

<?xml version="1.0"
  encoding="ISO-8859-1"
 ?>

<!DOCTYPE tiles-definitions PUBLIC

"-

//Apache Software Foundation//DTD Tiles Configuration 2.0//EN"

 "http:

//struts.apache.org/dtds/tiles-config_2_0.dtd"
>



<tiles-definitions/>

<s:head theme="ajax"/> is obsolete, use a different theme:

Problem Symptom: Accessing any page that includes <s:head theme="ajax"/> produces the following error:

Nov 22, 2007 1:54:51 PM freemarker.log.JDK14LoggerFactory$JDK14Logger error

SEVERE:

Expression parameters.parseContent is undefined on line 45, column 28 in template/ajax/head.ftl.

The problematic instruction:

----------

==> ${parameters.parseContent?string} [on line 45, column 26 in template/ajax/head.ftl]

----------

Java backtrace for

 programmers:

----------

freemarker.core.InvalidReferenceException: Expression parameters.parseContent is undefined on line 45,

column 28 in template/ajax/head.ftl.

at freemarker.core.TemplateObject.assertNonNull(TemplateObject.java:124)

at freemarker.core.TemplateObject.invalidTypeException(TemplateObject.java:134)

Resolution is to either remove the "<s:head theme="ajax"/>" or use a different theme e.g. <s:head theme="xhtml" />

Ajax UI tags were moved to the new dojo plugin, use /struts-dojo-tags taglib instead of (or in addition to) /struts-tags:

Problem Symptom: Accessing a page containing ajax UI tags through using the struts 2 taglib will produce the following error:

SEVERE: Servlet.service() for

 servlet jsp threw exception

org.apache.jasper.JasperException: /jsp/list/listOptimizationJobStatus.jsp(6,0) Attribute href invalid for

 tag div according to TLD

at org.apache.jasper.compiler.DefaultErrorHandler.jspError(DefaultErrorHandler.java:40)

at org.apache.jasper.compiler.ErrorDispatcher.dispatch(ErrorDispatcher.java:407)

JSP before migration:

<%@ page contentType="text/html; charset=UTF-8"
 %>

<%@ taglib prefix="display"
 uri="http:
//displaytag.sf.net"
 %>


<%@ taglib prefix="s"
 uri="/struts-tags"
%>

<s:url id="jobStatus"
 includeParams="get"
 value="/RefreshOptimizationJobStatus.action"
 />

<s:div id="jobStatus"
 theme="ajax"
 href="%{jobStatus}"
 updateFreq="5000"
 indicator="indicator"
>
</s:div>

<img id="indicator"
 src="img/indicator.gif"
 alt="Loading..."
 style="display:none"
/>

Resolution is to import and use struts-dojo-tags plugin instead:

<%@ page contentType="text/html; charset=UTF-8"
 language="java"
 %>

<%@ taglib prefix="s"
 uri="/struts-tags"
%>

<%@ taglib prefix="sx"
 uri="/struts-dojo-tags"
 %>

<s:url var
="jobStatus"
 includeParams="get"
 value="/RefreshOptimizationJobStatus.action"
 />

<sx:div id="jobStatus"
  href="%{#jobStatus}"
 updateFreq="5000"
 autoStart="
true
"
  indicator="indicator"
>

</sx:div>

<img id="indicator"
 src="img/indicator.gif"
 alt="Loading..."
 style="display:none"
/>

Other Ajax UI tags were also moved to the dojo plugin

Note the use of remote div is now through the dojo plugin taglib sx. Other ui tags are also no longer available through the /struts-tags taglib but only through the /struts-dojo-tags taglib: datetimepicker and autocompleter.

User-defined converter (subclassing StrutsTypeConverter) will no longer be needed when using datetimepicker:

Problem Symptom: Your custom StrutsTypeConverter implementation does not longer work in version 2.1.x. In 2.0.x you needed to implement a custom StrutsTypeConverter e.g. StringToDateConverter to be able to parse and convert to Date the String posted from a datetimepicker control into the action. In version 2.0.x datetimepicker was posting a String formatted as specified in the "displayFormat" field e.g.

<%@ taglib prefix="s"
  uri="/struts-tags"
%>

<s:datetimepicker label="Begin Date"
 name="beginDate"
 displayFormat="yyyy.MM.dd"
>

In version 2.1.x datetimepicker will post a String Date in RFC 3339 format, so you can define your setter to receive a Date directly and avoid using converters for this purpose e.g.

<%@ taglib prefix="s"
 uri="/struts-tags"
%>
<%@ taglib prefix="sx"
 uri="/struts-dojo-tags"
%>

<sx:datetimepicker label="Begin Date"
 name="beginDate"
 displayFormat="yyyy.MM.dd"
>

ActionMappingParams

Parameters set by the action mapping are not set/not available through ParameterAware (This change is only needed when going to 2.1.x (where x>0))

These are now only available if you use the new interceptor named "actionMappingParams".

分享到:
评论

相关推荐

    基于J2EE框架的个人博客系统项目毕业设计论文(源码和论文)

    2.1. 系统分析 在整个blog进行开发之前,要确定出整个项目的整体架构,包括系统的选型、运行环境的确定及系统结构设计。下面对这进行详细介绍。 在进行软件系统开发的最初环节,一般都需要进行系统的选型,即根据...

    MATLAB中的紧束缚模型求解器.rar

    1.版本:matlab2014/2019a/2024a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。

    模型量化校准数据集-ImageNet2012分类图片100张

    从ImageNet2012分类数据集中选取的100张图片,用于对常见分类模型进行量化。 数据集介绍 数据背景: 静态离线量化方法需要少量校准数据,这个数据集用于量化演示示例。 数据来源: 基于Imagenet2012测试数据集,取前100张图片和标签作为本数据集。

    ### 【计算机组成原理】计算机发展历程与关键技术解析:从冯·诺依曼架构到量子计算的未来展望

    内容概要:本文详细介绍了计算机的发展历程及其核心组成部分,从早期计算工具的演进到现代计算机的诞生,重点探讨了冯·诺依曼体系结构的重要性。文章回顾了从机械计算器、ENIAC到微处理器的科技进步,阐述了计算机五大组成部分(运算器、控制器、存储器、输入设备、输出设备)的功能与协作机制。同时,文中还讨论了操作系统、编程语言、数据库管理系统等软件层面的内容,以及量子计算和神经形态计算等前沿技术对未来计算机发展的影响。; 适合人群:计算机专业学生、计算机爱好者及对计算机技术感兴趣的读者。; 使用场景及目标:①帮助读者理解计算机硬件的基本组成和工作原理;②解释软件与硬件之间的协同关系;③介绍量子计算和神经形态计算等新兴技术的发展趋势及挑战。; 其他说明:掌握计算机组成原理有助于读者深入了解计算机系统的工作机制,培养硬件思维和系统思维,为后续学习操作系统、编译原理、计算机网络等课程打下坚实基础。同时,对于广大计算机爱好者而言,了解计算机组成原理可以让他们更好地理解计算机的运行机制,在使用计算机的过程中更加得心应手。

    中国移动2024年6G通感算智融合技术体系白皮书1.053页.pdf

    中国移动2024年6G通感算智融合技术体系白皮书1.053页.pdf

    汽车电子:MATLAB_开发电池管理系统SOC估算算法.pdf

    文档支持目录章节跳转同时还支持阅读器左侧大纲显示和章节快速定位,文档内容完整、条理清晰。文档内所有文字、图表、函数、目录等元素均显示正常,无任何异常情况,敬请您放心查阅与使用。文档仅供学习参考,请勿用作商业用途。 你是否渴望高效解决复杂的数学计算、数据分析难题?MATLAB 就是你的得力助手!作为一款强大的技术计算软件,MATLAB 集数值分析、矩阵运算、信号处理等多功能于一身,广泛应用于工程、科学研究等众多领域。 其简洁直观的编程环境,让代码编写如同行云流水。丰富的函数库和工具箱,为你节省大量时间和精力。无论是新手入门,还是资深专家,都能借助 MATLAB 挖掘数据背后的价值,创新科技成果。别再犹豫,拥抱 MATLAB,开启你的科技探索之旅!

    通信工程分包合同.docx

    通信工程分包合同.docx

    基于Qt+C++实现的物联网景区地质灾害监测系统+源码+项目文档(毕业设计&课程设计&项目开发)

    基于Qt+C++实现的物联网景区地质灾害监测系统+源码+项目文档,适合毕业设计、课程设计、项目开发。项目源码已经过严格测试,可以放心参考并在此基础上延申使用,详情见md文档 本项目利用Zigbee协议搭建了专属物联网,搭建了以Cortex-A8为主核的本地网关,租用阿里云组建系统服务器,并建立了相关网站。监测中心站通过客户端监控易发灾害点数据,在灾害爆发前做好预防工作;普通用户可以通过网站查看各项数据。 基于Qt+C++实现的物联网景区地质灾害监测系统+源码+项目文档,适合毕业设计、课程设计、项目开发。项目源码已经过严格测试,可以放心参考并在此基础上延申使用,详情见md文档 本项目利用Zigbee协议搭建了专属物联网,搭建了以Cortex-A8为主核的本地网关,租用阿里云组建系统服务器,并建立了相关网站。监测中心站通过客户端监控易发灾害点数据,在灾害爆发前做好预防工作;普通用户可以通过网站查看各项数据

    CNC-控制器-STM32-开源项目

    CNC_控制器_STM32_开源项目

    世邦魏理仕:2022年北京房地产市场回顾与2023年展望.pdf

    世邦魏理仕:2022年北京房地产市场回顾与2023年展望

    科学发展观与建筑企业管理论文.docx

    科学发展观与建筑企业管理论文.docx

    Epson-L130-Series

    爱普生L130

    基于javaScript+Springboot+Vue实现的校园社团信息管理系统+源码+演示视频+项目文档(毕业设计&课程设计&项目开发)

    基于javaScript+Springboot+Vue实现的校园社团信息管理系统+源码+演示视频+项目文档,适合毕业设计、课程设计、项目开发。项目源码已经过严格测试,可以放心参考并在此基础上延申使用,详情见md文档 园社团信息管理系统管理员功能有个人中心,学生管理,社长管理,社团分类管理,社团信息管理,加入社团管理,社团成员管理,社团活动管理,活动报名管理,系统管理等。社长添加社团,管理员审核社团,学生加入社团,社长审核社团。因而具有一定的实用性。 本站是一个B/S模式系统,采用Spring Boot框架,MYSQL数据库设计开发,充分保证系统的稳定性。系统具有界面清晰、操作简单,功能齐全的特点,使得校园社团信息管理系统管理工作系统化、规范化。本系统的使用使管理人员从繁重的工作中解脱出来,实现无纸化办公,能够有效的提高校园社团信息管理系统管理效率。

    apk文件.zip

    apk文件

    JDK1.7及之前HashMap的put方法图解.png

    JDK1.7及之前HashMap的put方法图解

    珠宝鉴定:MATLAB高光谱成像在宝石内部包裹体分析中的实践.pdf

    文档支持目录章节跳转同时还支持阅读器左侧大纲显示和章节快速定位,文档内容完整、条理清晰。文档内所有文字、图表、函数、目录等元素均显示正常,无任何异常情况,敬请您放心查阅与使用。文档仅供学习参考,请勿用作商业用途。 你是否渴望高效解决复杂的数学计算、数据分析难题?MATLAB 就是你的得力助手!作为一款强大的技术计算软件,MATLAB 集数值分析、矩阵运算、信号处理等多功能于一身,广泛应用于工程、科学研究等众多领域。 其简洁直观的编程环境,让代码编写如同行云流水。丰富的函数库和工具箱,为你节省大量时间和精力。无论是新手入门,还是资深专家,都能借助 MATLAB 挖掘数据背后的价值,创新科技成果。别再犹豫,拥抱 MATLAB,开启你的科技探索之旅!

    基于MATLAB_的无人机编队协同控制算法开发与半实物仿真.pdf

    文档支持目录章节跳转同时还支持阅读器左侧大纲显示和章节快速定位,文档内容完整、条理清晰。文档内所有文字、图表、函数、目录等元素均显示正常,无任何异常情况,敬请您放心查阅与使用。文档仅供学习参考,请勿用作商业用途。 你是否渴望高效解决复杂的数学计算、数据分析难题?MATLAB 就是你的得力助手!作为一款强大的技术计算软件,MATLAB 集数值分析、矩阵运算、信号处理等多功能于一身,广泛应用于工程、科学研究等众多领域。 其简洁直观的编程环境,让代码编写如同行云流水。丰富的函数库和工具箱,为你节省大量时间和精力。无论是新手入门,还是资深专家,都能借助 MATLAB 挖掘数据背后的价值,创新科技成果。别再犹豫,拥抱 MATLAB,开启你的科技探索之旅!

    Epson-L301303.zip

    Epson_L301303.zip

    ISO8583报文协议讲解.ppt

    ISO8583报文协议讲解.ppt

Global site tag (gtag.js) - Google Analytics