




已阅读5页,还剩15页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第一章 Struts2的起源和发展说到网络应用很难让人不联想到网络信息的浏览,自从Internet进入民用领域之后,上网成为了越来越多的人闲暇时光的消磨手法。于是网络系统的开发也变得越来越总要。1.1 Web技术的发展随着Internet技术的大面积应用和发展,传统的静态HTML页面由于缺乏足够的用户交互能力已经无法满足日益膨胀的网络需求。人们希望Web应用中能够包含更多的动态交互功能,于是为了应对拥有更广泛用户群的动态Web开发,软件开发商分别推出的ASP和JSP两款动态网站开发解决方案。但是当时的JSP开发并没有很科学的层次设计,最初的JSP开发中逻辑代码和前端代码杂合在一起。虽然在最初开发时这样的做法使得开发非常的容易,然而随着Web系统的使用越来越广泛,应用规模的日益增长,如果继续使用传统的简单的JSP + Servlet结构进行Web系统的开发,则会由于系统层次混乱而导致系统的开发难度和维护成本越来越大,最终使开发过程陷入困境。1.2 MVC思想进入Web系统开发面对开发过程中所出现的困难,开发者们试图寻找一种能够使得开发结构更加具有条理性的开发模式。根据以往面向对象系统设计的经验,开发者开始将MVC开发模式引入Web系统的开发。MVC模式将一个应用分为三个基本部分:Model(模型)、View(视图)、Controller(控制器)。在此模式中触发事件由控制器捕获,并根据事件的类型来改变模型和视图。这样既可将系统模型与视图分离,从而使各部分能够工作在最小的耦合状态下协同工作,从来提高系统的扩展性和可维护性。将其引入Web系统开发后,系统模式由传统的JSP完成用户请求和响应改变为由控制器捕获用户请求,JavaBean完成模型操作,而JSP专门负责响应用户需求。老一代的开发框架Struts1便是这时的产物。1.3 Struts2开发框架的成型随着Struts1框架在Web系统开发中的大量应用,越来越多的使用者发现Struts1有着许多不可避免的缺陷。首先,Struts1只支持JSP作为表现层,然而并不是所有的Web系统都必须使用JSP进行信息反馈。其次,Struts1编写业务逻辑控制器时,必须调用大量Servlet API,而这些接口都是依赖于Web服务器的。这样就造成了业务逻辑测试无法脱离Web容器,造成了测试的困难。最后,由于大量的Servlet API使用,使得系统结构混乱,使得这些业务逻辑在使用其他框架是需要大量重写,降低了代码使用效率。为了应对这些问题,Struts2去除了业务逻辑中对于Servlet API的耦合,使得业务逻辑类不需要继承任何Struts2基类,降低了测试难度,也加强了Action类的可移植性。1.4 本章小结本章从Web系统开发的发展历程入手,讲述了Web系统开发模式的变化,从而引出了Struts框架的起源,描述了Struts1的出现,以及所带来的问题。并由此解释了Struts2出现的目的,和解决的问题。第二章 Struts2框架的基本原理学习一个框架,我们首先要了解他的工作原理和基本工作方式,由此才能够进行后续的学习和使用,本章从基本的流程开始讲解Struts2的基本原理和相关配置。2.1 Struts2的事务处理流程相对于Struts1框架,Struts2为了使业务逻辑控制与Servlet容器的API分离而大量使用了拦截器来处理用户的请求。首先由Struts2的核心控制器拦截到用户在浏览器中发送的请求,然后核心控制器根据请求调用适当的Action进行处理。然后根据Action返回的参数选择对应处理方式将处理的结果返回给浏览器。2.2 Struts2的基本配置Struts2的基本配置主要包括三个部分:站点设置、核心设置控制器、业务控制器设置。2.2.1 为站点添加Struts2框架支持要使用Struts2框架开发就必须要将Struts2框架嵌入到当前的Web系统中,为Web系统提供相关支持。那么我们需要被指配置WEB-INF路径下的web.xml文件,将Struts2的核心控制器键入系统。该Web.xml文件在开发过程中该文件会存在与源代码目录中。具体设置比较简单,只需要将web.xml中的filter标签配置为: Struts2org.apache.struts2.dispatcher.FilterDispatcherStruts2/*这样设置之后系统将会调用struts2框架的FilterDispatcher组件处理由客户端发送的请求,就完成了系统Struts2框架的添加。2.2.2 Struts2的控制器组件完成了Struts2框架的添加,我们可以尝试写一个业务的控制器组件。一个控制器组件主要用来处理用户提交的请求,这些请求大多数情况下会有参数传递,于是一个控制器(Action)类就需要包括用于读取这些参数的函数,在Struts2框架中这些操作需要靠编写响应的设置(setter)和获取(getter)函数来完成。同样的,Struts2框架要求改控制类完成的操作需要通过相应的执行(execute)函数来完成。下面是一个样例:public class LoginAction /需要传递的参数protected String username;/参数的Setter和Getter函数public void setUsername(String user) ;public void setUsername(String user) ;/执行函数public String execute() throws Exception /返回结果值return null;2.2.3 Struts2框架文件的设定有了控制器类我们要做的就是将控制器置入系统,所以我们需要设计一个调用打的方式,并设定一个处理控制器返回结果的方式。这就是这一步需要配置的工作。比如上面的LoginAction类,我们可以这样设置:/welcome.jsp/login.jsp这里action标签就是我们需要配置的部分,上面的内容表示当调用Login动作的时候,系统会使用我们编写的类包javaAction中的LoginAction类来处理这条请求。并且当其执行函数返回success时会跳转至welcome.jsp页面继续下一步工作,而返回input是则会跳回登陆界面提示登陆。这样Struts2框架基本就可以工作了。2.3 本章小结本章主要讲述了Struts2框架的工作流程和配置要点,并说明了各个组件的作用,基本说明了一个Struts2系统开发框架的搭建步骤。第三章 Struts2框架开发简单的信息发布系统前面已经简要说明了Struts2框架的基本原理和基本配置方式,那么接下来我们将会通过一个小心信息发布系统的开发来详细描述Struts2框架的应用方式。3.1 信息发布系统的分析与建模类似所有的系统开发,没个系统都需要进行完善的分析与设计,只有这样才能够对后续的开发进行把握。3.1.1 系统的可行性分析可行性研究用来判断系统目标和规模是否显示,以及系统完成后能否达到预计的目的。所以经过了初步的设计和调查后得出以下三点可行性分析:1技术可行性本次系统主要为学习和了解Struts2开发模式,因此只需要实现信息发布系统的基本功能,所以程序结构上比较简单。整个应用核心部分使用Struts2框架作为核心解决方案,使用基本的JavaBean进行后台数据库操作,并使用JSP页面进行信息响应。2. 经济可行性本次开发使用的所有软件都是网上发布的开源版本或者相关软件的免费版本,使用的相关参考都源自有经验的开发者的无私分享,所以开发成本基本为零。且本次开发的目的仅限于学习和了解新兴的开发架构,亦不需要达成任何经济效应。因此,可以认为开发本系统在经济上是可行的。3. 操作可行性本系统的开发参照了目前主流信息服务站点的设计结构,采取了相似的设计思路,基本满足了用户的需求。因此,本系统在操作上也是基本可行的。3.1.2 系统的需求分析本系统是一个信息发布系统,所以需要有信息发布与显示功能。对于信息显示部分,我们需要设置专门的发布员进行信息的发布和管理。而对于浏览部分,我们需要设置分类浏览和总体浏览。对于浏览的信息,它必须要拥有标题,并标示出他的作者和发布的日期。同时为了配合分类浏览功能,一跳信息还必须同时具有分类属性,便于分类浏览时作为参照。这样就满足了一个基本的信息发布平台的需求。3.1.3 系统的总体功能分析通过参考各种信息发布系统,从自身的理解进行分析,对各种需求进行整理后认为,本系统需要具备的功能主要有:信息登录、信息修改、信息浏览三个主要功能,并且配合这三大基本功能选择实现其他配套功能。由此,本系统最终的规划功能有:信息发布系统的首页,包括发布员的注册与登录,浏览各种分类新闻。信息发布系统的浏览页面,显示信息的详细信息。信息发布系统的登陆页,为新闻发布员提供登录服务。信息发布系统的注册页,为发布员提供注册服务。信息发布系统的发布员页面,显示发布员发布的信息。本系统的系统结构图如下图3.1所示图3.1 系统功能模块对应的系统应该分为以下几个模块,如图3.2所示图3.2 系统功能模块3.1.4 系统用例图设计由于信息发布系统需要面对游客和发布员两类人群,所以需要设计两种模式。一种是只能浏览信息的游客模式,另一种是需要登陆的发布员模式。因此系统要有一个不需要登陆的浏览界面,和需要登陆的信息发布界面。因此系统需要一个自由浏览页面和登陆注册相关页面。此部分用例图如下图3.3所示。图3.3 用户浏览和登陆如果你是一个发布人员,当你登陆到信息系统后可以管理你自己发布的信息。因此需要发布管理用例。在发布员进行管理操作时,他可以查看已发信息、发布新信息、修改信息和删除信息。用来管理自己信息的用例如下图3.4所示。图3.4 发布信息管理综上所述,我们大致归纳出系统的三个实例: 1.发布员实体:对应发布和管理信息的用户。2.信息实体:对应需要发布的信息。3.信息分类:对应信息的分类。本系统中这三个实体的对应关系如图3.5所示:图3.5实体及其关联关系图3.5中的实体关系如下:1.发布员和信息的关系:1对N,因为一个发布员可以不止发布一条信息,而一条信息只会被一个人发布。2.信息分类与信息的关系:1对N,因为一个信息只能由一个分类,而一个分类中可以有多条信息。3.2 信息发布系统的实现完成了分析与设计,接下来就是搭建环境并正式开始系统的设计实现工作了。本节就将详细介绍系统开发实现的各个步骤。3.2.1 Struts2框架开发环境的搭建由于本次开发的主要目的是学习与研究Struts2框架的使用,所以对于开发工具和开发架构的选择我们应当本着简单、易学和免费的基本方针。因此本次采用的开发平台及工具选择如下:1.Web服务器目前开发商比较使用于小系统的免费环境基本是采用Apache的Tomcat,因为这款软件免费开源、功能强大、说明详细且有许多很成熟的参考项目,十分利于学生进行了解学习。因此本次系统开发选择的服务器是Tomcat,版本号7.0.12。详情参见/。2集成开发环境目前比较常用的Java开发环境主要有NetBeans和Eclipse两种,由于个人的使用习惯和插件支持的完善程度,本次开发选用了Eclipse进行开发。其版本为Eclipse Helios (3.6.2) for Java EE Developers 64位Windows版本。详细参见/。3.数据库服务器目前比较主流的开发数据库一般为Oracle、SQL Server、MySQL等等。由于本次开发目的主要为学习用途,考虑到价格因素本次开发选用功能可靠、兼容性好的MySQL作为数据库服务器。此次使用的版本为MySQL5.5.11 64位Windows版本,详细参见/。4.Web开发框架本次学习的目的就是学习使用Struts2框架开发,因此开发框架选用最新版本的Struts2开发框架。此次使用的版本号为Struts ,详细参见/。5.其他插件除了以上这些基本开发环境外,本次为了更加方便的进行Struts2开发使用了对应的Eclipse开发插件Alveole Studio Struts 2 Editor Feature 0.7.4与MVCWebProjectHelpFeature Feature0.5.0用于辅助设置Struts2功能。详细参见/。3.2.2 数据库的设计与实现在系统分析中,由图3.5很容易观察出我们需要设计3个数据库表:发布员(user)表、信息分类(sort)表、信息(info)表。其具体表设计如图3.6所示:图3.6 数据库表设计以上便是本次系统的数据库设计。接下来我们就需要将数据库设计转换为SQL语句并进行实现。由于篇幅限制,这里仅列出信息表(info)的创建语句,其它与之类似。CREATE DATABASE INFOPUBDB DEFAULT CHARACTER SET UTF8;USE INFOPUBDB; CREATE TABLE USER (#略);CREATE TABLE SORT (#略);CREATE TABLE INFO (IID INT UNSIGNED NOT NULL AUTO_INCREMENT,ITITLE VARCHAR (200) NOT NULL,IUSER INT UNSIGNED NOT NULL REFERENCES USER (UID),ISORT INT UNSIGNED NOT NULL REFERENCES SORT (SID),IDATE DATE,ITEXT TEXT,PRIMARY KEY (IID);这里就基本完成了数据库的部署工作,为下面的系统开发做好了数据铺垫。3.2.3 数据操作接口的设计与实现在前面我们完成了初始的数据库创建,然而在实际使用中我们并不能总是手动使用SQL语言去完成数据库操作。所以为了使程序能够自动完成数据库的操作我们需要为程序设计和编写一套数据库操作方法。这些设计数据访问的方法我们称为DAO组件,一般的DAO组件需要包括四部分:DAO工厂类、DAO接口、DAO接口的实现和需要传递的对象。通常的情况下,一个标准的DAO接口需要能够完成一个表的增删改查的基本操作。本次系统的DAO接口设计如图3.7所示:图3.7 DAO接口设计图图3.7中各DAO组件和对应的数据表以及业务逻辑组件有着如下图3.8所示的依赖关系:图3.8 DAO组件依赖关系图从以上两个图中我们可以得出,本系统通过三个DAO组件操作对应的三个实体数据表。每个DAO接口都拥有基本的增删改查功能,并对应不同的数据表包含一些额外的操作接口。这里以UserDAO为例,由于对于用户表,登录时需要通过用户名查找用户,所以UserDAO拥有额外的通过用户名进行查找的方法函数:findUserByName()。UserDAO接口代码应当如下:package javaDAO; import java.util.List;import javaBean.User;public interface UserDAO User get(int uid);void save(User user);void update(User user);void delete(User user);void delete(int uid);List findAll();User findUserByName(String uname);最后使用UserDAOImpl类实现这些接口,就完成了对用户(user)表的DAO组件。其他数据表对应的DAO组件同理即可完成。3.2.4 业务逻辑组件的设计与实现业务逻辑组件的主要工作是操作DAO组件完成各种业务的响应。这些响应应当包括:登陆时检查用户信息,登陆后获得用户发布消息列表,按分类取得信息,添加修改信息等等。本次系统开发通过对用例图3.3和图3.4的分析归纳出业务逻辑接口如下图3.9所示。图3.9业务逻辑组件接口设计接口代码如下:package javaService;import java.util.List;import javaBean.Info;import javaBean.Sort;import javaBean.User;public interface InfoPubService /用户检查public boolean checkUser(String username,String password);/通过用户名查找用户public User getUserByName(String uname);/列出用户发布的信息public List getInfoByUser(int uid);/分类列出信息public List getInfoBySort(int sid);/获取全部信息public List getAllInfo();/添加用户public void addUser(User user);/添加信息public void addInfo(Info info);/新增分类public void addSort(Sort sort);/修改用户信息public void updateUser(User user);/修改信息public void updateInfo(Info info);/修改分类public void updateSort(Sort sort);上面设计中,各个接口的功用自上而下分别包含了用户验证、通过用户和分类查询信息、取得所有信息和分类、添加用户信息分类以及修改用户或者信息资料的功能,这些功能实现了用例图3.3和图3.4的各种功能,为下一步完成整个站点的Web表达提供了底层基础。3.2.5 Web系统的设计与实现Web系统的设计主要包括业务处理和页面跳转两个部分,由前面的分析我们可以将本次系统的页面和业务大致分为以下几个部分:1.浏览信息:这部分主要包含信息总览和信息分类浏览。主要应对的功能是游客的信息获取。他需要完成分类浏览和总览两个功能。2.信息发布:这部分主要作用是为发布员提供一个信息发布工具,主要功能是应对发布员的信息发布。这部分需要包含登陆、查询、修改、添加四个功能。根据以上两点归纳得出Web系统的页面和业务跳转关系如图3.10所示。图3.10页面跳转图登陆站点的首页,首先得到信息总览用于生成首页总览信息。这时游客可以通过首页进入分类浏览页,获得相关分类的详细信息。而信息发布员则可以通过登陆连接进入登陆界面,在输入指定信息之后登录进入发布者个人信息页面。在此前我们需要收集用户发表的消息生成消息列表用于生成发布者个人信息页。发布者在个人信息页面可以选择发布新信息和修改已经发布的信息。完成这些操作后页面将返回发布者个人信息页。参照章节2.2.2的内容设置struts.xml以完成这些跳转过程,并按照2.2.3的内容完成相关控制器类的编写。这里以LoginAction为例给出相关代码。首先是LoginAction类的编写/* * 前面略去setter getter方法*/public String execute() throws Exception / TODO Auto-generated method stubString name=this.getUsername();user=ser.getUserByName(name);if(user.getUID()=0)/未找到用户名,返回用户不存在addFieldError(username,getText(NoSuchUser);return INPUT;else if(!ser.checkUser(getUsername(), getPassword()/密码错误,返回密码错误提示;addFieldError(password,getText(PasswordError);return INPUT;/记录登陆状态;ActionContext.getContext().getSession().put(use, getUsername();return SUCCESS;其对应的跳转配置如下: /infopub.jsp /login.jsp 类似的完成其他各组件和对应的设置后就可以开始最后JSP页面的编写了。3.2.6 JSP页面的设计与修饰JSP页面的编写和修饰是一件十分繁琐的事情,由于篇幅有限本次仅以login.jsp为例,讲解JSP页面的设计与修饰方法。以上是页面的编译设置部分,里面设置了页面的编码格式,和调用的标签类型。其中这一行是导入struts2标签项,为后面使用各种struts2标签做好了准备。一般情况下这两行代码在一个项目中往往变化不大。接下来将会编写完成登录功能的主要部件,登录表单。代码中使用s:form标签创建了一个登录信息提交表单,并设置了相应的输入项目。这样我们就能够得到如图3.11的页面。图3.11 登录提交页面然而这样的页面很不美观,于是我们利用CSS样式表单对其进行美化,最后形成如图3.12的页面。图3.12 美化后的登录页面最后类似的完成其他业务页面,这次的系统开发就完成了。3.3 本章小结本章通过一个实际项目的开发经过,详细的描述了Struts2框架开发需要的步骤和注意事项。在实践中了解了该框架的设计思想,工作原理和实现方式,为将来的学习和工作提供了参考。第四章 总结学习是一个不断总结和不断进取的过程,学习知识后有必要进行总结和展望。4.1 研究成果本次通过研究Struts2系统框架了解了先进的开发模式,理解了MVC模式在开发应用中的优势和基本的开发结构。通过详细的研究Struts2开发框架的工作流程和各个组件的配置编写,了解与学习了该框架的开发形式。并在之后通过实践开发进一步掌握了开发方式,为今后的继续学习和应用打下了基础。4.2 今后的学习虽然本次的开发已经完结了,但是我们仍然有许多东西需要学习,比如Struts2框架的与其他开发框架相互结合的使用。目前使用简单的Struts2+Jsp开发虽然难度较低,但同时功能限制也比较明显,比如缺乏持久层的支持,每次使用数据库都需要发起一次连接,使得系统资源浪费十分严重。这类问题的解决和改进都是今后的学习中需要继续努力的。袁节膅薂羄肅蒃薁蚃芀荿薀螆肃芅蕿袈芈膁蚈羀肁蒀蚇蚀袄莆蚇螂肀莂蚆羅袂芈蚅蚄膈膄蚄螇羁蒂蚃衿膆莈蚂羁罿芄螁蚁膄膀螁螃羇葿螀袅膃蒅蝿肈羆莁螈螇芁芇莄袀肄膃莄羂艿蒂莃蚂肂莈蒂螄芈芄蒁袆肀膀蒀罿袃薈葿螈聿蒄葿袁羁莀蒈羃膇芆蒇蚃羀膂蒆螅膅蒁薅袇羈莇薄罿膄芃薃虿羆艿薃袁节膅薂羄肅蒃薁蚃芀荿薀螆肃芅蕿袈芈膁蚈羀肁蒀蚇蚀袄莆蚇螂肀莂蚆羅袂芈蚅蚄膈膄蚄螇羁蒂蚃衿膆莈蚂羁罿芄螁蚁膄膀螁螃羇葿螀袅膃蒅蝿肈羆莁螈螇芁芇莄袀肄膃莄羂艿蒂莃蚂肂莈蒂螄芈芄蒁袆肀膀蒀罿袃薈葿螈聿蒄葿袁羁莀蒈羃膇芆蒇蚃羀膂蒆螅膅蒁薅袇羈莇袄芈蒇袇螀芇蕿蚀聿芆艿蒃肅芅蒁螈羁芄薃薁袆芃芃螆螂芃莅蕿肁节蒈螅羇莁薀薈袃莀艿螃蝿荿莂薆膈莈薄袁肄莇蚆蚄羀莇莆袀袆羃蒈蚂螂羂薁袈肀肁芀蚁羆肁莃袆袂肀薅虿袈聿蚇蒂膇肈莇螇肃肇葿薀罿肆薂螆袅肅芁薈螁膅莃螄聿膄蒆薇羅膃蚈螂羁膂莈蚅袇膁蒀袀螃膀薂蚃肂腿节衿羈腿莄蚂袄芈蒇袇螀芇蕿蚀聿芆艿蒃肅芅蒁螈羁芄薃薁袆芃芃螆螂芃莅蕿肁节蒈螅羇莁薀薈袃莀艿螃蝿荿莂薆膈莈薄袁肄莇蚆蚄羀莇莆袀袆羃蒈蚂螂羂薁袈肀肁芀蚁羆肁莃袆袂肀薅虿袈聿蚇蒂膇肈莇螇肃肇葿薀罿肆薂螆袅肅芁薈螁膅莃螄聿膄蒆薇羅膃蚈螂羁膂莈蚅袇膁蒀袀螃膀薂蚃肂腿节衿羈腿莄蚂袄芈蒇袇螀芇蕿蚀聿芆艿蒃肅芅蒁螈羁芄薃薁袆芃芃螆螂芃莅蕿肁节蒈螅羇莁薀薈袃莀艿螃蝿荿莂薆膈莈薄袁肄莇蚆蚄羀莇莆袀袆羃蒈蚂螂羂薁袈肀肁芀蚁羆肁莃袆袂肀薅虿袈聿蚇蒂膇肈莇螇肃肇葿薀罿肆薂螆袅肅芁薈螁膅莃螄聿膄蒆薇羅膃蚈螂羁膂莈蚅袇膁蒀袀螃膀薂蚃肂腿节衿羈腿莄蚂袄芈蒇袇螀芇蕿蚀聿芆艿蒃肅芅蒁螈羁芄薃薁袆芃芃螆螂芃莅蕿肁节蒈螅羇莁薀薈袃莀艿螃蝿荿莂薆膈莈薄袁肄莇蚆蚄羀莇莆袀袆羃蒈蚂螂羂薁袈肀肁芀蚁羆肁莃袆袂肀薅虿袈聿蚇蒂膇肈莇螇肃肇葿薀罿肆薂螆袅肅芁薈螁膅莃螄聿膄蒆薇羅膃蚈螂羁膂莈蚅袇膁蒀袀螃膀薂蚃肂腿节衿羈腿莄蚂袄芈蒇袇螀芇蕿蚀聿芆艿蒃肅芅蒁螈羁芄薃薁袆芃芃螆螂芃莅蕿肁节蒈螅羇莁薀薈袃莀艿螃蝿荿莂薆膈莈薄袁肄莇蚆蚄羀莇莆袀袆羃蒈蚂螂羂薁袈肀肁芀蚁羆肁莃袆袂肀薅虿袈聿蚇蒂膇肈莇螇肃肇葿薀罿肆薂螆袅肅芁薈螁膅莃螄聿膄蒆薇羅膃蚈螂羁膂莈蚅袇膁蒀袀螃膀薂蚃肂腿节衿羈腿莄蚂袄芈蒇袇螀芇蕿蚀聿芆艿蒃肅芅蒁螈羁芄薃薁袆芃芃螆螂芃莅蕿肁节蒈螅羇莁薀薈袃莀艿螃蝿荿莂薆膈莈薄袁肄莇蚆蚄羀莇莆袀袆羃蒈蚂螂羂薁袈肀肁芀蚁羆肁莃袆袂肀薅虿袈聿蚇蒂膇肈莇螇肃肇葿薀罿肆薂螆袅肅芁薈螁膅莃螄聿膄蒆薇袁节膅薂羄肅蒃薁蚃芀荿薀螆肃芅蕿袈芈膁蚈羀肁蒀蚇蚀袄莆蚇螂肀莂蚆羅袂芈蚅蚄膈膄蚄螇羁蒂蚃衿膆莈蚂羁罿芄螁蚁膄膀螁螃羇葿螀袅膃蒅蝿肈羆莁螈螇芁芇莄袀肄膃莄羂艿蒂莃蚂肂莈蒂螄芈芄蒁袆肀膀蒀罿袃薈葿螈聿蒄葿袁羁莀蒈羃膇芆蒇蚃羀膂蒆螅膅蒁薅袇羈莇薄罿膄芃薃虿羆艿薃袁节膅薂羄肅蒃薁蚃芀荿薀螆肃芅蕿袈芈膁蚈羀肁蒀蚇蚀袄莆蚇螂肀莂蚆羅袂芈蚅蚄膈膄蚄螇羁蒂蚃衿膆莈蚂羁罿芄螁蚁膄膀螁螃羇葿螀袅膃蒅蝿肈羆莁螈螇芁芇莄袀肄膃莄羂艿蒂莃蚂肂莈蒂螄芈芄蒁袆肀膀蒀罿袃薈葿螈聿蒄葿袁羁莀蒈羃膇芆蒇蚃羀膂蒆螅膅蒁薅袇羈莇薄罿膄芃薃虿羆艿薃袁节膅薂羄肅蒃薁蚃芀荿薀螆肃芅蕿袈芈膁蚈羀肁蒀蚇蚀袄莆蚇螂肀莂蚆羅袂芈蚅蚄膈膄蚄螇羁蒂蚃衿膆莈蚂羁罿芄螁蚁膄膀螁螃羇葿螀袅膃蒅蝿肈羆莁螈螇芁芇莄袀肄膃莄羂艿蒂莃蚂肂莈蒂螄芈芄蒁袆肀膀蒀罿袃薈葿螈聿蒄葿袁羁莀蒈羃膇芆蒇蚃羀膂蒆螅膅蒁薅袇羈莇薄罿膄芃薃虿羆艿薃袁节膅薂羄肅蒃薁蚃芀荿薀螆肃芅蕿袈芈膁蚈羀肁蒀蚇蚀袄莆蚇螂肀莂蚆羅袂芈蚅蚄膈膄蚄螇羁蒂蚃衿膆莈蚂羁罿芄螁蚁膄膀螁螃羇葿螀袅膃蒅蝿肈羆莁螈螇芁芇莄袀
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 1 Teenage Life 主题词汇专项练习(含答案) -2025-2026学年高中英语人教版(2019)必修第一册
- 2025年事业单位工勤技能-湖南-湖南中式烹调师一级(高级技师)历年参考题库含答案解析
- 2025年事业单位工勤技能-湖北-湖北计算机信息处理员五级初级历年参考题库含答案解析
- 2025年事业单位工勤技能-湖北-湖北水利机械运行维护工四级(中级工)历年参考题库典型考点含答案解析
- 2025年事业单位工勤技能-湖北-湖北收银员三级(高级工)历年参考题库含答案解析
- 2025年环境监测智能化在城市空气质量预报中的应用与数据质量控制
- 2025年事业单位工勤技能-海南-海南管道工四级(中级工)历年参考题库含答案解析
- 2025年事业单位工勤技能-浙江-浙江计算机信息处理员五级初级历年参考题库含答案解析(5套)
- 2025年事业单位工勤技能-浙江-浙江工程测量员五级(初级工)历年参考题库含答案解析(5套)
- 2025年事业单位工勤技能-河南-河南铸造工二级(技师)历年参考题库典型考点含答案解析
- 增值税法规与政策 (优惠)
- 早产儿的治疗及护理课件
- 养血生发胶囊药理作用研究-洞察分析
- 泡泡岛音乐与艺术节
- 2025年理论中心组学习计划
- 《上腔静脉综合征》课件
- 2024年采棉机采摘合同范本大全
- 游戏公司游戏测试合同
- 工程变更流程ECN
- 大学生新时代劳动教育教程全套教学课件
- JT-GQB-015-1998公路桥涵标准钢筋混凝土圆管涵洞
评论
0/150
提交评论