《Java EE程序設(shè)計(jì)教程》課件Chapter8 Spring MVC應(yīng)用開(kāi)發(fā)_第1頁(yè)
《Java EE程序設(shè)計(jì)教程》課件Chapter8 Spring MVC應(yīng)用開(kāi)發(fā)_第2頁(yè)
《Java EE程序設(shè)計(jì)教程》課件Chapter8 Spring MVC應(yīng)用開(kāi)發(fā)_第3頁(yè)
《Java EE程序設(shè)計(jì)教程》課件Chapter8 Spring MVC應(yīng)用開(kāi)發(fā)_第4頁(yè)
《Java EE程序設(shè)計(jì)教程》課件Chapter8 Spring MVC應(yīng)用開(kāi)發(fā)_第5頁(yè)
已閱讀5頁(yè),還剩55頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

第八章SpringMVC應(yīng)用開(kāi)發(fā)Web應(yīng)用開(kāi)發(fā)技術(shù)(JavaEE)學(xué)習(xí)目標(biāo)首要目標(biāo)學(xué)習(xí)并掌握SpringMVC的基本原理和開(kāi)發(fā);理解掌握MVC的編程思想;理解掌握SpringMVC常用注解;熟練應(yīng)用SpringMVC和ORM的整合;次要目標(biāo)了解SpringMVC4.x的新特性本章提綱8.1SpringMVC簡(jiǎn)介及新特性8.2SpringMVC中web.xml配置方法8.3SpringMVC的常用注解8.4應(yīng)用基于注解的控制器8.5

SpringMVC和ORM的整合8.6本章小結(jié)8.1SpringMVC簡(jiǎn)介SpringMVC是基于Spring框架構(gòu)建的一個(gè)Web應(yīng)用框架,它通過(guò)實(shí)現(xiàn)Model-View-Controller模式來(lái)很好地將數(shù)據(jù)、業(yè)務(wù)與展現(xiàn)進(jìn)行分離。在SpringMVC以前常用的類似框架有Struts、Webwork等。SpringMVC的設(shè)計(jì)是圍DispatcherServlet展開(kāi)的,DispatcherServlet負(fù)責(zé)將請(qǐng)求派發(fā)到特定的handler。通過(guò)可配置的handlermappings、viewresolution、locale以及themeresolution來(lái)處理請(qǐng)求并且轉(zhuǎn)到對(duì)應(yīng)的視圖??刂破髦饕糜谔幚碛脩粽?qǐng)求,并且構(gòu)建合適的模型并將其傳遞到視圖呈現(xiàn)。模型封裝了應(yīng)用程序數(shù)據(jù),并且通常它們由POJO組成。視圖主要用于呈現(xiàn)模型數(shù)據(jù),并且通常它生成客戶端的瀏覽器可以解釋的HTML輸出。SpringMVCvsStruts2配置方式:Struts2時(shí)采用傳統(tǒng)的XML配置文件,SpringMVC非常靈活Java、XML、注解;核心機(jī)制:springmvc的入口是servlet,而struts2是filter;運(yùn)行機(jī)制:springmvc是方法級(jí)別的攔截,攔截到方法后根據(jù)參數(shù)上的注解,把request數(shù)據(jù)注入進(jìn)去,在springmvc中,一個(gè)方法對(duì)應(yīng)一個(gè)request上下文。而struts2框架是類級(jí)別的攔截,每次來(lái)了請(qǐng)求就創(chuàng)建一個(gè)Action,然后調(diào)用settergetter方法把request中的數(shù)據(jù)注入;springmvc就容易實(shí)現(xiàn)restfulurl;springmvc處理ajax的請(qǐng)求更是方便,只需一個(gè)注解@ResponseBody,然后直接返回響應(yīng)文本即可。SpringMVC架構(gòu)圖SpringMVC架構(gòu)圖SpringMVC4.0的新特性強(qiáng)大、直觀的框架和應(yīng)用bean的配置。這種配置能力包括能夠從不同的上下文中進(jìn)行簡(jiǎn)單的引用,比如在web控制器中引用業(yè)務(wù)對(duì)象、驗(yàn)證器等。強(qiáng)大的適配能力、非侵入性和靈活性。SpringMVC支持你定義任意的控制器方法簽名,在特定的場(chǎng)景下你還可以添加適合的注解(比如@RequestParam、@RequestHeader、@PathVariable等)可復(fù)用的業(yè)務(wù)代碼,使你遠(yuǎn)離重復(fù)代碼。你可以使用已有的業(yè)務(wù)對(duì)象作為命令對(duì)象或表單對(duì)象,而不需讓它們?nèi)ダ^承一個(gè)框架提供的什么基類。程度的靈活性。SpringMVC4.0的新特性可定制的數(shù)據(jù)綁定和驗(yàn)證。類型不匹配僅被認(rèn)為是應(yīng)用級(jí)別的驗(yàn)證錯(cuò)誤,錯(cuò)誤值、本地化日期、數(shù)字綁定等會(huì)被保存。你不需要再在表單對(duì)象使用全String字段,然后再手動(dòng)將它們轉(zhuǎn)換成業(yè)務(wù)對(duì)象??啥ㄖ频奶幚砥饔成浜鸵晥D解析。處理器映射和視圖解析策略從簡(jiǎn)單的基于URL配置,到精細(xì)專用的解析策略,Spring全都支持。在這一點(diǎn)上,Spring比一些依賴于特定技術(shù)的web框架要更加靈活。靈活的模型傳遞。Spring使用一個(gè)名稱/值對(duì)的Map來(lái)做模型,這使得模型很容易集成、傳遞給任何類型的視圖技術(shù)。一個(gè)簡(jiǎn)單但功能強(qiáng)大的JSP標(biāo)簽庫(kù),通常稱為Spring標(biāo)簽庫(kù),它提供了諸如數(shù)據(jù)綁定、主題支持等一些特性的支持。這些定制的標(biāo)簽為標(biāo)記(markup)你的代碼提供了最大程度的靈活性。DispatcherServlet作用主要用作職責(zé)調(diào)度工作,本身主要用于控制流程,主要職責(zé)如下:1、文件上傳解析,如果請(qǐng)求類型是multipart將通過(guò)MultipartResolver進(jìn)行文件上傳解析;2、通過(guò)HandlerMapping,將請(qǐng)求映射到處理器(返回一個(gè)HandlerExecutionChain,它包括一個(gè)處理器、多個(gè)HandlerInterceptor攔截器);3、通過(guò)HandlerAdapter支持多種類型的處理器(HandlerExecutionChain中的處理器);4、通過(guò)ViewResolver解析邏輯視圖名到具體視圖實(shí)現(xiàn);5、本地化解析;6、渲染具體的視圖等;7、如果執(zhí)行過(guò)程中遇到異常將交給HandlerExceptionResolver來(lái)解析。DispatcherServlet的配置<servlet><servlet-name>dispatcher</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><load-on-startup>1</load-on-startup></servlet><servlet-mapping><servlet-name>dispatcher</servlet-name><url-pattern>/</url-pattern></servlet-mapping>load-on-startup:表示啟動(dòng)容器時(shí)初始化該Servlet;url-pattern:表示哪些請(qǐng)求交給SpringWebMVC處理,“/”是用來(lái)定義默認(rèn)servlet映射的。也可以如“*.do”表示攔截所有以do為擴(kuò)展名的請(qǐng)求。HelloWorld案例分析開(kāi)發(fā)此應(yīng)用程序所涉及的技術(shù)如下:Spring4.2.0.RELEASEMaven3JDK1.7以上EclipseJavaEEIDE(LunaServiceRelease2)創(chuàng)建Maven項(xiàng)目創(chuàng)建Maven項(xiàng)目添加SpringMVC依賴工程目錄結(jié)構(gòu)web.xml配置文件SpringMVC--配置文件SpringMVC--運(yùn)行程序SpringMVC--運(yùn)行結(jié)果SpringMVC常用注解@Controller注解@RequestMapping注解@PathVariable@RequestParam等參數(shù)綁定注解@Component@Repository@Service注解@Autowired@Resource@Qualifier注解@Controller注解@Controller注解的類不需要繼承特定的父類或者實(shí)現(xiàn)特定的接口,相對(duì)之前的版本實(shí)現(xiàn)Controller接口變的更加簡(jiǎn)單。而Controller接口的實(shí)現(xiàn)類只能處理一個(gè)單一的請(qǐng)求動(dòng)作,而@Controller注解的控制器可以同時(shí)支持處理多個(gè)請(qǐng)求動(dòng)作,使程序開(kāi)發(fā)變的更加靈活。@Controller注解@Controller@RequestMapping("/cuit")publicclassControllerTest{

@RequestMapping("/xxaq")publicStringhelloWorld(Modelmodel){model.addAttribute("message","Hello!");return"helloWorld";}}@RequestMapping注解@RequestMapping可以用來(lái)注釋一個(gè)控制器類,在這種情況下,所有的方法都將映射為相對(duì)于類級(jí)別的請(qǐng)求,表示該控制器處理的所有請(qǐng)求都被映射到value屬性所指示的路徑下。@RequestMapping注解@Controller@RequestMapping(value="/user")//映射到類級(jí)別publicclassUserController{

@RequestMapping(value="/register")//映射到方法級(jí)別publicStringregister(){return"register";}

@RequestMapping(value="/login")//映射到方法級(jí)別publicStringlogin(){return"login";}}http://localhost:8088/user/registerhttp://localhost:8088/user/login@RequestMapping注解屬性1、value屬性@RequestMapping(value="/hello")或@RequestMapping("/hello")2、method屬性@RequestMapping(value="/hello",method=RequestMethod.POST)3、consumes屬性該屬性指定處理請(qǐng)求的提交內(nèi)容類型(Content-Type)。如下偽代碼:@RequestMapping(value="/hello",method=RequestMethod.POST,consumes="application/json")參數(shù)綁定的注解第一類:處理requestbody部分的注解有:@RequestParam和@RequestBody第二類:處理requeturi部分的注解有:@PathVaribale第三類:處理requestheader部分的注解有:@RequestHeader和@CookieValue第四類:處理attribute類型的注解有:@SessionAttributes和@ModelAttribute@RequestParam注解1、name屬性該屬性的類型是String類型,它可以指定請(qǐng)求頭綁定的名稱;2、value屬性該屬性的類型是String類型,它可以設(shè)置是name屬性的別名;3、required屬性該屬性的類型是boolean類型,它可以設(shè)置指定參數(shù)是否必須綁定;4、defalutValue屬性該屬性的類型是String類型,它可以設(shè)置如果沒(méi)有傳遞參數(shù)可以使用默認(rèn)值。@RequestParam注解@RequestMapping(value="/hello")publicModelAndViewhello(

@RequestParam("loginname")Stringloginname,

@RequestParam("password")Stringpassword){if("123".equals(name)&&"admin".equals(pwd)){......}return...;}假設(shè)請(qǐng)求如下:http://localhost:8088/cuit/login?loginname=cuit&password=123456以上代碼會(huì)將請(qǐng)求中的loginname參數(shù)的值“cuit”賦給loginname變量,password參數(shù)的值“123456”賦給password變量。@PathVaribale注解該注解類型可以非常方便的獲得請(qǐng)求url中的動(dòng)態(tài)參數(shù)。@PathVaribale注解只支持一個(gè)屬性value,類型String,表示綁定的名稱,如果省略則默認(rèn)綁定同名參數(shù)。@RequestMapping(value="/user/{userId})publicvoidpathVariableTest(@PathVaribaleIntegeruserId)假如請(qǐng)求的url地址為:http://localhost:8088/cuit/user/2017007,則自動(dòng)將url中模板變量{userId}綁定到通過(guò)@PathVaribale注解的同名參數(shù)上,即userId變量將被賦值為1。RESTfulAPI設(shè)計(jì)HTTP動(dòng)詞GET(SELECT):從服務(wù)器取出資源(一項(xiàng)或多項(xiàng))。POST(CREATE):在服務(wù)器新建一個(gè)資源。PUT(UPDATE):在服務(wù)器更新資源(客戶端提供改變后的完整資源)。PATCH(UPDATE):在服務(wù)器更新資源(客戶端提供改變的屬性)。DELETE(DELETE):從服務(wù)器刪除資源。RESTfulAPI設(shè)計(jì)GET/zoos:列出所有動(dòng)物園POST/zoos:新建一個(gè)動(dòng)物園GET/zoos/ID:獲取某個(gè)指定動(dòng)物園的信息PUT/zoos/ID:更新某個(gè)指定動(dòng)物園的信息(提供該動(dòng)物園的全部信息)PATCH/zoos/ID:更新某個(gè)指定動(dòng)物園的信息(提供該動(dòng)物園的部分信息)DELETE/zoos/ID:刪除某個(gè)動(dòng)物園GET/zoos/ID/animals:列出某個(gè)指定動(dòng)物園的所有動(dòng)物DELETE/zoos/ID/animals/ID:刪除某個(gè)指定動(dòng)物園的指定動(dòng)物RESTful架構(gòu)RESTful架構(gòu)的問(wèn)題開(kāi)發(fā)者需要深入理解RESTful的設(shè)計(jì)理念,抽象資源+狀態(tài)轉(zhuǎn)化目前只基于HTTP協(xié)議,并且HTTP協(xié)議的動(dòng)詞沒(méi)法覆蓋所有業(yè)務(wù)場(chǎng)景在一個(gè)業(yè)務(wù)場(chǎng)景對(duì)錯(cuò)誤定位相對(duì)困難@SessionAttributes注解@SessionAttributes注解有三個(gè)屬性,分別如下:1、names屬性該屬性的類型是String[],它可以指定Model中屬性的名稱,即存儲(chǔ)在HttpSession當(dāng)中的屬性名稱;2、value屬性該屬性的類型是String[],它可以設(shè)置names屬性的別名;3、types屬性該屬性的類型是Class<?>[],它可以指定參數(shù)是否必須綁定。@SessionAttributes注解@Controller//將Model中的屬性名為user的放入HttpSession對(duì)象當(dāng)中@SessionAttributes("user")publicclassSessionAttributesController{//該方法映射的請(qǐng)求為http://localhost:8088/cuit/login@RequestMapping(value="/login")publicStringlogin(@RequestParam("loginname")Stringloginname,@RequestParam("password")Stringpassword,Modelmodel){//創(chuàng)建User對(duì)象,裝載用戶信息Useruser=newUser();user.setLoginname(loginname);user.setPassword(password);user.setUsername("admin");//將user對(duì)象添加到Model當(dāng)中

model.addAttribute("user",user);return"welcome";}}@ModelAttribute注解該注解類型將請(qǐng)求參數(shù)綁定到Model對(duì)象。@ModelAttribute注解只支持一個(gè)屬性value,類型為String,表示綁定的屬性名稱。@ModelAttribute注解1.注解在參數(shù)上。綁定請(qǐng)求參數(shù)到命令對(duì)象,并把命令對(duì)象添加到Model,用于視圖頁(yè)面展示。@RequestMapping("/save")publicStringsave(@ModelAttribute(“bmw”)Companybmw){service.save(bmw);return"result";}它的作用是將該綁定對(duì)象以“bmw”為key,添加Model對(duì)象中,供視圖頁(yè)面展示使用。頁(yè)面中可以使用${bmw.name}來(lái)獲取綁定對(duì)象的屬性。2.注解在普通方法上(非RequestMapping注解的方法)。@ModelAttribute("bwf")publicUseraddCompany(Companybmw){returnnewCompany("1","cuit");}假設(shè)此方法是寫在某個(gè)Controller內(nèi),那么執(zhí)行該Controller內(nèi)帶有@RequestMapping注解的方法之前,都會(huì)先執(zhí)行此addCompany方法,并且在model對(duì)象中將添加bmw對(duì)象。@Component、@Service、@Repository注解Web應(yīng)用程序采用了經(jīng)典的三層分層結(jié)構(gòu),因此最好在持久層、業(yè)務(wù)層和控制層分別采用上述注解對(duì)分層中的類進(jìn)行注釋。@Service用于標(biāo)注業(yè)務(wù)層組件@Controller用于標(biāo)注控制層組件(如struts中的action)@Repository用于標(biāo)注數(shù)據(jù)訪問(wèn)組件,即DAO組件@Component泛指組件,當(dāng)組件不好歸類的時(shí)候,我們可以使用這個(gè)注解進(jìn)行標(biāo)注。@Resource、@Autowired、@Qualifier注解@Resource默認(rèn)是按照名稱來(lái)裝配注入的,只有當(dāng)找不到與名稱匹配的bean才會(huì)按照類型來(lái)注入。它有兩個(gè)屬性是比較重要的:name:Spring將name的屬性值解析為bean的名稱,使用byName的自動(dòng)注入策略type:Spring將type的屬性值解析為bean的類型,使用byType的自動(dòng)注入策略如果既不指定name屬性又不指定type屬性,Spring這時(shí)通過(guò)反射機(jī)制使用byName自動(dòng)注入策略@Resource、@Autowired、@Qualifier注解@Autowried默認(rèn)是按照類型進(jìn)行裝配注入,默認(rèn)情況下,它要求依賴對(duì)象必須存在,如果允許null值,可以設(shè)置它required為false。如果我們想要按名稱進(jìn)行裝配的話,可以添加一個(gè)@Qualifier注解解決。@Autowried@Qualifier("adminDAO")privateAdminDAOadminDAO;@Resource注解是J2EE提供的,而@Autowried是Spring提供的,如果想減少對(duì)Spring的依賴建議使用@Resource方法。@Resource和@Autowried都可以加在字段的setter方法上。@Controller中方法的返回值類型SpringMVC支持以下幾種返回方式:ModelAndViewModelModelMapMapViewStringvoid

@Controller中方法的返回值類型ModelAndView分為兩部分:Model和View。Model將后臺(tái)處理的數(shù)據(jù)回傳到View

View就是展現(xiàn)頁(yè)面,比如jsp頁(yè)面等@RequestMapping(value="/sayHi")publicModelAndViewhello(){ModelAndViewmodelAndView=newModelAndView();modelAndView.setViewName("hello");modelAndView.addObject("message","HelloWorld");returnmodelAndView;}

publicModelAndViewhello(){

return

newModelAndView("hello","message","HelloWorld");

}

ModelAndView(StringviewName,StringattributeName,ObjectattributeValue)@Controller中方法的返回值類型Model、ModelMap類型Model是包含四個(gè)addAttribute和一個(gè)mergeAttributes方法的接口。ModelMap實(shí)現(xiàn)了Map接口,包含Map方法。@RequestMapping("/show")publicStringindex(Modelmodel){model.addAttribute("result","后臺(tái)返回index");return"index";}@RequestMapping("/show")publicStringindex(ModelMapmodel){model.addAttribute("result","后臺(tái)返回index");return"index";}@Controller中方法的返回值類型Map類型@RequestMapping("/demo2/show")publicMap<String,String>getMap(){Map<String,String>map=newHashMap<String,String>();map.put("key1","value-1");map.put("key2","value-2");returnmap;}在jsp頁(yè)面中可以直接通過(guò)${key1}獲取到值,map.put()相當(dāng)于request.setAttribute方法@Controller中方法的返回值類型Map類型@RequestMapping("/demo2/show")publicMap<String,String>getMap(){Map<String,String>map=newHashMap<String,String>();map.put("key1","value-1");map.put("key2","value-2");returnmap;}在jsp頁(yè)面中可以直接通過(guò)${key1}獲取到值,map.put()相當(dāng)于request.setAttribute方法@Controller中方法的返回值類型String類型@RequestMapping(value="/showdog")publicStringhello1(){return"hello";}指定返回的視圖頁(yè)面名稱,結(jié)合設(shè)置的返回地址路徑加上頁(yè)面名稱后綴即可訪問(wèn)到。return“redirect:index”;//重定向return“forward:index”;//頁(yè)面轉(zhuǎn)發(fā)注:如果方法聲明了注解@ResposeBody(一般是返回json格式的數(shù)據(jù)),則會(huì)直接將返回值輸出到頁(yè)面。返回視圖URL構(gòu)成使用String作為請(qǐng)求處理方法的返回值類型是比較通用的方法,這樣返回的邏輯視圖名不會(huì)和請(qǐng)求URL綁定,具有很大的靈活性,而模型數(shù)據(jù)又可以通過(guò)ModelMap控制。使用void,Map,Model時(shí),返回對(duì)應(yīng)的邏輯視圖名稱真實(shí)url為:prefix前綴+視圖名稱+suffix后綴組成。使用String,ModelAndView返回視圖名稱可以不受請(qǐng)求的url綁定,ModelAndView可以設(shè)置返回的視圖名稱。SpringMVC-參數(shù)綁定1.SpringMVC將ServletRequest對(duì)象傳遞給DataBinder;2.將處理方法的入?yún)?duì)象傳遞給DataBinder;3.DataBinder調(diào)用ConversionService組件進(jìn)行數(shù)據(jù)類型轉(zhuǎn)換、數(shù)據(jù)格式化等工作,并將ServletRequest對(duì)象中的消息填充到參數(shù)對(duì)象中;4.調(diào)用Validator組件對(duì)已經(jīng)綁定了請(qǐng)求消息數(shù)據(jù)的參數(shù)對(duì)象進(jìn)行數(shù)據(jù)合法性校驗(yàn);5.校驗(yàn)完成后會(huì)生成數(shù)據(jù)綁定結(jié)果BindingResult對(duì)象,SpringMVC會(huì)將BindingResult對(duì)象中的內(nèi)容賦給處理方法的相應(yīng)參數(shù)。SpringMVC-默認(rèn)參數(shù)綁定SpringMVC有支持的默認(rèn)參數(shù)類型,我們直接在形參上給出這些默認(rèn)類型的聲明,就能直接使用。如下:①、HttpServletRequest對(duì)象②、HttpServletResponse對(duì)象③、HttpSession對(duì)象④、Model/ModelMap對(duì)象SpringMVC-基本數(shù)據(jù)類型綁定一、byte,占用一個(gè)字節(jié),取值范圍為-128-127二、short,占用兩個(gè)字節(jié),取值范圍為-32768-32767三、int,占用四個(gè)字節(jié),-2147483648-2147483647四、long,占用八個(gè)字節(jié),對(duì)long型變量賦值時(shí)必須加上“L”或“l(fā)”,否則不認(rèn)為是long型五、float,占用四個(gè)字節(jié),賦值的時(shí)候必須加上“F”或“f”六、double,占用八個(gè)字節(jié),賦值的時(shí)候最好加上“D”或“d”七、char,占用兩個(gè)字節(jié),在定義字符型變量時(shí),要用單引號(hào)括起來(lái)‘’八、boolean,只有兩個(gè)值“true”和“false”,默認(rèn)值為false,不能用0或非0來(lái)代替。SpringMVC-基本數(shù)據(jù)類型綁定JSP頁(yè)面代碼:<formaction="basicData"method="post"><inputname="username"value="10"type="text"/><inputtype="submit"value="提交"></form>表單中input的name值和Controller的參數(shù)變量名保持一致,就能完成數(shù)據(jù)綁定。Controller代碼:@RequestMapping("/basicData")publicvoidbasicData(intusername){

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論