一、SpringMVC是什么 SpringMVC全称SpringWebMVC是一个基于ServletAPI构建的原始Web框架,从一开始就包含在Spring框架中Web框架 在之前学习Servlet的时候就已经接触到Web。所谓的Web框架,就是当用户输入一个URL地址后,将URL地址和程序进行映射,然后通过程序获取到用户的请求,经过请求的处理后,服务器发送的响应能够返回到客户端,将结果展示给用户ServletAPI 有关ServletAPI的介绍文章MVC含义 MVC是一种软件工程中的一种软件架构模式,将软件系统分成了模型、视图、控制器三部分 M(Model):指的是模型,用于处理应用程序数据逻辑部分 V(View):指的是视图,用于处理数据显示部分 C(Controller):指的是控制器,用于处理用户交互的部分 解释 用户通过浏览器去访问程序的时候,请求会先到Controller(控制层),控制层验证参数的合法性,如果没有问题的话,就会将请求转发给Model(模型)进行业务的处理,然后将结果(业务数据)响应给控制层,然后控制层再将数据发送给View(视图),视图最后做合并和整理工作,组装成了一个HTML页面,最后将页面响应给用户 总的来说,MVC就是一种思想,SpringMVC就是对MVC这是一种思想的具体实现二、SpringMVC具体使用2。1SpringMVC创建 SpringMVC使用SpringBoot的方式创建的,创建的SpringBoot项目过程中有勾选依赖这一环节,勾选的SpringWeb框架就是SpringMVC框架,将该依赖给勾选上了,其余的就是正常的创建SpringBoot项目的步骤 2。2SpringMVC连接 SpringMVC连接即将用户和Java程序进行连接,用户通过一个地址就可以调用到Spring程序RequestMapping注解 在SpringMVC中常常使用RequestMapping注解实现路由映射 路由映射就是用户访问URL时,能够将用户的请求和程序中的某个类中的某个方法对应起来RestControllerRequestMapping(index)publicclassUserController{RequestMapping(hello)publicStringfunc(){returnh1HelloSpringMVCh1;}}解释当启动项目后,访问地址http:127。0。0。1:8080indexhello就能获取到返回的内容HelloSpringMVCRestController注解是Controller和ResponseBody这两个注解的合体。添加Controller注解是为了项目启动后,该类放在了Spring容器中,被加载,方才能被访问到。添加RequestBody注解是因为默认情况下会返回一个静态页面,但是此时只是返回一个数据,因此需要添加RequestMapping注解是可以修饰类,也可以修饰方法,一定要在方法上添加注解,类上面不一定需要默认情况下,RequestMapping接收GET方式的请求,但是也可以接受POST方式的请求显示指定方法RestControllerRequestMapping(index)publicclassUserController{RequestMapping(valuehello,methodRequestMethod。POST)publicStringfunc(){returnh1HelloSpringMVCh1;}} 通过method参数内容就可以指定具体的接收方法,此时该方法只能接收POST请求GetMapping和PostMapping 除了在RequestMapping注解中指定接收的方法之外,也可以直接使用GetMapping和PostMapping注解,前者使得方法只能接收GET请求,后者使得方法只能接受POST请求2。3如何获取参数2。3。1通过URL传递参数 例如URL:http:127。0。0。1:8080indexgetUser?userNamepeterpassWord123 想要获取userName和passWord对应的内容,可以直接使用方法中的参数来实现传参代码展示RestControllerRequestMapping(index)publicclassUserController{RequestMapping(getUser)publicStringgetUser(StringuserName,StringpassWord){returnuserNameuserNamepassWordpassWord;}}结果显示 注意 2。3。2通过表单传递参数 通过表单进行参数的传递方法也是和上面差不多的 代码同上面的代码展示,通过PostMan进行提交form表单,也需要注意参数的对应结果展示 2。3。3传递对象 在参数较少的情况下,会使用直接传参的方式,如果参数较多时,使用对象进行传参会更好代码展示DatapublicclassUser{privateStringuserName;privateStringpassWord;}RestControllerRequestMapping(index)publicclassUserController{RequestMapping(getUser1)publicStringgerUser1(Useruser){Stringnameuser。getUserName();Stringworduser。getPassWord();return对象中的userName:name对象中的passWord:word;}}结果显示 代码参数是一个User对象,说明待会需要接收的就是一个对象,然后就会拿着这个对象中的所有属性,在请求中匹配参数2。3。4补充后端参数的重命名 后端参数名未必一定要和前端参数名一模一样,可以通过RequestParam注解来重命名前后端的参数值RequestMapping(getUser)publicStringgetUser(RequestParam(userName)Stringname,StringpassWord){returnuserNamenamepassWordpassWord;} 前端的参数key是userName和passWord,后端的参数key是name和passWord设置参数必传非必传 同样是上面的代码,如果参数中只传了userName参数会怎样,只传了passWord参数会怎样结果显示 如果没有传递passWord参数,影响不大 如果没有传递userName参数,就会报400错误 原因就是RequestParam中的required参数默认值为true,表示为必传参数 如果有参数需要使用RequestParam注解且该参数是非必传参数,就需要将required参数值设置为falseRequestMapping(getUser)publicStringgetUser(RequestParam(valueuserName,requiredfalse)Stringname,StringpassWord){returnuserNamenamepassWordpassWord;}2。3。5接收JSON对象 使用RequestBody来接收JSON对象代码展示RestControllerRequestMapping(index)publicclassUserController{RequestMapping(loginByJson)publicStringloginByJson(RequestBodyUseruser){returnuserName:user。getUserName()passWord:user。getPassWord();}}结果显示 2。3。6获取URL中的参数 一般来说,获取URL中的参数一般是指获取queryString中的参数值,但还有一种特殊的,就是从URL的PATH中获取参数 需要通过PathVariable注解代码展示RestControllerRequestMapping(index)publicclassUserController{RequestMapping(loginByPath{userName}{passWord})publicStringloginByPath(PathVariable(userName)Stringname,PathVariableStringpassWord){returnuserName:namepassWord:passWord;}}注意路径中的参数需要用花括号包裹PathVariable中传入参数也可以实现重命名注意参数名的一一对应(不可少参数) 结果显示 2。3。7文件上传 使用RequestPart注解上传图片代码展示RestControllerRequestMapping(index)publicclassUserController{RequestMapping(upLoad)publicStringupLoadFile(StringuserName,RequestPart(picture)MultipartFilefile)throwsIOException{获取文件后缀Stringsuffixfile。getOriginalFilename()。substring(file。getOriginalFilename()。lastIndexOf(。));文件路径StringfilePathSystem。getProperty(user。dir)srcmainresourcespictureUUID。randomUUID()。toString();拼接路径StringfinallyPathfilePathsuffix;file。transferTo(newFile(finallyPath));returnuserName上传了一张图片;}}注意RequestPart注解里对应的是上传图片的参数名通过file。getOriginalFilename()方法获取图片的完整名,然后通过查找最后一个。,来截取出后缀名System。getProperty(user。dir)为获取当前工程目录拼接完路径后,file。transferTo(newFile(finallyPath)),创建文件实例并保存为了生成独一无二的文件名,这里使用了UUID结果显示 2。3。8获取CookieSessionheader获取Cookie 通过CookieValue注解RequestMapping(getCookie)publicStringgetCookie(CookieValue(newCookie)Stringvalue){returncookie:value;} 最一开始访问该方法时结果为404,因为此时没有key为newCookie这样的Cookie 通过浏览器端模拟该Cookie后,就可以获取到Cookie的值 获取Header 通过RequestHeader注解RequestMapping(getHeader)publicStringgetHeader(RequestHeader(UserAgent)Stringcontent){returnUserAgent:content;} 获取Session 通过SessionAttribute注解 按照以前的方法来创建SessionRequestMapping(setSession)publicStringsetSession(HttpServletRequestreq){HttpSessionsessionreq。getSession(true);if(session!null){session。setAttribute(userName,SpringMVC);}returnsession设置完成;} 获取Session对象中的key为userName的值RequestMapping(getSession)publicStringgetSession(SessionAttribute(valueuserName,requiredfalse)StringuserName){returnuserName:userName;} 2。4如何返回参数2。4。1返回静态页面 默认请求下,SpringBoot返回的是静态页面代码展示ControllerRequestMapping(index)publicclassUserController{RequestMapping(getView)publicStringgetView(){returnindex。html;}} index。html中主要内容为h1stylecolor:red;HelloSpringMVCh1 2。4。2返回texthtml 在之前的各种例子中都是返回texthtml类型,当方法返回值为String时,并且有加上ResponseBody注解,返回的就是texthtml类型实例:计算机加法实现前端代码展示!DOCTYPEhtmlhtmllangenheadmetacharsetUTF8metahttpequivXUACompatiblecontentIEedgemetanameviewportcontentwidthdevicewidth,initialscale1。0title计算机titleheadbody数字1:inputtypetextidone数字2:inputtypetextidtwoinputtypebuttonvalue提交onclicksubmit()bodyhtml后端代码展示RestControllerpublicclassCalcController{RequestMapping(calc)publicStringcalc(Integerone,Integertwo){if(onenulltwonull)return不可为空;returnString。format(d加上d等于d,one,two,onetwo);}}结果显示 2。4。3返回JSON 通过HashMap返回数据或者返回一个对象,返回的数据类型就是JSON代码展示(Map)RestControllerRequestMapping(index)publicclassUserController{RequestMapping(getUserByJson)publicHashMapString,StringgetUserByJson(StringuserName,StringpassWord){HashMapString,StringmapnewHashMap();map。put(userName,userName);map。put(passWord,passWord);returnmap;}}结果显示(Map) 代码展示(对象)RestControllerRequestMapping(index)publicclassUserController{RequestMapping(getUserByJson1)publicUsergetUserByJson1(StringuserName,StringpassWord){UserusernewUser();user。setUserName(userName);user。setPassWord(passWord);returnuser;}}结果显示(对象) 实例:实现登录操作 要求:用户提交数据为json类型,返回结果为json类型指定用户名为Json,用户密码为123为登录成功前端代码展示!DOCTYPEhtmlhtmllangenheadmetacharsetUTF8metahttpequivXUACompatiblecontentIEedgemetanameviewportcontentwidthdevicewidth,initialscale1。0title用户登录titleheadbodyh1stylepaddingleft:120px;登录h1用户姓名:inputtypetextiduserNamep用户密码:inputtypepasswordidpassWordpinputtypebuttonvalue提交onclickmysubmit()styleheight:30px;width:80px;bodyhtml后端代码展示RestControllerpublicclassLoginController{RequestMapping(login)publicHashMapString,Objectlogin(RequestBodyUseruser){HashMapString,ObjectmapnewHashMap();Stringmessage;用户名和密码判断,不得为null或if(StringUtils。hasLength(user。getUserName())StringUtils。hasLength(user。getPassWord())){if(user。getUserName()。equals(Json)user。getPassWord()。equals(123)){message;}else{message用户名或者密码有误,登录失败;}}else{message请将信息填写完整;}map。put(succ,200);map。put(message,message);returnmap;}}结果展示 2。4。4请求转发请求重定向forward(请求转发)服务器进行转发;请求转发地址不会发生变化;请求转发由于是服务器转发的原来的外部资源可能访问不到redirect(请求重定向)请求重新定位到资源;请求的地址发生变化;请求重定向和直接访问新地址效果是一样的,原来的外部资源可以顺利访问到代码展示前端代码展示!DOCTYPEhtmlhtmllangenheadmetacharsetUTF8metahttpequivXUACompatiblecontentIEedgemetanameviewportcontentwidthdevicewidth,initialscale1。0titleDocumenttitlelinkrelstylesheethrefcsslogin。cssheadbodyh1HelloSpringMVCh1bodyhtmlCSS代码展示h1{color:red;}后端代码展示ControllerpublicclassUserController{请求转发RequestMapping(forward)publicStringforward(){returnforward:index。html;}请求重定向RequestMapping(redirect)publicStringredirect(){returnredirect:index。html;}}结果显示 可以看出转发的URL是不变的,重定向的URL是会变的 如果在类上也添加路由映射会发现请求转发获取不到资源了后端代码展示ControllerRequestMapping(index)publicclassUserController{请求转发RequestMapping(forward)publicStringforward(){returnforward:index。html;}请求重定向RequestMapping(redirect)publicStringredirect(){returnredirect:index。html;}}结果展示 此时转发的页面路径多了index,和资源没有在同一级目录下,导致资源获取的失败 原文https:blog。csdn。netweixin46103589articledetails125430579