SSH重点部分.pdf

上传人:文*** 文档编号:92163081 上传时间:2023-05-30 格式:PDF 页数:49 大小:4.55MB
返回 下载 相关 举报
SSH重点部分.pdf_第1页
第1页 / 共49页
SSH重点部分.pdf_第2页
第2页 / 共49页
点击查看更多>>
资源描述

《SSH重点部分.pdf》由会员分享,可在线阅读,更多相关《SSH重点部分.pdf(49页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。

1、Struts2的使用重点-2-配置和ACTION的使用-2二 值栈和OGNL-6三 struts!配置 通配符-8四 结果类型-9五 struts2.0 标签的使用-10Hibernate的使用重点-13一 model与它的反向生成-13二 Hibernate内使用到的方法-18三 hql语句-22四 Hibernate 的 DEMO-221 第一个 例 子(只使用 Hibernate)-222 第 2 个 例 子(使 用 struts!和 Hibernate的结合)-23Spring的使用重点-28一 Spring 的 IOC-28例 1 建立一个工程叫demoSpring选择工程点击MyE

2、clipse选择Add SpringCapabilities.29例 2(struts2+hibemate+spring 结合使用).32推荐书籍48Struts!的使用重点 配置和ACTION的使用Struts2的配置可以分成三个单独的文件,如图所示。web.xmlstruts.xml&struts.propertiess-0一d。三setXxx()execute!)ActiongetXxx()JSP-9=L LFilterDispatcher是一个servlet过滤器,它是整个Web应用的配置项,需要在“web.xm 中进行配置:web.xml 配置stnits2org.apache.st

3、njts2.dispatcher.FilterDispatcherstruts2/*如果是配置一个最基本的Web应用的话,这样就足够了。剩下的就是自定义一些Web应用的执行环境和配置应用中的组件。其中前者主要通过“struts.properties”来完成,而后者是在“struts.xml”中进行配置的。我们下面来看一下这两个配置文件的细节。“struts.xml”文件中包含的是开发Action时所需要修改的配置信息。在接下来的内容中,会针对特定的元素进行详细讲解,但现在让我们先来看,下文件的固定结构。struts.xml 配置test.jsp注:method=,tesf,将默认调用testA

4、ction中的test方法namespace=/test”的效果是test.jsp在 webRoot目录下的test文件夹中,并且访问页面时访问的是 httD:/localhost:8888颐目名/test/test.action 目的是将 action 放在 namespace空间下因为这是一个XML文件,所以最开始的元素就是XML版本和编码信息。接下来则是XML的文档类型定义(DTD)。DTD提供了 XML文件中各个元素所应使用结构信息,而这些最终会被XML解析器或者编辑器使用o我们现在看到了 struts 标签,它位于Struts2配置的最外层,其他标签都是包含在它里面的。Include

5、 标签:include./是 struts 标签的一个子标签,它可以把其他配置文件导入进来,从而实现Stnits2的模块化。它的节le”属性定义了要导入的文件的名称该文件要和“struts.xml”一样有着相同的结构。比如说,如果要把一个记账系统的配置分解的话,你可能会把记账、管理和报表的功能各自组织到不同的文件中:当我们导入文件时,一定要注意导入的顺序。因为从文件被导入的那个点开始,该文件中的信息才能被访问到,也就是说,如果要使用另外一个文件中所定义的标签,那么该文件就必须要在被引用之前就配置好。testAction.java 内容package test.demo;import com.o

6、pensymphony.xwork2.ActionSupport;public class testAction extends ActionSupport private String pageTextl;private String pageText2;public String execute()System.o f.pri ml n(execute 方法开始);System.r9M/.println(pageText 1 =n+pageTextl);System.?wr.println(,pageText2=4-pageText2);System,a”.println(execute方

7、法结 束);return SUCCESS:)public String test()System.oprinUn(test方 法开始万System.oMr.println(pageTextl=+pageTextl);System.f?w/.println(,pageText2=,+pageText2);System.o/.println(test 方法结束)return SUCCESS,)public String getPageTextl()return pageTextl;)public void setPageText 1 (String pageTextl)this.pageText

8、1 =pageTextl;)public String getPageText2()return pageText2;)public void setPageText2(String pageText2)this.pageText2=pageText2;)test.jsp 内容$(document).ready(function()$(#pageButtonr).bind(click,function()selectForm.action=test.actionn;selectForm.submit(););$C#pageButton2,).bind(click,function()selec

9、tForm.action=test!test.actionu;selectForm.submitO;);)input type=HtextH name=HpageText 1 id=*pageText 1Mvalue=Hn/input type=text name=,pageText2n id=npageText2value=/重点:action的 3 种调用selectForm.action=Mtest.actionM;此action访问的是teslAction中的默认方法selectForm.action=Mtest!test.action;此 action访问的是testAction中的

10、test方法配置 staits.xml 内的 methodmethod属于配置默认方法(声讯中经常使用的就是这三种)二 值 栈 和 OGNL1 struts!的 OGNLOGNL是 Struts 2 框架的默认表达式语言,增强了 Struts 2 的数据访问能力,同时简化了代码。2 Struts 2 的 OGNL表达式OGNL内部臼己会维护一个OGNL上下文(OgnlContext)是一个实现了 Map接口的对象,OGNL会将对象放在这个上下文中统一管理的,并且会有一个对象被指定为根对象(root)o 假设有User和 Customer这么两个类,分别有user和 customer两个实例,这

11、两个对象都有一个name属性,并且将user对象配置为唯一的根对象,那么就会有下面的情况:1.#user.name 返回 user.getName();2.#customer.name 返回 customer.getName();3.#name 返回user.getName。;因为user对象为根对象OGN L 访问对象的基本机制就是这样的。在 XWork中,ValueStack对象是上下文中的根对象,XWork中不仅可以根据表达式从ValueStack对象中获取对象,还可以获取对象的属性,XWork自己有一个强大的属性访问器,它可以自动搜索栈内的所有实体(从匕到下),直到找到你所访问的对象和

12、属性。假设ValueStack栈中有两个上面所说的user和 customer两个对象,并且user是栈顶元素,customer在下面,就会有下面的情况:name返回user.getName。;因为user在栈顶,搜索器找到一个匹配的属性就不会继续找下去如果希望访问靠后对象的属性XWork提供了索引访问ValueStack的方法:OJ.name 返回 user.getName()l.name 返回 customer.getName();了解上面这些之后Struts2中的OGNL就很好理解了,Struts2框架也没有对XWork中的 OGNL做太大的修改,只是拿过来做了 一下整合工作,Strut

13、s2将 ActionContext设置为OGNL中的上下文,ValueStack依然是OGNL上下文中的根元素,大家知道application,session和 request这几个对象也是在ActionContext中的,它们是和根对象ValueStack共存的,9根对象是无关的,就像刚开始说OGNL那个例子实在OGNL上下文中的两个平行对象,只不过 ValueStack这个对象是这个OGNL上下文中的根对象(root)。如果要访问上下文中根对象中的对象和属性是不用加任何标记符号的,但是在访问application,session和 request这几个范围内的对象和属性就要用“#符号来告诉

14、ognl不要在根对象中去搜索了,而是去我们指定的上下文中去找。用官方一个图来形象描述ValueStack和其他儿个对象的关系:图 Struts 2 的 OGNL Context结构示意图基本原理就是这样了,举例验证理论。1.ActionContext是 OGNL的上下文,ValueStack对象是上下文中的根对象:随便找一个Aclion给 JSP页面传东西过去的例子,然后在Action的 execute。方法中加入以下代码:ActionContext.getContextO.getValueStackO.setCtest*1,2 love java);在目标 JSP页面空白处加上如下代码:再次

15、跳转到该页面就可以看到love java出现在页面上了2.OGNL上下文的访问Action中加入代码:ActionContext.getContext().put(Htest2,Mlove java2H);JSP页面中加入:看到lovejava2之后应该大彻大悟了吧总结:在 JSP页面中“”就表示OGNL表达式开始三struts!配置通配符例 1 有一个 CrudAction,其中有两个方法,input和 delete,我们定义两个action:Crud_input和 Crud_delete0我们可以在struts.xml中配置如下:xm l代码这 样,当 struts2遇到Crud_inpu

16、t时,就会自动去找Crud的 input方法,当遇到Crud_delete时,就会自动去找Crud的 delete方法。见另一个例子:xm l代码这里,当struts2解析到editCrud时,就会自动去找Crud的 edit方法。按我的理解,method”1”的意思就是告诉struts2去找前面*中出现的方法并执行。例 2.解释一下上面代码的含义:上面定义的不是一个普通的action,而是定义了一系列的action,只要URL是*人以沁1 1 衣打011的模式,都可以通过该Action进行处理。但 该 Action定义了,个表达式 1 ,该表达式的值就是name属性值中的第一个*的值。例如,

17、如果用户请求的URL是 loginAction.action,则调用该action的 login方法;如果用户请求的 URL 是 re gist Action.action,则调用该 action 的 regist 方法。例 3.比如说:如 果 U R L为 RegistAction.action,可以匹配上面的action,该 action的处理类是cc.dynasoft.Regist Action例 4 当-个action为 Book_save.action的时候将调用BookAction的 save方法来处理用户请求。注意这个时候指定校验文件需要注意,比 如 说 Book_save.ac

18、tion的校验文件应该是Book_save-validation.xml例 5/1 .jsp这个应该不难理解,呵呵。以下需要注意的问题:如果有 URL 为 abcAction.action 的请求,如果 struts.xml 文件有名为 abcAction 的 Action,则一定由该Action来处理用户请求;如果struts.xml文件没有名为abcAction的 A ction,则搜 索 name属性值匹配abcAction的 A ction,例 如 name为*Action或*,*Action并不会比*更优先匹配abcAction的请求,而是先找到哪个Action,就先由哪个Actio

19、n来处理用户的请求。因此,我们应该将名为*的Action配置在最后,否则struts2将使用该Action来处理所有希望使用模式匹配的请求。四 结 果 类 型struts2通过在struts.xml文件中使用 元素来配置结果,根据 元素所在位置的不同,struts2提供了两种结果。局部结果:将 result 作为 action 元素的子元素配置全局结果:将 result 作为元素的子元素配置。以下列出比较标准的配置:/thank_you.jsptruelocation:用于指定实际视图资源parse:该参数指定是否允许在实际视图名称中使用ONGL表达式,默认为true。如果设置为 false则

20、不允许使用,通常不需要修改。一般我们比较常用的写法:/thank_you.jsp 注意如果没有指定name属性:则默认是success;如果没有指定type,则默认就是dispatcher,即 JSP下面列出struts?内建支持的结果类型如下:chain:Action链式处理的结果类型,也就是将结果转发到这个action中。chart:整合JFreeChart的结果类型dispatcher:用于整合JSP的结果类型freemarker:用于整合freemarker结果类型。httpheader:用于控制特殊的HTTP行为的结果类型。jasper:用于Jas perReports整合的结果类型

21、jsf:用于整合JSF后的结果类型redirect:实际上dispatcher和 redirect的区别就是在于转发和重定向的区别。redirect-action:用于直接 redirect action0stream:用于向浏览器返回一个Inputstream(用于文件下载)tiles:用于整合Tiles后的结果类型。velocity:用于整合Velocity的结果类型。xslt:用于整合XML/XSLT的结果类型。plaintext:用于显示某个页面的源代码。plaintexts redirect 以及 redirect-action 的配置分别如下:/welcome.jsp!设置字符集编

22、码gb2312/welcome.jsp/ss!一指 定 action的名字login 在请求结果中使用ONGL表达式例子:edit.action?skillName=$currentSkill.name对于上面的表达式语法,要 求 action中必须包含currentskill属性,并且currentskill属性必须包含name属性,否则$currenlSkin.name表达式值为null。属性驱动和模型驱动我不推荐使用模型驱动,属性驱动完全可以实现模型驱动的效果。五truts2.0标签的使用用过strutsl.x的人都知道,标签库有html、bean、logic、tiles,而struts

23、2.0里的标签却没有分类,只用在jsp头文件加上就能使用struts2.0的标签库A:-一超链接,类似于 html 里的va-执行一个 view 里面的一个 action-如果action的 errors有值那么显示出来-如果action的 message有值那么显示出来-添加一个值至U lis t,类似于 list.addQ;-自动完成vs:combobox标签的内容,这个是 ajaxB:-类似于 strutsl.x 中 的,JavaBean 的值C:-复选框-多选框-下拉框-图 像符号D:-获取日期格式-日期输入框-显示错误信息-表示一个块,类似于 html 的-双下拉框E:-这 3 个标

24、签,起使用,表示条件判断F:-显示文件错误信息-文件上传-获取相应 form 的值G:-一和标签一起使用H:-在使用,表示头文件结束-隐藏值I:-加载资源包到值堆栈-包含一个输出,servlet 或 jsp 页面-获取 form 的一个输入-用 于遍 历集合L:-只读的标签M:-合并遍历集合出来的值0:-获取标签组-左 彳 j选择框P:-为其他标签提供参数-密码输入框-得到value 的属性-value 的值 push 到栈中,从而使 property 标签的能够获取 value的属性R:s:radio list=-单选按钮-重 置按钮S:-单选框-赋予变量一个特定范围内的值-通过属性给 li

25、st 分类-提交按钮-为遍历集合输出子集T:-表格框-表格-I18n 文本信息-文本域输入框-文本输入框-拦截器-树-树 的结构U:-多选择框-创建 urlHibernate的使用重点一 model与它的反向生成Window-Preferences-MyEclipse-Database ExplorerDatabase Drivers选择DB Browser创建连接在 DB Browser内右键选择New.跳出 S S H*.4 .d o c-M l.HMyEdpseJavaEnterp.rv W rv k h m rhD atabase Driverl *Y?-J u9 Ecft Datab

26、ase Connection Driver-g.Edt the connection diverDriver ten-.-J,i*图 梭 揭 库 医 京 修 悻 的 是M Q D号)连接数据库的U R L受防则S厚的账号AddJARs 建挨效雄厚的JAR包Driver dassname:_ 5vepMWK)rd!Saved X f s w a*are stored on your computer c a fie th&3“fcUt,butnot mposable,for an intruder to read.屋的密码逐指*/q l数得厚以萧连强的名字X)v m二=s按图中输入完毕后点下一步

27、,完成的效果是也在图上显示的那样此时选择工程再点击 MyEclipsef Add Hibernate Capabilities.M 5 doc-Ml.-MyEdpse Java Enterp MyEdpse Java Entetp.SMrchF u,JV j F、tu 3 ruivokwto.uxt M1H hr.,”I.lur.t u tMUI I.N ew H tje rrw te P roject 0信 嗖 帐;15:38 QHfcemate Support for MyEcIpseEnabte project for Hfoemate devdocxnentr j:-l F ir 凶

28、rterarchy,二 S EHbemate 5pecfic4Uon Mfcetnate 2.Mbemate 3*Hbemate 3.1 1h,MyCdPMJvv.*加aSelect the ftrarm to add to the buidpathShow:0 MyEcIpse Ubranes _ User Lfarares9 Hbemate 3 1 Core lttrariw-9 NUnte 3 I Advanted Support Ubie5 MvfditHe4.fcrView and H ltrar )BSMyEdpse Derby选择Next到下面图片这个页面,按图上的要求填写完毕坦

29、S S H n S部分.doc-Ml MyEdpse Java Enterp.HyEdpse Java Enterp.后嗖帐;15:40 Q型Rekaev*$M*ch.r.1雄 浊 3 ula va FntAm ricQ nauolrwtntottt-M vFrtirtc*Fnnrnric U M rlrlw n rhN ew Fberrw te Project卜tibemate Support for MyEcfipseSpecfy Hbemale ccrnection det”,0“EdpwMv ,DataSource:D B D rM;Driver Gass:Username:Passw

30、ord:M e e t:M Copy 06 driver)ar(s)to project and add to bulctkath?Correct URL:Use J06C Driver _ Use JND1 DaEaScxxceb itocdhostiXWS/sxcon.tnysl.)dbc.Drt*r日 Specify ddtabdse connection defafc?;S tc h.)(R k o d 僧9%A1%W%WW8%M%ES%testHreadNew)erndte ProjectCreate Ftibemate SessionFactory for MyEdipseDefi

31、ne SesscnFactory properties_ l&M te Sewo r f octory d w|)wa wuice M der:u:X a l.4 M v5f o ceerowtef 区0 MyEdpse Derby 0 sx,lyEdpwJM,I rmotto如图一样后选择Finish达成的效果由 model&src由 test,hibernate.cfg.xml 多了个 hibemate.cfg.xml 的配置文件此时打开DB B row ser里 的sxffl New Table虎 New Foreign Key缶 New Index国 Edit DataX Drop T

32、ableX Delete All Rows RefreshGenerate值 JPA Reverse Engineering.B EJB3 Reverse Engineering.,ervers Synchl.u.-:/Hibernate Reverse Engineering.SVN H(Copy Object Na is s r-霞 predialservice 霞 privilege 霆 request response 剧 role_privilege_ref 跑 role G quq naram然后Htoemate Reverse EngmeerinQ6 6 0M*ch froioc

33、t HyEcipM卜tibemate Mapping and Appfication GenerationGenerate Hbemate mapprw and Jav daues from database exptorw(ableiMc#pseJavaEnterp.MyEdpse Java Entwp&JAVA AND JSP 一占4S S H .5S.d o c-M I.哥 A;0 K 16:02 Q曲。MyEdpsoHbe.M y fd lp ie .:Package Explorer 次 rterarchyJavaKC folder:AWO W C (o w e.)levapckAg

34、:(*w e.J色 H b etM e m ta n g Me(.hbm.xnl)for each t a b g tblf UpdMe hbemate ccr6gurtion T h mappnq Ne ioubon0 加a 皿 Obtect(POJO DB Tg_ Create abstract class8a$epersstent doss:|(Brome.J_ Java 必 Accew Object(DAO)(Hbemate 3 哂)J Generate precise findBy methodi BM KDAO Spring DAO JNDIDAO_ Uc custom toirp

35、latesferrdflte drectory.二 令 I E i d Model 0 r c田 test,,hbemate.dg.xnrf B PE Syrtwn library MyEdpse 5.5.1 GA *,而a E E S l b-Br:Mbernate 3.1 Core ubrarws ft.Hbernate 3.1 Advanced Sipport L trarn .WctAoot CRSPOTOeO55省 f t code/%E9%AlU9%E7%98%A%ES%Lu test ThreadJ r e*L _ 空 (JM )6 2)(ci)选 择Next 电 Q M dlp

36、seJavaEgp.MyEdpse Java Enterp JAVA AND JSP-力 SS5 部分.doc-ML.m 马 也 帐;.16:02 Q1 胡 的 X*,,:Package Explorer 次 Hterarchy 由 model 上 srcffi tert*hternate.cfg.xmi B JR System Library(MyEdpso 5.5.1 GA)Jv4 EE 5 Llbrarm&.Hbernaee 3.1 Core bbrarles B.Hbemate 3.1 AdvancedScfiport Ubrane WetRoot tj?sPQToeossLJtwtT

37、Weadooo二 M yE cIp jertb e.,砂Myfdpw加=,n继续选择直到完成。F prodiafoevKe prMex request T retponsc rote_prwiege_ref 5 rote vc twjm此时就生成了 model的bean和hbm文件殊 model 5src由 test T|Log.java沟 Log.hbm.xml hibernate.cfg.xml其他表也是如此重复的生成至 此model的bean和hbm文件生成任务完成二 Hibernate内使用到的方法项目里的BaseDaoImpl.java内已经封装好经常使用到的增删改查的一些Hiber

38、nate方法现在一一说明package mons.basedao;import java.io.Serializable;import java.util.List;import java.util.Map;import org.springframework.orm.hibernate3.HibernateCallback;*Title:DAO接口访问数据库*Description:*Copyright:Copyright(c)2008-6-16*Company:fsti*author 黄斌*version 1.0*createtime 2008-6-16-下午 04:00:26*修改历史*

39、vli版本号修改日期修改人修改说明*/public interface IBaseDAO/*取得所有对象*param clazz*return*/public List get Objects。;/*根 据 唯 ID 取得唯对象,此方法必需ID 在数据库里存在 否则会报异常param clazz*param id*return*/public T getObject(Serializable id);public void saveObject(T object);public void removeObject(Serializable id);public void updateObjec

40、t(T object);public List find(String hql);public List find(String hql,T value);public List findByParams(final String hql,final Map params);public List find(String hql,Tf value);public void initialize(Object o);public Object execute(HibernateCallback callback);public void deleteObject(T object);public

41、 void saveOrUpdate(T object);/*获得分页数据对象*param hql*param pageStart*param maxResuk*ret urn*/public List getPagingByHql(finaI String hql,final int pageStart,final int maxResuIt);/*获得有限个数据对象*param hql*param maxResult*ret urn*/public List getLimitedObjects(final String hql,final int maxResult);/*计算总数*par

42、am hql*return*/public int countByHql(final String hql);/*通过hql删除更新记录*param hql*/public void deleteOrUpdate(final String hql);/*可进行传参分页查询(处理中文乱码)*param hql*param params*param pageStart*param maxResult*return*/public List getPagingByParams(final String hql,final Map params,final int pageStart,final in

43、t maxResult);/*根据传入的HQL计算条数*param strHq*ret urn*/public int findCountByParams(String hql,Map params);三 hql语句压栈:凡是String类型的条件,全是以Map的形式传到hql语句中,进行条件查询Hql语句的写法:进行对象,实体的操作HQL查询:Criteria查询对查询条件进行了面向对象封装,符合编程人员的思维方式,不 过 HQL(Hibernate Query Lanaguage)查询提供了更加丰富的和灵活的查询特性,因此Hibernate将 HQL查询方式立为官方推荐的标准查询方式,HQ

44、L查询在涵盖Criteria查询的所有功能的前提下,提供了类似标准SQL语句的查询方式,同时也提供了更加面向对象的封装。完整的HQL语句形势如下:Select/update/delete.from.where.group by.having.order by.asc/desc四 Hibernate 的 DEMO1 第一个例子(只使用Hibernate)先建张表create table student(id integer not null auto_increment,name varchar(64),classnamevarchar(32),primary key(id)依照前面的反向生成b

45、ean和 hbm文件方式,反向生成此student表Hi bern ate.cfg.xml 里的 vsessi on-factory 增 力 口注释:包名/hbm名新建一个 DemoClass.javapackage com.demo;import java.io.File;import org.hibernate.Session;import org.hibernate.SessionFactory;import org.hibernate.Transaction;import org.hibernate.cfg.Configuration;import org.hibernate.tool

46、.hbm2ddLSchemaExport;public class DemoClass Session session;public static void main(String args)DemoClass demo=new DemoClass();demo.testM();)public void testM()Configuration config=new Configuration().configure(newFile(nsrc/hibe rnate.cfg.x ml);SchemaExport export=new SchemaExport(config);export.cre

47、ate(tme,true);SessionFactory factory=config.buildSessionFactoryO;session=factory.openSession();Transaction ts=this.session.beginTransaction();Student s=new Student();s.setN ame(黄斌”);s.setClassname(SCJP+7jffi);session.save(s);session.flush();mit();)运行此文件,正常就说明你成功了。2 第 2 个 例 子(使 用 struts!和 Hibernate的结

48、合)接着第一个范例增加配置struts2的配置文件,struts.xmltest.jspACTION配置test Action.javapackage com.demo;import com.demo.Main;import com.opensymphony.xwork2.ActionSupport;public class testAction extends ActionSupport private static final long serialVersionUID=-6515667483471289606L;private String pageTextl;private Strin

49、g pageText2;/*验 证*/private String pageResult=initM;public String execute()return SUCCESS;)public String test()Main m=new Main();m.execute l(pageText 1,pageText2);page Result=sue;return SUCCESS;)public String getPageTextl()return pageText 1;)public void setPageText 1 (String pageText 1)this.pageTextl

50、=pageText 1;)public String getPageText2()return pageText2;public void setPageText2(String pageText2)this.pageText2=pageText2;)public String getPageResult()return pageResult;)public void setPageResult(String pageResult)this.pageResult=pageResult;Main.javapackage com.demo;import java.io.File;import or

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 教案示例

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知得利文库网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号-8 |  经营许可证:黑B2-20190332号 |   黑公网安备:91230400333293403D

© 2020-2023 www.deliwenku.com 得利文库. All Rights Reserved 黑龙江转换宝科技有限公司 

黑龙江省互联网违法和不良信息举报
举报电话:0468-3380021 邮箱:hgswwxb@163.com