




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、 Struts2学习笔记Java相关课程系列笔记之十三仅供参考笔记内容说明Struts2李翊老师主讲,占笔记内容100%;目 录一、 Struts2概述11.1为什么要用Struts11.2什么是MVC11.3 JSP Model 1和JSP Model 211.4 Struts2开展史21.5衡量一个框架的标准21.6 Struts2使用步骤21.7 struts.xml内容详解41.8 Struts2提供的方便之处51.9案例:简单登录使用Strust251.10案例:修改1.6、1.9案例使用户不能绕过前端控制器61.11 NetCTOSS工程:显示资费列表71.12 NetCTOSS工
2、程:资费列表分页显示11二、 OGNL技术142.1什么是OGNL142.2 OGNL根本语法142.3 OGNL表达式中加“#和不加“#的区别152.4 OGNL体系结构162.5 XWord框架对OGNL进行了改造162.6 ValueStack对象结构162.7 ValueStack结构演示172.8 Struts2标签的使用182.9 Struts2对EL表达式的支持182.10案例:修改1.12案例使用Struts2标签和OGNL表达式18三、 Action193.1 Struts2的核心组件193.2 Struts2的工作流程193.3在Action中访问Session和Appli
3、cation193.4 NetCTOSS工程:用户登录203.5 Action属性注入233.6案例:重构NetCTOSS资费列表分页显示使用属性注入233.7使用通配符配置Action233.8案例:通配符配置资费增、改、查243.9 Struts2中Action的设计经验24四、 Result254.1 Result注册配置254.2 Result组件利用<result>元素的type属性指定result类型254.3常见的Result组件类型254.4 NetCTOSS工程:资费删除254.5 NetCTOSS工程:基于StreamResult生成验证码274.6 NetCT
4、OSS工程:基于JSONResult进行验证码检验294.7 NetCTOSS工程:添加资费模块中的验证资费名是否重复314.8自定义一个Result33五、 Struts2标签355.1 A开头的标签355.2 B开头的标签355.3 C开头的标签355.4 D开头的标签355.5 E开头的标签355.6 F开头的标签355.7 G开头的标签365.8 H开头的标签365.9 I开头的标签365.10 L开头的标签365.11 M开头的标签365.12 O开头的标签365.13 P开头的标签365.14 R开头的标签365.15 S开头的标签365.16 T开头的标签375.17 U开头的标
5、签375.18所有标签都具备的属性375.19案例:常用标签37六、 拦截器406.1 Struts2详细流程图406.2拦截器的作用406.3拦截器的常用方法406.4自定义拦截器步骤406.5 Struts2内置的拦截器416.6案例:拦截器入门426.7拦截器栈456.8 fileUpload拦截器原理456.9案例:使用fileUpload拦截器实现文件上传456.10 NetCTOSS工程:登录检查拦截器47七、 Struts2中如何处理异常497.1异常一般出现在何处497.2如何配置异常49八、 Struts2中如何实现国际化508.1 i18n508.2如何获得中文的Unico
6、de编码508.3浏览器如何决定用哪个资源文件508.4资源文件的命名508.5资源文件的分类508.6实现国际化的步骤50九、 NetCTOSS工程529.1 DAO优化、重构、封装!【重要】529.2资费更新549.3导航条56十、 工程经验5810.1主键用int还是Integer5810.2 “./表示的意思5810.3导入静态页面,样式、JS失效问题5810.4 <s:hidden>和<s:textarea>标签5810.5四种情形下的绝对路径写法5810.6 URL和URI5810.7 util.Date和sql.Date583勿传网上!严禁牟利! Stru
7、ts2学习笔记常彦博1、 Struts2概述1.1为什么要用Struts1JSP用HTML与Java代码混用的方式开发,把表现与业务逻辑代码混合在一起给前期开发与后期维护带来巨大的复杂度。2解决方法:把业务逻辑代码从表现层中清晰的别离出来。32000年,Craig McClanahan采用了MVC的设计模式开发Struts主流的开发技术,大多数公司在使用。1.2什么是MVC1M-Model 模型模型Model的职责是负责业务逻辑。包含两局部:业务数据和业务处理逻辑。比方实体类、DAO、Service都属于模型层。2V-View 视图视图View的职责是显示界面和用户交互收集用户信息。属于视图的
8、类是不包含业务逻辑和控制逻辑的JSP。3C-Controller 控制器控制器是模型层M和视图层V之间的桥梁,用于控制流程。比方我们之前工程中写的ActionServlet。1.3 JSP Model 1和JSP Model 21JSP Model 1最早的JSP/Servlet模式被我们称之为JSP Model 1JSP设计模式1,在其中有模型层M,但是视图层V的JSP中包含了业务逻辑或控制逻辑,JSP和Servlet紧密耦合。即:JSP数据的展现和业务流程的控制+ JavaBean对数据的访问和运算,Model。2JSP Model 2JSP Model 2JSP设计模式2和JSP Mod
9、el1不同之处再与将JSP中的业务逻辑和控制逻辑全部剔除,并全部放入控制层C中,JSP仅仅具有显示页面和用户交互的功能。编程理念:高内聚低耦合。即:M:Model,用JavaBean来做对数据的访问和运算V:View,用JSP来作数据的展现C:Controller,用Servlet来作业务流程的控制1.4 Struts2开展史1最早出现的Struts1是一个非常著名的框架,它实现了MVC模式。Struts1简单小巧,其中最成熟的版本是Struts1.2。2之后出现了WebWork框架,其实现技术比Struts1先进,但影响力不如Struts1。3在框架技术不断开展的过程中,有人在WebWork
10、的核心XWork的根底上包装了Struts1算是两种框架的整合,由此,结合了Struts1的影响力和WebWork的先进技术,Struts2诞生了。4Struts2不是Struts1的升级,它更像是WebWork的升级版本。1.5衡量一个框架的标准1健壮性:Struts2.0不健壮带0的就是实验品,Struts2.1.8是健壮的2.1.6也不健壮,该版本BUG较多,3颗星。2易用性:易用性越好,原理那么越复杂,4颗星。3扩展性:Struts2,5颗星。4侵入性:即对写代码的要求如:必须继承某个类才能怎么怎么样,越低越好。Struts2低但也有侵入性,4颗星。1.6 Struts2使用步骤ste
11、p1:创立一个JavaWeb Project,命名为struts01Struts2只能用在Web工程里step2:拷贝Struts2的核心Jar包到WEB-INF/lib/下,根本功能核心jar包 5个:1xwork-core-2.1.6.jar:Struts2核心包,是WebWork内核。2struts-core-2.1.8.jar:Struts2核心包,是Struts框架的“外衣。3ognl-2.7.3.jar:用来支持OGNL表达式的,类似于EL表达式,功能比EL表达式强大的多。4freemarker-2.3.15.jar:freemarker是比JSP更简单好用,功能更加强大的表现层技
12、术,用来替代JSP的。在Struts2中提倡使用freemarker模板,但实际工程中使用JSP也很多。5commons-fileupload.jar:用于实现文件上传功能的jar包。step3:在web.xml中配置Struts2的前端控制器,Struts2是用Filter过滤器实现的前端控制器,它只负责根据请求调用不同的Actionu 本卷须知:原来的工程是用Servlet的方式作为控制器。web.xml内容:<?xml version="1.0" encoding="UTF-8"?><web-app version="2
13、.4" xmlns=" :/java.sun /xml/ns/j2ee"xmlns:xsi=" :/ /2001/XMLSchema-instance"xsi:schemaLocation=" :/java.sun /xml/ns/j2ee :/java.sun /xml/ns/j2ee/web-app_2_4.xsd"> <!- 上面的内容是规定必须写的,复制粘贴即可 -> <filter><!- 前端控制器 -><filter-name>Struts2&l
14、t;/filter-name><filter-class> org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class> </filter> <filter-mapping><filter-name>Struts2</filter-name><url-pattern>/*</url-pattern> <!- /*表示所有的请求都要经过该过滤器 -></filter-ma
15、pping></web-app>step4:在WebRoot下新建jsp文件夹,并在其中创立nameform.jsp和welcome.jsp1nameform.jsp<form action="welcome.action" method="post"> <input name="name" type="text" /><input value="提交" type="submit" /> <span style=&q
16、uot;color:red;">$error </span></form>2) Welcome.jsp<h1>Welcome,$name</h1>step5:在com.tarena.action包下创立WelcomeAction类private String name;private String error;各自的get/set方法public String execute() System.out.println("WelcomeAction.execute().");if(name=null|"
17、".equals(name) error="用户名不能为空"return "fail"System.out.println("name: " + name);/用于测试if ("test".equalsIgnoreCase(name) error="不能使用名字text登录"return "fail"elsereturn "success"step6:写Struts2所需要的控制器配置文件struts.xml,非常重要!该文件写请求与各个Acti
18、onJava类的对应关系,前端控制器会根据配置信息调用对应的ActionJava类去处理请求u 本卷须知:v 在编写时struts.xml放在src目录中,而部署后该文件位于WEB-INF/classes/下!v 同样的,.properties文件也放src下,部署后也在WEB-INF/classes/下!v 程序一启动,struts.xml就会被加载到内存,并不是现读的。struts.xml内容如下: <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE struts PUBLIC &quo
19、t;-/Apache Software Foundation/DTD Struts Configuration 2.1/EN" " ://dtds/struts-2.1.dtd"> <!- 以上内容是规定必须写的,复制粘贴即可 -> <struts><!- struts的根标签,也是规定,各个标签详解见1.7节 -> <package name="helloworld" namespace="/day01" extends="stru
20、ts-default" > <action name="welcome" class="com.tarena.action.WelcomeAction"> <result name="success">/jsp/welcome.jsp</result> <result name="fail">/jsp/nameform.jsp</result> </action> </package> </struts>
21、u 本卷须知:xml文件内容严格按照.dtd格式要求,如:<?xml.?>不在第一行可能会报错,标签中随意换行也会引起404!step7:部署,地址栏输入: :/localhost:8080/struts01/day01/welcome.action进行测试,发现一进入页面,那么错误提示信息已经显示!为了解决该问题,需要再定义一个<action>用于读取页面,而不是发请求后立即执行WelcomeAction类进行处理,处理应当在点击提交后才执行。step8:在struts.xml中添加新的<action>仅仅用于读取页面<action name=&qu
22、ot;welcomeform"><!-不指明class,Struts2会自动创立一个类,详见1.7节-> <result name="success">/jsp/nameform.jsp</result></action>step9:重新部署,地址栏输入: :/localhost:8080/struts01/day01/welcomeform.action进行测试,发现问题已经解决,可正常执行1.7 struts.xml内容详解1) <package>:作用是为<action>分组,&l
23、t;struts>标签下可有多个<package>,而<package>标签有如下属性: name="helloworld":唯一的标识,表示包名为helloworld。u 本卷须知:在相同包里的不能重复,不同包的可以重复!namespace="/day01":用来设置该包中的action的地址的命名空间。u 本卷须知:v 命名空间中的“/要写!v 也可以这么写:namespace="/",表示根命名空间,此时Action的访问路径为: :/localhost:8080/appName/actionNam
24、e.action 即: :/localhost:8080/struts01/welcome.actionv 一般写法为:namespace="/day01",此时Action的访问路径为: :/localhost:8080/appName/namespace/actionName.action 即: :/localhost:8080/struts01/day01/welcome.actionextends="struts-default":继承的包名,一般继承Struts2默认提供的struts-default包,该包中定义了很多Struts2应用必须的
25、组件比方:拦截器;该package声明的位置在struts2-core-2.1.8.jar/struts-default.xml文件中。u 本卷须知:v appName是部署时工程的名字!v 包只能继承包。不能说包继承某个类!2) <action>:作用是指明每个请求对应的Action类之间的对应关系一个<action>对应一个请求 ,<package>下可有多个<action>。而<action>标签有如下属性:name="welcome":表示请求的名字为welcome即welcome.actionclass=
26、"com.tarena.action.WelcomeAction":格式为“包名.类名。指定了对应的Action类Java类来处理请求。class属性可以不写,不写那么Struts2会默认为该<action>添加一个class自动创立一个类,该类中的execute()方法只有一个return "success"语句,作用是转发到对应的<result name="success">中指定的页面。method="xxx":用于指定在对应的Action类中要执行的方法名,该方法的返回值必须是Str
27、ing类型这是规定!例如:public String xxx().return string;/返回的string是<result>标签中某个name属性的值结果的名字!假设没有method属性或method="",那么默认调用方法名为execute的方法,即:public String execute().return string。3) <result>:作用是指明执行相应的Action类之后,显示哪种结果页。而<result>标签有如下属性:name="success":是该result的名称,Action返回哪
28、一个result的name值,意味着要转发到哪一个result 所对应的JSP地址,<result>不写name属性,那么默认为success。type="":默认dispatcher转发,还可写json、stream、等10种1.8 Struts2提供的方便之处1数据的自动封装输入属性 根据页面组件的name属性,自动封装到Action中对应的name属性中,即自动调用某属性的set方法。 例如:在JSP页面<input name="name" type="text" />,而在Action中那么会自动给属性
29、private String name赋值。u 本卷须知:必须有name属性对应的get和set方法。2数据的自动传递输出属性 Action中的属性在JSP页面可以直接用EL表达式拿到,即自动调用某属性的get方法。 例如:Action中的属性private String name;在JSP页面上可以直接$name得到对应的值。1.9案例:简单登录使用Strust2step1:新建Web工程struts01,导入Struts2的五个根本核心包,并在web.xml中配置Struts2的前端控制器,web.xml代码,见1.6中step3step2:在WebRoot下创立jsp文件夹,并放入log
30、inform.jsp和welcome.jsp1loginform.jsp<form action="/struts01/day01/login.action" method="post"><!-使用的是绝对路径-> <table><tr><td>用户名:</td><td><input name="name" type="text" /></td></tr> <tr><td>
31、密码:</td><td><input name="pwd" type="password" /></td></tr></table> <input value="提交" type="submit" /> <span style="color:red;">$errorMsg </span><!- 接收错误信息 -></form>u 本卷须知:v 应用名前的“/要写。v
32、 <form>标签中的action属性只写action="login.action"也可!如果写成action="day01/login.action",那么会出现叠加问题!可参考Spring笔记12.2节。2welcome.jsp <h1>Welcome,$name</h1>step3:在包com.tarena.action下新建LoginAction类private String name;private String pwd;private String errorMsg;各自的get/set方法public S
33、tring execute()if("chang".equals(name)&&"123".equals(pwd)/模拟登录成功return "success"/ 与struts.xml某一个<result>对应,用来生产视图elseerrorMsg="用户名或密码错误"return "fail"step4:在struts.xml中配置<action><struts><!- 包只能继承包 -><package name=&qu
34、ot;one" namespace="/day01" extends="struts-default"><!-请求地址: :/localhost:8080/appName/namespace/actionName.action -> <action name="login" class="com.tarena.action.LoginAction"><!-包名.类名-><result name="success">/jsp/welc
35、ome.jsp</result><result name="fail">/jsp/loginform.jsp</result> </action></package></struts>step5:部署,地址栏输入: :/localhost:8080/struts01/day01/login.action进行测试,发现一进入页面,那么错误提示信息已经显示!为了解决该问题,需要再定义一个<action>用于读取页面,而不是发请求后立即执行LoginAction类进行处理,处理应当在点击登录后才执
36、行。step6:在struts.xml中添加新的<action>仅仅用于读取页面<action name="loginform" class="com.tarena.action.LoginFormAction"> <result name="success">/jsp/loginform.jsp</result></action>u 本卷须知:当前配置指明了class,那么需要自己再写一个LoginFormAction类step7:在包com.tarena.action下新
37、建LoginFormAction类public class LoginFormAction public String execute() return "success"step8:重新部署,地址栏输入: :/localhost:8080/struts01/day01/loginform.action进行测试,发现问题已经解决,可正常执行step9:优化:step6也可这么写,此时也不用写step8中的LoginFormAction类了<action name="loginform" ><!-不指明class,那么Struts2会自动
38、创立一个类,详见1.7节-> <result name="success">/jsp/loginform.jsp</result></action><!-result中的name属性也可以不写->1.10案例:修改1.6、1.9案例使用户不能绕过前端控制器1问题描述:1.6和1.9案例都存在一个问题,用户可以绕过前端控制器,直接访问JSP页面,如地址栏直接输入: :/localhost:8080/struts01/jsp/welcome.jsp,可显示页面,只是获取的名字为空。2如何解决: step1:将jsp文件夹放入
39、WEB-INF目录下。因为WEB-INF目录中的内容是受保护的,不能直接访问!但能转发过来。step2:修改1.9案例struts.xml中result的转发路径,1.6也同理<action name="loginform"><!- result的type属性不写,默认为转发 -> <result name="success">/WEB-INF/jsp/loginform.jsp</result></action><action name="login" class=&
40、quot;com.tarena.action.LoginAction"> <result name="success">/WEB-INF/jsp/welcome.jsp</result><!- 修改路径 -> <result name="fail">/WEB-INF/jsp/loginform.jsp</result><!- 修改路径 -></action>step3:测试 :/localhost:8080/struts01/WEB-INF/jsp/wel
41、come.jsp不能直接访问 :/localhost:8080/struts01/WEB-INF/jsp/loginform.jsp也不能直接访问 :/localhost:8080/struts01/day01/loginform.action只能根据请求,访问登录页面1.11 NetCTOSS工程:显示资费列表step1:新建Web工程:NetCTOSS,导入需要的包:Struts2核心包、Oracle数据库驱动包、JSTL包假设为J2EE5.0那么不需要导这个包了,假设为J2EE1.4那么需要导入!step2:创立COST_CHANG表,并插入数据,别忘记commitcreate tabl
42、e cost_chang( id number(4) constraint cost_chang_id_pk primary key, name varchar2(50) not null, base_duration number(11), base_cost number(7,2), unit_cost number(7,4), status char(1) constraint cost_chang_status_ck check(status in (0,1), descr varchar2(100), creatime date default sysdate, startime d
43、ate, cost_type char(1);insert into cost_chang values (1,'5.9元套餐',20,5.9,0.4,0,'5.9元20小时/月,超出局部0.4元/时',default,null,'2');insert into cost_chang values (2,'6.9元套餐',40,6.9,0.3,0,'6.9元40小时/月,超出局部0.3元/时',default,null,'2');insert into cost_chang values (3,
44、39;8.5元套餐',100,8.5,0.2,0,'8.5元100小时/月,超出局部0.2元/时',default,null,'2');insert into cost_chang values (4,'10.5元套餐',200,10.5,0.1,0,'10.5元200小时/月,超出局部0.1元/时',default,null,'2');insert into cost_chang values (5,'计时收费',null,null,0.5,0,'0.5元/时,不使用不收费'
45、;,default,null,'3');insert into cost_chang values (6,'包月',null,20,null,0,'每月20元,不限制使用时间',default,null,'1');u 本卷须知:在Oracle数据库中,语句大小写都可,但最终在数据库中显示的是大写形式。step3:新建perties到src目录下,将username和password修改为自己的数据库的用户名和密码 user=system password=chang url=jdbc:oracle:thin:local
46、host:1521:dbchang driver=oracle.jdbc.driver.OracleDriverstep4:在ctoss.util包中创立DBUtils工具类,用于翻开连接接和关闭连接public class DBUtils private static String driver;private static String url;private static String user;private static String password;static try Properties props = new Properties(); rops.load(DBUtils.
47、class.getClassLoader().getResourceAsStream("perties"); driver = props.getProperty("driver"); url = props.getProperty("url"); user = props.getProperty("user");password = props.getProperty("password"); Class.forName(driver); catch (Exception e) t
48、hrow new RuntimeException("数据库驱动加载错误",e); public static Connection openConnection() throws SQLException Connection con = DriverManager.getConnection(url, user, password);return con;public static void closeConnection(Connection con) if (con != null) try con.close(); catch (SQLException e) p
49、ublic static void main(String args) throws Exception Connection con = openConnection();/简单测试下System.out.println(con);step5:在ctoss.entity包中创立实体类Cost private Integer id; /资费IDprivate String name; /资费名称 NAMEprivate Integer baseDuration; /包在线时长 BASE_DURATIONprivate Float baseCost; /月固定费 BASE_COSTprivate
50、 Float unitCost; /单位费用 UNIT_COSTprivate String status; /0:开通;1:暂停;STATUSprivate String descr; /资费信息说明 DESCRprivate Date startTime; /启用日期 STARTTIMEprivate Date creaTime;/创立时间 CREATIME private String costType;/资费类型 COST_TYPE 各自的get/set方法step6:在ctoss.dao包中新建DAOException类,并继承Exceptionpublic class DAOExc
51、eption extends Exception public DAOException(String message, Throwable cause) super(message, cause);step7:在ctoss.dao包中新建CostDAO接口public interface CostDAO public List<Cost> findAll() throws DAOException; step8:在ctoss.dao.impl包中新建CostDAOImpl类,并实现CostDAOpublic class CostDAOImpl implements CostDAO
52、 private static String findAll = "select ID, NAME, BASE_DURATION, BASE_COST, UNIT_COST, CREATIME, STARTIME, STATUS, DESCR, COST_TYPE from COST_CHANG"public List<Cost> findAll() throws DAOException Connection con = null;try con = DBUtils.openConnection();PreparedStatement stmt = con.p
53、repareStatement(findAll);ResultSet rs = stmt.executeQuery();List<Cost> costList = new ArrayList<Cost>();while (rs.next() costList.add(toCost(rs); return costList; catch (SQLException e) e.printStackTrace();throw new DAOException("访问异常", e);/抛自己定义的DAOException finally DBUtils.cl
54、oseConnection(con);/* 将结果集中的每一条数据转换成每一个Cost对象 */private Cost toCost(ResultSet rs) throws SQLException Cost cost = new Cost();cost.setId(rs.getInt("ID");cost.setName(rs.getString("NAME");cost.setBaseDuration(rs.getInt("BASE_DURATION");cost.setBaseCost(rs.getFloat("B
55、ASE_COST");cost.setUnitCost(rs.getFloat("UNIT_COST");cost.setStartTime(rs.getDate("STARTIME");cost.setStatus(rs.getString("STATUS");cost.setCreaTime(rs.getDate("CREATIME");cost.setDescr(rs.getString("DESCR"); cost.setCostType(rs.getString("
56、COST_TYPE");return cost;step9:在ctoss.dao包中新建DAOFactory工厂类private static CostDAO costDAO = new CostDAOImpl();public static CostDAO getCostDAO() return costDAO; step10:在ctoss.test包中新建TestCostDAO类,用于测试DAO。用JUnit或main方法测试,此处先用main方法测public static void main(String args) throws Exception CostDAO cost
57、DAO = DAOFactory.getCostDAO();List<Cost> costList = costDAO.findAll();for (Cost cost : costList) System.out.println(cost.getId() + "," + cost.getName();step11:在ctoss.action.cost包中新建CostListAction,用于接收请求并处理private List<Cost> costList;/输出属性private CostDAO costDAO = DAOFactory.get
58、CostDAO();/DAO属性不用设置get/set方法costList属性的get/set方法public String execute() throws Exception costList = costDAO.findAll();return "success"step12:在web.xml中配置前端控制器<?xml version="1.0" encoding="UTF-8"?><web-app version="2.4" xmlns=" :/java.sun /xml/ns/
59、j2ee"xmlns:xsi=" :/ /2001/XMLSchema-instance"xsi:schemaLocation=" :/java.sun /xml/ns/j2ee :/java.sun /xml/ns/j2ee/web-app_2_4.xsd"><!-以上都为固定格式-><filter><!- 前端控制器 -><filter-name>Struts2</filter-name><filter-class>org.apache.struts2
60、.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class></filter><filter-mapping><!- 前端控制器映射 -><filter-name>Struts2</filter-name><url-pattern>/*</url-pattern></filter-mapping></web-app>step13:拷贝NetCTOSS静态页面、图片、样式到工程中,结构如下:step14:将
61、静态页面“.html后缀改为动态页面“.jsp后缀1) 首先在页面顶部添加页面指令:<%page pageEncoding="utf-8"%>2) 然后保存页面,最后再去将后缀改为“.jsp,如:cost_list.jspstep15:在cost_list.jsp页面中保存标题行,使用JSTL标签和EL表达式修改数据行<c:forEach items="$costList" var="cost"><!-使用JSTL中forEach标签循环显示-><tr><td>$cost.id</td><!-使用EL-><td><a href="#">$</a></td> <td>$cost.baseDuration 小时</td><td>$cost.baseCost 元</td> <td>$cost.unitCo
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 南阳2025年河南南阳桐柏县招聘高中教师60人(第1号)笔试历年参考题库附带答案详解
- 北京2025年北京市市场监督管理局所属事业单位招聘笔试历年参考题库附带答案详解
- 上海2025年上海市静安区融媒体中心招聘笔试历年参考题库附带答案详解
- 聘用驾驶员安全协议书二零二五年
- 加盟合同样本二零二五年
- 房车托管运营协议
- 二零二五版物品典当抵押借款合同范例
- 财产保全担保合同书
- 二零二五版二手房买卖贷款协议书
- 退出合伙协议书二零二五年
- 幼儿园中班语言课件:《小鸡看世界》
- 马克思主义基本原理考试题库附答案【典型题】
- 部编小学语文单元作业设计四年级上册第三单元 3
- MGD与睑缘炎-课件
- 《脊柱肿瘤》课件
- 礼仪部计划书
- 顺产后健康宣教内容
- 新生儿防烫伤
- 设备经济运行分析报告
- 人工智能技术应用介绍
- 物业费用测算表
评论
0/150
提交评论