SpringMVC中@RequestMapping注解的使⽤与请求处理⽅法的参数
这⾥写⽬录标题
⼗、@RequestMapping注解的使⽤
1、主要作⽤,把请求的URL映射到⼀个处理器的⽅法上,RequestMappingHandleMapping处理器映射器针对该注解来完成URL到处理器⽅法的映射,它返回的是⽅法对象,因此对应的处理器适配器就知道去执⾏哪个⽅法。
2、在⽅法上使⽤该注解,处理器适配器不需要按照某种接⼝类型去执⾏接⼝的⽅法,因此使⽤该注解给编程带来了灵活性。
3、该注解的主要属性取值:
(1)value:映射URL,不需要带上主机名,接⼝和项⽬名,它是从项⽬名(/)开始表⽰的。
(2)method:表⽰请求的⽅式(get,post,put,delete),它的取值决定了当前⽅法只能处理什么⽅式的请求。默认是get请求。
(3)produces:规定了请求头中所指定的内容类型,content-type的值。如果通过ajax发送Json格式的请求,该属性可能会⽤到。
(4)params :规定请求中必须有指定的参数。
4、该注解可以⽤在控制器类上。如果⼀个控制器中有多个处理⽅法,这些⽅法可以规定⼀个统⼀的URL的前缀,那么可以使⽤该注解把前缀在类上进⾏指定。这是⼀种经常性的⽤法。
//所有的控制器都需要spring容器管理(但是它属于⼦容器(还会有顶层的spring容器作为⽗容器),因为是在springmvc的配置⽂件中进⾏扫描的)
@Controller
@RequestMapping("/Before")
public class MyController {
@RequestMapping(value ="/hello",method = RequestMethod.POST)
public ModelAndView hello(){
ModelAndView mv =new ModelAndView();
//指定实⽤的视图的逻辑名称和需要渲染的数据
mv.setViewName("/hello.jsp");//⽬前,还未⼿动设置视图解析器,告诉它⽂件去哪,会默认从根⽬录寻。
mv.addObject("hello","hello springmvc");
return mv;
}
}
设置了视图解析器的 返回格式:
@RequestMapping(value ="/hello1",method = RequestMethod.POST)
public String hello1(ModelMap map){
map.addAttribute("hello","hello map");
return"hello";
}
springmvc 对应的容器(⼦容器)中,添加此配置:
<bean id="viewResolver"class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/"></property>
<property name="suffix" value=".jsp"></property>
</bean>
⼗⼀、请求处理⽅法的参数
1、可以使⽤springmvc内定的⼀些参数类型,如果需要使⽤⼀些内定的类型,可以把该类型作为⼊参来使⽤。只要指定了规定可使⽤的类型,框架就会把相应的参数传递到⽅法中。⽐如 请求,响应,会话,Model等。
2、按照实际的请求参数(可有多个),可以在⽅法中定义对应的参数类型。如果需要接收表单的请求或get请求中带有请求参数的情况,也包括ajax中包括请求参数的情况。
(1)各个参数都是单⼀值。
默认参数名称⼀致时,即可完成参数的类型转换与赋值。如果请求的参数名与⽅法的参数名不⼀致,控制器接收不到参数,此时需要给⽅法参数添加@RequestParam注解,以指定请求参数的名称与⽅法属性的映射。@RequestParam(value = "name1",required =true),required表⽰该参数是否必须有–true是默认值。如果参数很多,⽅法参数就很多,不⽅便。也不太符合类型⾃动转换和⾯向对象取值的⼀种思想。
@RequestMapping(value ="/hello2",method = RequestMethod.GET)
public String hello2(ModelMap map,@RequestParam(value ="name1",required =false)String name){
System.out.println(name);
map.addAttribute("hello",name);
return"hello";
}
(2)请求参数对应POJO中的属性。这是项⽬中常⽤的⽅式。⽐较⽅便。
以上两种情况,参数的类型可以⾃动转换,请求参数的类型都是字符串,如果⽅法参数的类型是其它类型,springmvc的内部提供了转换器,会⾃动进⾏类型转换,这也⽅便了程序的编写。所有转换器都实现Convert接⼝。也要⾃定义项⽬中需要使⽤的特殊类型的转换器。
@RequestMapping(value ="/hello3",method = RequestMethod.GET)
//需要user被赋值的字段的get与set⽅法,同时,此时不能使⽤@RequestParam注解
public String hello3(ModelMap map, User user){
// Class<? extends User> userClass = Class();
// Field name = null;
//
// try {
// name = DeclaredField("name");
//
// name.setAccessible(true); //flag设置为true表⽰忽略Java的访问检查机制,以允许读写⾮public字段
// String koma="koma";
// name.set(user,koma);
// } catch (IllegalAccessException | NoSuchFieldException e ) {
// e.printStackTrace();
// }
System.out.println(user);
map.addAttribute("hello",user);
return"hello";
}
(3)restful请求的URL中所带有的参数。
restful的请求有两个主要特点:
第⼀,请求的参数不使⽤?,⽽作为URL中的⼀个部分
第⼆,请求的⽅法不仅是get和post,还包括其它的⽅法,⽽⽤表单提交请求⽅法只能是get或post不能是其它的。
localhost:8080/Before/hello4/koma/998
@RequestMapping(value ="/hello4/{name}/{value}",method = RequestMethod.PUT)
public String hello4(ModelMap map,@PathVariable(name ="name") String name,@PathVariable(name ="value") Integer value){
System.out.println(name+" "+value);
map.addAttribute("hello",name);
return"hello";
}
(4)通过AJAX发出的请求,如果请求参数是⼀个json数据,如何接收。
注意⼀:@RequestBody表⽰参数值是通过请求正⽂或请求体传来的。
注意⼆:请求⽅式不能是Get,Get的请求正⽂中没有相关信息。
注意三:produces = MediaType.APPLICATION_JSON_UTF8_VALUE 表⽰ajax的请求头必须指定为 application/json
@RequestMapping(value ="/hello5",method = RequestMethod.POST,produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
@ResponseBody
public Object hello5(ModelMap map,@RequestBody User user){
System.out.println(user);
map.addAttribute("hello",user);
return"hello";
}
(5)使⽤springmvc实现⽂件上传
1、引⽤依赖,引⽤Apache的commons-fileupload,commons-io
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>1.4</version>
</dependency>
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId> //fileupload包是依赖io包的,所以只导⼊ fileupload包即可。
<version>1.4</version>
</dependency>
假如缺少JavaEE的依赖,需要导⼊,:
provided 依赖只有在当JDK 或者⼀个容器已提供该依赖之后才使⽤。⽐如说,我们开发了⼀个web 应⽤,在编译
classpath 中需要可⽤的Servlet API 来编译⼀个servlet,但是我们并不需要打包好的WAR 中包含这个Servlet API,因为这个Servlet API JAR 可以由我们的应⽤服务器或者servlet 容器提供。provided提供范围的依赖在编译classpath的
时候是可⽤的,这种依赖不是传递性的,当然也不会被打包到war当中
<dependency>
<groupId>javax</groupId>
<artifactId>javaee-api</artifactId>
<version>7.0</version>
<!--只在编译或测试的时候使⽤-->
<scope>provided</scope>
springmvc的注解有哪些</dependency>
2、把springmvc的⽂件上传解析器在容器中进⾏注册,并指定相应的属性。强调Bean的ID必须为multipartResolver。
在springmvc对应的容器中,进⾏添加:
<bean id="multipartResolver"class="org.springframework.web.multipartmons.CommonsMultipartResolver">
<property name="defaultEncoding"value="utf-8"></property> //默认编码
<property name="maxUploadSize"value="999999"></property> //上传⽂件的⼤⼩最⼤值
</bean>
3、在请求处理⽅法的参数中,必须添加MultipartFile类型的参数⽤来接收上传⽂件。如果表单中有其它的普通字段也可以添加相应的参数。为了能够得到ServletContext对象,参数需要添加HttpServletRequest 参数。
4、在项⽬中添加上传⽂件的⽬录
5、利⽤MultipartFile 对象把上传的⽂件保存到服务器上。
JSP 测试页⾯:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<form method="post"action="/Before/hello6"enctype="multipart/form-data">
<input type="file"name="file"><br>
<button type="submit">提交</button>
</form>
</body>
</html>
@RequestMapping(value ="/hello6",method = RequestMethod.POST)
public String hello6(MultipartFile file, HttpServletRequest request, ModelMap map){ String ServletContext().getRealPath("/WEB-INF/upload");
String OriginalFilename();
try{
}catch(IOException e){
e.printStackTrace();
}
map.addAttribute("hello","图⽚名字"+fileName);
return"hello";
}
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论