1. @RequestMapping()
- 基本使用
通过注解的方式实现路径到处理器方法的映射
可以使用的类和方法上。用在方法上表示该方法变为一个处理器,且和指定路径做映射;又在类上表示配置的路径作为这个类中所以处理器的父路径使用。
@Controller
@RequestMapping("")
public class UserController {
@RequestMapping("/regist.form")
public void registUser(){
System.out.println("user regist...");
}
}
- 注解属性
1)value: 指定请求路径
2)method: 指定当前处理器那种提交方式的请求
3)params: 用来限定请求中必须包含指定请求参数才能被当前处理器处理
4)headers: 用来限定请求中必须包含指定名称的请求头才会被当前处理器处理
- 处理器方法支持的参数和返回类型
支持的方法参数类型:
HttpServletRequest:代表当前请求的对象
HttpServletResPonse:代表当前响应的对象
HttpSession:代表当前的对话
WebRequest:SpringMVC提供对象,相当于Resquest和Session的合体,可以操作这两个阈中的属性
InputStream、OutputStream、Reader、Writer:代表Request中获取的输入流和Response中的输出流
通过
@PathVariable
、@RequestParam
声明的方法参数——
@PathVariable
:可以将请求路径的指定部分获取赋值给指定方法参数——
@RequestParam
:将指定请求参数赋值给指定方法参数,如果不写此注解,则会默认将同名的请求参数赋值给方法参数通过
@CookieValue
和@RequestHeader
声明方法参数——
@CookieValue
:——
@RequestHeader
:
支持的返回值类型:
- ModelAndView: 返回封装了模型和视图的ModelAndView对象
/** * 返回一个封装了模型和视图的ModelAndView对象 * @return */ @RequestMapping("/test01.form") public ModelAndView test01(){ ModelAndView mav=new ModelAndView(); mav.addObject("attr1","val1"); mav.addObject("attr2","val2"); mav.setViewName("test01"); return mav; }
- String对象: 返回一个String对象,相当于返回视图的名称(mav.jsp)
/** * 返回一个String对象,相当于返回视图的名称(mav.jsp) * @return */ @RequestMapping("/test02.form") public String test02(Model model){ model.addAttribute("attr1","val1"); model.addAttribute("attr2","val2"); return "test01"; }
- void: 返回一个void,自动采用当前处理器的路径名作为视图名返回
/** * 返回一个void,自动采用当前处理器的路径名作为视图名返回 * @return */ @RequestMapping("/test03.form") public void test03(Model model){ model.addAttribute("attr1","val1"); model.addAttribute("attr2","val2"); }
- 方法被@ResponseBody修饰:默认将返回的对象转化为json写入输出
- 除了以上返回之外返回的内容都会被当作模型中的数据,返回的视图名称等同于当前处理器的路径名
2. 请求参数的获取
- 直接获取
//直接获取,SpringMVC自动将对应名称的参数传入,并自动进行类型转换
@RequestMapping("/pt02.form")
public void test02(String name,int age){
System.out.println(name+"#"+age);
}
另外,如果请求参数名称与对应参数名称不一致,可以通过@RequestParam(“name”)来指定对应关系
@RequestMapping("/pt03.form")
public void test03(@RequestParam("name") String username, int age){
System.out.println(username+"#"+age);
}
- 请求的对象获取
//请求的对象获取
@RequestMapping("/pt04.form")
public void test04(HttpServletRequest request, HttpServletResponse response){
String name=request.getParameter("name");
int age=Integer.parseInt(request.getParameter("age"));
System.out.println(name+"#"+age);
}
注意:
请求参数的乱码解决?
- 传统方法:
修改服务器默认请求参数的编码,保证其和提交的编码一致
通过手动编解码来解决乱码问题
通过request.通知web容器对这次请求用那个解码。此方法调用之前没有获取参数,否则无法解决乱码
request.setCharacterEncoding("utf-8");
此方法只对post有效,对get提交无效。此方法的本质时设置容器以何种编码处理请求。但get提交的参数在地址之后,所以此方法无效,需要手动编解码解决。
name=new String(name.getBytes("iso8859-1"),"utf-8");
- SpringMVC解决方法:提供全站乱码过滤器来解决
<filter> <filter-name>characterEncodingFilter</filter-name> <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> <init-param> <param-name>encoding</param-name> <param-value>utf-8</param-value> </init-param> </filter> <filter-mapping> <filter-name>characterEncodingFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
这种方法只能解决POST提交的乱码有效,对于get无效,此时需要手动编解码来解决。
3. 日期数据处理
在SpringMVC中解析页面时提交的请求参数,默认按照yyyy/MM/dd的格式解析数据。并不符合Date类的处理机制,所以无法自动封装日期打他Date.此时可以更具适配器来指定格式。
/**
* 请求参数日期格式处理
* @param binder
*/
@InitBinder
public void InitBinder(ServletRequestDataBinder binder){
binder.registerCustomEditor(Date.class,
new CustomDateEditor(new SimpleDateFormat("yyyy-MM-dd"),true));
}
@RequestMapping("/pt05.form")
public String test05(String name,String addr,Date data) {
System.out.println(name+"#"+addr+"#"+data);
return "test02";
}
4. 文件上传
实现文件上传满足的三个条件:
- 表单必须是post提交
- 表单需提供文件上传项,且该项必须有name属性
- 保单需设置enctype="multipart/form-data"属性
js中表单:
<form action="${pageContext.request.contextPath}/pt06.form" method="post" enctype="multipart/form-data">
姓名:<input type="text" name="name"/>
<br/>
地址:<input type="text" name="addr"/>
<br/>
图像:<input type="file" name="file"/>
<br/>
<input type="submit" name="提交">
</form>
dispatcher-servlet.xml
中文件上传相关设置:
<!--配置文件上传-->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<!--文件体积限制-->
<property name="maxUploadSize" value="10000000"></property>
<!--内存缓冲区大小-->
<property name="maxInMemorySize" value="4096"></property>
<!--临时文件夹的位置-->
<property name="uploadTempDir" value="WEB-INF/"></property>
<!--文件名乱码参数-->
<property name="defaultEncoding" value="utf-8"></property>
</bean>
控制器中文件上传功能实现:
/**
* 文件上传实现
*
* @return
*/
@RequestMapping("/pt06.form")
public String test06(String name, String addr, MultipartFile file){
System.out.println(name+"#"+addr+"#"+file);
if(file!=null){
try {
byte[] data= file.getBytes();
FileUtils.writeByteArrayToFile(new File("D://"+file.getOriginalFilename()),data);
} catch (IOException e) {
e.printStackTrace();
}
}
return "test03";
}
5. 路径动态数据获取(RESTFul风格的请求参数处理)
-
普通请求与RESTFul风格的请求
-
普通get请求
http://localhost:8080/AnnoSpringMVC_war_exploded/pt06.form?name=tom&age=18
-
RESTFul请求
http://localhost:8080/AnnoSpringMVC_war_exploded/tom/18.form
-
-
SpringMVC对RESTFul风格的请求的处理
/** * 路径动态数据获取 * * @return */ @RequestMapping("/{name}/{addr}.form") public String test07(@PathVariable String name,@PathVariable String addr){ System.out.println(name+"#"+addr); return "test03"; }