专业网站建设是哪家便宜,网站后台更新了文章为何看不见,资阳住房和城乡建设厅官方网站,大方做网站一.SpringMVC常用注解
1.1.RequestMapping
RequestMapping注解是一个用来处理请求地址映射的注解#xff0c;可用于映射一个请求或一个方法#xff0c;可以用在类或方法上。 标注在方法上运行代码
用于方法上#xff0c;表示在类的父路径下追加方法上注解中的地址将会访…一.SpringMVC常用注解
1.1.RequestMapping
RequestMapping注解是一个用来处理请求地址映射的注解可用于映射一个请求或一个方法可以用在类或方法上。 标注在方法上运行代码
用于方法上表示在类的父路径下追加方法上注解中的地址将会访问到该方法
Controller
public class HelloController {
RequestMapping(/requestTest)public String requestTest(){return success;}
}
此时请求映射所映射的请求的请求路径为
http://localhost:8080/springmvc01/requestTest springmvc01表示项目名 标注在类和方法上
用于类上表示类中的所有响应请求的方法都是以该地址作为父路径。 注意当你在类上添加RequestMapping注解后如果要请求映射就意味着请求要先映射到标注类的位置然后再映射到该类的方法上 Controller
RequestMapping(/hello)
public class HelloController {
RequestMapping(/requestTest)public String requestTest(){return success;}
}
此时请求映射所映射的请求的请求路径为
http://localhost:8080/springmvc01/hello/requestTest springmvc01表示项目名 参数列表
参数说明valueRequestMapping 的 value 属性必须设值 RequestMapping 的 value 属性是通过当前请求的请求地址来匹配请求 从源码中可以看到value属性是一个字符串类型的数组因此说明可以将多个请求映射到一个方法上只需要给 value 来指定一个包含多个路径的数组。methodRequestMapping的method属性是通过当前请求的请求方式来匹配请求 浏览器向服务器发送请求请求方式有很多GET、HEAD、POST、PUT、PATCH、DELETE、OPTIONS、TRACE。可以使用 method 属性来约束请求方式。headersRequestMapping的headers属性是通过当前请求的请求头信息来匹配请求 RequestMapping的headers属性是一个字符串类型的数组可以通过下面四种表达是来设置匹配关系 例如 “header”要求请求映射的请求必须为包含 header的请求头信息 “!header”要求请求映射的请求必须为不包含 header的请求头信息 “headervalue”要求请求映射的请求必须为包含 header的请求头信息并且header的值必须为value “header!value”要求请求映射的请求必须为包含 header的请求头信息并且header的值必须不是valueparamsRequestMapping的params属性是通过当前请求的请求参数来匹配请求 RequestMapping的params属性是一个字符串类型的数组可以通过下面四种表达是来设置匹配关系 例如 “param”要求请求映射的请求必须为包含 param的请求参数 “!param”要求请求映射的请求是不能包含param的请求参数 “paramvalue”要求请求映射的请求必须包含 param 的请求参数且 param 参数的值必须为 value “param!value” 要求请求映射的请求是必须包含 param 的请求参数其值不能为 value。
示例一RequestMapping的params属性
RequestMapping(value /test,params username)
public String test(){return success;
} 注意我们设置了params属性就意味着该请求映射的请求必须包含username才能够请求成功。 示例二RequestMapping的headers属性
RequestMapping(value /test,headers Host localhost:8081)
public String test(){return success;
} 注意如果当前请求不满足headers属性此时页面就会显示404错误即资源未找到。 扩展 GetMapping处理get方式请求的映射 PostMapping处理post方式请求的映射 PutMapping处理put方式请求的映射 DeleteMapping处理delete方式请求的映射 GetMapping就相当于RequestMapping(methodRequestMethod.GET),它会将get映射到特定的方法上。 1.2.RequestParam
RequestParam主要用于将请求参数区域的数据映射到控制层方法的参数上
参数说明value请求中传入参数的名称如果不设置后台接口的value值则会默认为该变量名。required该参数是否为必传项。默认是true表示请求中一定要传入对应的参数否则会报404错误如果设置为false时当请求中没有此参数将会默认为null,而对于基本数据类型的变量则必须有值这时会抛出空指针异常。如果允许空值则接口中变量需要使用包装类来声明。defaultValue参数的默认值如果请求中没有同名的参数时该变量默认为此值。注意默认值可以使用SpEL表达式如#{systemProperties[‘java.vm.version’]}
示例
RequestMapping(/queryBooks)
public ListBook queryBooks(RequestParam(required false,defaultValue 0,valuepage) int page,RequestParam(required false,defaultValue 10,value rows) int rows){return bookService.queryBooks(page,rows);
}
1.3.ModelAttribute
ModelAttribute一个具有如下三个作用 绑定请求参数到命令对象放在功能处理方法的入参上时用于将多个请求参数绑定到一个命令对象从而简化绑定流程而且自动暴露为模型数据用于视图页面展示时使用 暴露表单引用对象为模型数据放在处理器的一般方法非功能处理方法上时是为表单准备要展示的表单引用对象如注册时需要选择的所在城市等而且在执行功能处理方法RequestMapping注解的方法之前自动添加到模型对象中用于视图页面展示时使用 暴露RequestMapping方法返回值为模型数据放在功能处理方法的返回值上时是暴露功能处理方法的返回值为模型数据用于视图页面展示时使用。
示例一绑定请求参数到命令对象
如用户登录我们需要捕获用户登录的请求参数用户名、密码并封装为用户对象此时我们可以使用ModelAttribute绑定多个请求参数到我们的命令对象。
public String test1(ModelAttribute(user) UserModel user)
它的作用是将该绑定的命令对象以“user”为名称添加到模型对象中供视图页面展示使用。我们此时可以在视图页面使用${user.username}来获取绑定的命令对象的属性。 示例二暴露表单引用对象为模型数据
ModelAttribute
public void init(Model model){model.addAttribute(book,new Book());
}
如上代码会在执行功能处理方法之前执行并将其自动添加到模型对象中。
RequestMapping(/toBookList)
public String toBookList(){System.out.println(toBookList);return book/bookList;
}
示例三暴露RequestMapping方法返回值为模型数据
ModelAttribute注解的返回值会覆盖RequestMapping注解方法中的ModelAttribute注解的同名命令对象。
public ModelAttribute(user2) UserModel test3(ModelAttribute(user2) UserModel user)
1.4.SessionAttributes
在默认情况下当ModelMap中的属性作用域是request级别时也就是说当本次请求结束后ModelMap中的属性将销毁。如果希望在多个请求中共享ModelMap中的属性必须将其属性转存到session中这样ModelMap的属性才会被跨请求访问
spring允许我们有选择地指定ModelMap中的哪些属性需要转存到session中以便下一个请求属对应的ModelMap的属性列表中还能访问到这些属性。
SpringMVC为我们提供这样一个注解来实现上面的场景SessionAttributes将ModelMap的属性值共享到session中。 注意SessionAttributes注解只能使用在类上用于在多个请求之间传递参数类似于Session的Attribute但不完全一样一般来说SessionAttributes设置的参数只用于暂时的传递存入sessionAttributeStore而不是长期的保存长期保存的数据还是要放到Session中。 有两种方式将ModelMap中的属性值共享到session中
1.使用注解的value属性可以通过属性名指定需要放到会话中的属性
Controller
SessionAttributes(user) //将ModelMap中key为user的属性共享到session中
public class DemoController {RequestMapping(/hello) public String hello(ModelMap model) {//向ModelMap中添加key为user和user1的属性model.addAttribute(user, new User(520, U love me));model.addAttribute(user1, new User(I love U));return result;}
}
2.使用注解的types属性还可以通过模型属性的对象类型指定哪些模型属性需要放到会话中。
SessionAttributes(types {User.class})
Controller
public class DemoController{RequestMapping(/hello)public String hello(MapString, Object map){map.put(user1, new User(520, U love me));return hello;}
} 1.5.RequestBody
RequestBody主要用来接收前端传递给后端的json字符串中的数据的(即请求体中的数据的)
GET方式无请求体所以使用RequestBody接收数据时前端不能使用GET方式提交数据而是用POST方式进行提交。在后端的同一个接收方法里RequestBody与RequestParam()可以同时使用RequestBody最多只能有一个而RequestParam()可以有多个。
简言之 一个请求只有一个RequestBody 一个请求可以有多个RequestParam。 Content-type 1application/x-www-form-urlencodedRequestBody不是必须加的 2mutipart/form-dataRequestBody不能处理这种格式 3其他格式比如application/json,application/xml等必须使用RequestBody来处理 RequestMapping(/hello)
public String toHello1(RequestBody Book book){log.info( 使用RequestBody传递JSON格式的参数{}, JSON.toJSONString(book));return index;
} RequestBody注解对应的类在将HTTP的输入流(含请求体)装配到目标类(即:RequestBody后面的类)时会根据json字符串中的key来匹配对应实体类的属性如果匹配一致且json中的该key对应的值符合(或可转换为)实体类的对应属性的类型要求时会调用实体类的setter方法将值赋给该属性。 1.6.RequestHeader
使用 RequestHeader 注解可以获取指定的请求头信息。如果想要获取所有的请求头信息,可以使用 MapString,String、MultiValueMapString,String、HttpHeaders 这三个 Map 中的任何一个封装所有请求头的 name 和 value。
参数列表
参数说明namename 和 value 互为别名,当只有一个参数时可以省略 value,直接(xxx) 就可以了valuename 和 value 互为别名,当只有一个参数时可以省略 value,直接(xxx) 就可以了required默认情况下,如果请求头中缺少了指定的 name那么将会报错。 如果没有添加required false当请求头中没有这个zking请求头时就会报错。defaultValue如果请求头中缺少了指定的 name ,那么会报错,可以使用 defaultValue 这个属性指定默认值,就可以避免报错 如果请求头缺少指定 name ,该属性设置的值将会作为默认值,如果该属性不设置值,它有自己的默认值 DEFAULT_NONE
示例
GetMapping(/headParams)
public Map userInfo(RequestHeader(value zking,defaultValue hello zking) String username,// 将请求头中 nameAccept-Encoding 赋值给形参 encodingRequestHeader(Accept-Encoding) String encoding,// 将请求头中 nameHost 赋值给形参 hostRequestHeader(Host) String host,// 将所有请求头的 name 和 value 封装到 Map 集合 headsMap 中RequestHeader MapString,String headsMap) {Map map new HashMapString, Object();map.put(username,username);map.put(Accept-Encoding,encoding);map.put(Host,host);map.put(headsMap,headsMap);
return map;
}
由于请求头中不存在 namezking 这个信息,所以如果只用 valuezking 会抛出异常。
解决方案: 1、required 的默认值为 true ,也就是请求头中没有 namezking 会报错,将其值改为 false,即没有该头信息也不报错
RequestHeader(value zking,required false) String username
2、不修改 requiredtrue 这个默认值,当头信息中不包含 namezking ,给它一个默认值 hello zking
RequestHeader(value zking,defaultValue hello zking) String username 1.7.PathVariable
该注解请求URI中的模板变量部分到处理器功能处理方法的方法参数上的绑定。
即当使用RequestMapping URI template 样式映射时 即 someUrl/{paramId} 这时的paramId可通过 Pathvariable注解绑定它传过来的值到方法的参数上。
//PathVariable可以用来映射URL中的占位符到目标方法的参数中
RequestMapping(/testPathVariable/{id})
public String testPathVariable(PathVariable(id) Integer id)
{System.out.println(testPathVariable:id);return SUCCESS;
}
Rest
即 Representational State Transfer。资源表现层状态转化。是目前最流行的一种互联网软件架构。它结构清晰、符合标准、易于理解、扩展方便所以正得到越来越多网站的采用。 资源Resources网络上的一个实体或者说是网络上的一个具体信息。它可以是一段文本、一张图片、一首歌曲、一种服务总之就是一个具体的存在。可以用一个URI统一资源定位符指向它每种资源对应一个特定的 URI 。要获取这个资源访问它的URI就可以因此 URI 即为每一个资源的独一无二的识别符。 表现层Representation把资源具体呈现出来的形式叫做它的表现层Representation。比如文本可以用 txt 格式表现也可以用 HTML 格式、XML 格式、JSON 格式表现甚至可以采用二进制格式。 状态转化State Transfer每发出一个请求就代表了客户端和服务器的一次交互过程。HTTP协议是一个无状态协议即所有的状态都保存在服务器端。因此如果客户端想要操作服务器必须通过某种手段让服务器端发生“状态转化”State Transfer。而这种转化是建立在表现层之上的所以就是 “表现层状态转化”。具体说就是 HTTP 协议里面四个表示操作方式的动词GET、POST、PUT、DELETE。它们分别对应四种基本操作GET 用来获取资源POST 用来新建资源PUT 用来更新资源DELETE 用来删除资源。
示例
- /order/1 HTTP GET 得到 id 1 的 order
- /order/1 HTTP DELETE 删除 id 1 的 order
- /order/1 HTTP PUT 更新 id 1 的 order
- /order HTTP POST 新增 order 1.8.CookieValue
CookieValue注解主要是将请求的Cookie数据映射到功能处理方法的参数上。
参数列表
参数说明value绑定的参数名称String类型。required是否必须包含valueboolean类型默认为 true表示请求参数中必须包含对应的参数若不存在将抛出异常。defaultValue默认值String类型。当没有传参时将使用此值赋值。
示例
RequestMapping(/testCookieValue)
public MapString, Object testCookieValue(CookieValue(JSESSIONID) String cookie) {response.put(cookie, cookie);return response;
}
二.SpingMVC的参数传递
1.简单类型参数
package com.YU.web;import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;/*** author YU* create 2023-09-05 15:14*/
Slf4j
Controller
RequestMapping(/param)
public class ParamController {RequestMapping(/hello1)public String index(String bname,Integer bid) {log.info(简单类型参数bname:{},bid:{},bname,bid);return index;}
}这里我们通过在地址栏输入携带的参数进行访问通过日志信息查看是否将参数传递到前端页面 日志信息 由日志信息可得知我们的简单类型参数通过前端地址栏可以进行传输到后台 2. 复杂类型参数 RequestMapping(/hello2)public String index2(Book book, HttpServletRequest request) {//原生Servlet获取参数log.info(复杂类型参数bname:{},bid:{},request.getParameter(bname),request.getParameter(bid));//复杂传参log.info(复杂类型参数book:{},book.toString());return index;}
这里我们通过复杂传参对比原生Servlet传参
访问地址栏带参数 日志信息 由此我们可以得出传参时可以将对象直接进行传递通过对象获取对应属性 3. requestParam传参
RequestMapping(/hello3)public String index3(RequestParam String bname,RequestParam(required false) Integer bid) {//requestParam参数log.info(requestParam参数:bname:{},bid:{},bname,bid);return index;}
我们将字段bname加上RequestParam注解这样当我们在访问时必须携带bname参数 RequestParam传参可以对参数进行限制必须携带或者可以不携带 4.PathVariable路径传参
RequestMapping(/hello4/{bid})public String index4(PathVariable(bid) Integer bid) {//PathVariablelog.info(PathVariable: bid:{},bid);return index;}
我们可以通过在地址栏的路径中进行传参而不是用变量去携带某一个参数 日志信息 5.RequestBody传参
RequestMapping(/hello5)public String index5(Map map) {//PathVariablelog.info(RequestBody: map:{},map);return index;}RequestMapping(/hello6)public String index6(RequestBody Map map) {//PathVariablelog.info(RequestBody: map:{},map);return index;} 这里我们列出两种情况进行对比第一个是没有RequestBody注解的第二个有RequestBody注解
1.这里我们使用Eolink进行发送请求首先是对hello6进行发送请求(有RequestBody注解) 日志信息结果 2.然后对hello5无RequestBody注解 日志信息结果 结论 当我们需要去传递json格式数据时需要用到RequestBody注解进行传递否则请求时响应不到结果 6.RequestHeader传参
RequestHeader是对请求头进行传参获取响应数据
RequestMapping(value /hello7)public String index7(RequestHeader(jwt) String jwt) {//PathVariablelog.info(RequestHeader: jwt:{},jwt);return index;}
我们在对该路径进行传参响应的时候设置请求头信息 日志信息 7.总结集成所有常用类型传参
RequestMapping(value /hello8)public String index8(Book book,RequestBody Map map,RequestHeader(jwt) String jwt) {//PathVariablelog.info(RequestHeader: jwt:{},jwt);return index;}
请求体中的json数据(Map) Query参数(对象Book) 请求头参数 最终日志信息结果 结论 常用的传参方式可以一起使用包括请求头传参复杂传参RequestHeader传参 三.RequestMapping
由上述案例可得知我们在演示时用的都是RequestMapping但是在实际开发中RequestMapping并不常用而且安全系数低在我们向浏览器发送请求时如果该方法体用的RequestMapping注解我们可以使用任意的请求方式进行访问当遇到需要添加数据的情况时一些不法分子发现这些漏洞时会使用循环get请求不断向服务器发送请求添加数据造成服务器压力崩溃所以在实际开发中我们尽量使用标明好的请求方式注解如GetMapping、POSTMapping等等.... RequestMappingGetMappingPOSTMappingPutMappingDeleteMapping 四.返回值
1.返回JSON1
RequestMapping(/hello1)public void hello1(HttpServletResponse response){MapObject, Object map new HashMap();map.put(code,200);map.put(msg,成功添加);try {ResponseUtil.writeJson(response,map);} catch (Exception e) {e.printStackTrace();}}
运行结果 2. Map 返回JSON2
ResponseBodyRequestMapping(/hello2)public Map hello2(HttpServletResponse response){MapObject, Object map new HashMap();map.put(code,200);map.put(msg,成功添加);return map;}
运行结果 3.String
RequestMapping(/hello3)public String hello3(){return index;}
运行结果 4. Stringmodel RequestMapping(/hello4)public String hello4(Model model, HttpServletRequest request){model.addAttribute(currentName,死仔);request.setAttribute(location,网左网右);return index;}
运行结果 5.ModelAndView
RequestMapping(/hello5)public ModelAndView hello5(){ModelAndView mv new ModelAndView();mv.addObject(sign,真的呆);mv.setViewName(index);return mv;} 运行结果 五.页面跳转
1.场景一转发到后台的方法中(当前类)
RequestMapping(/hello6)public String hello6(){return forward:hello2;} 2.场景二转发到后台的方法中(其他类)
// 场景二转发到后台的方法中(其他类)RequestMapping(/hello7)public String hello7(){return forward:/param/hello1;}
3.场景三重定向到后台的方法中(当前类)
RequestMapping(/hello8)public String hello8(){return redirect:hello2;}
4.场景四重定向到后台的方法中(其他类)
RequestMapping(/hello9)public String hello9(){return redirect:/param/hello1;}
结论 返回值中有forward、redirect会绕过视图解析器 当我们使用方法体中forward转发时不管哪种场景地址栏都不会发生变化 反之重定向时地址栏都会变成当前方法体指向的方法名 六.SpringMVC总结优点与缺点 优点 简化配置注解可以替代繁琐的XML配置使配置更加简洁和直观。注解使用注解处理器进行解析可以自动完成配置和初始化的工作减少了手动配置的工作量。 提高可读性通过使用注解开发人员可以更清晰地了解代码的作用和意图。注解的语义明确可以提高代码的可读性和可维护性。 提高开发效率注解简化了很多重复性的工作如依赖注入、请求映射等。开发人员可以专注于核心业务逻辑而不必关注繁琐的配置细节从而提高开发效率。 提供丰富的功能扩展Spring框架提供了多种注解可以应用于不同的场景和功能需求如控制器的请求映射、数据验证、事务管理等。这些注解提供了灵活的扩展机制使得开发人员可以根据具体需求进行定制化的开发。 支持AOPSpring框架通过注解提供了对面向切面编程AOP的支持。使用注解修饰目标方法或类可以方便地定义切点、切面和通知提供横切关注点的解耦和重用能力。 缺点 隐式依赖注解的使用可能导致隐式依赖不像显式配置那样清晰可见。有时候可能会造成代码的可读性和维护性下降特别是在大型项目中。 学习成本使用注解需要对注解的语法和规范有一定的了解和掌握。不熟悉注解的开发人员可能需要花费一些时间学习和适应。 自定义性受限某些注解的功能和行为是固定的如果需要自定义一些特定的逻辑可能需要编写额外的代码或使用其他方式实现。 过度使用过度使用注解可能导致代码变得难以理解和维护。在使用注解时应该遵循适度使用的原则确保注解的使用符合代码的整体设计思路和架构。