SpringMVC作为Spring框架中的核心Web模块,提供了强大而灵活的请求处理与响应机制。本文将深入剖析SpringMVC的请求映射、参数绑定、数据响应以及异常处理等核心功能,帮助开发者构建健壮的Web应用程序。
一、请求映射:@RequestMapping详解
RequestMapping注解是SpringMVC中建立请求URL和处理方法之间对应关系的核心。它可以作用于类和方法上:
- 作用在类上:表示第一级的访问目录。
- 作用在方法上:表示第二级的访问目录。
1.1基本用法与层级结构
- path:指定请求路径的URL。
- value:与path属性相同,用于指定请求路径。
- method:指定该方法的请求方式(GET、POST等)。
示例代码:
@Controller
@RequestMapping(path = "/role")
public class RoleController {@RequestMapping(path = "/save", method = RequestMethod.GET)public String save() {System.out.println("保存角色...");return "suc";}@RequestMapping(value = "/delete")public String delete() {System.out.println("删除角色...");return "suc";}
}
二、请求参数绑定
2.1绑定机制
SpringMVC的参数绑定过程是将表单提交的请求参数绑定到控制器方法的参数上。要求表单的name属性和控制器方法参数的名称一致。
2.2支持的数据类型
- 基本数据类型和字符串类型:要求表单的name和参数的名称相同。
- 实体类型(JavaBean):要求表单的name和JavaBean中的属性名称一致。
- 集合数据类型:如List、Map等,需要在JSP页面中按照特定格式编写name属性。
示例代码:
@Controller
@RequestMapping("/user")
public class UserController {@RequestMapping("/save")public String save(String username, Integer age) {System.out.println(username);System.out.println(age);return "suc";}@RequestMapping("/save1")public String save1(User user) {System.out.println(user.toString());return "suc";}@RequestMapping("/save2")public String save2(User user) {System.out.println(user);return "suc";}@RequestMapping("/save3")public String save3(User user) {System.out.println(user);return "suc";}
}
<form action="/user/save1" method="post"><input type="text" name="username"/><br/><input type="text" name="age"/><br/><input type="submit"/>
</form>
三、控制器中使用Servlet API对象
在SpringMVC控制器中,可以直接使用HttpServletRequest和HttpServletResponse对象来处理请求和响应。
示例代码:
@RequestMapping(value = "/save6.do", method = RequestMethod.POST)
public String save6(HttpServletRequest request, HttpServletResponse response) {String username = request.getParameter("username");HttpSession session = request.getSession();System.out.println(session);System.out.println(response);return "suc";
}
四、结果跳转方式
4.1 ModelAndView
通过ModelAndView对象,可以设置数据和视图名称,然后返回给视图解析器。
示例代码:
@RequestMapping("/save3")
public ModelAndView save3() {ModelAndView mv = new ModelAndView();mv.addObject("msg", "用户名或者密码已经存在");mv.setViewName("suc");return mv;
}
4.2 Servlet API
可以通过HttpServletResponse进行输出、重定向或转发。
示例代码:
@RequestMapping("/t2")
public void test2(HttpServletRequest req, HttpServletResponse rsp) throws IOException {rsp.sendRedirect("/SpringMVCDemo/html/suc.html");
}
4.3 SpringMVC
通过SpringMVC实现转发和重定向,无需视图解析器。
示例代码:
@RequestMapping("/t3")
public String test3() {return "redirect:/html/suc.html";
}
五、、ResponseBody响应JSON数据
使用@ResponseBody注解可以将JavaBean对象转换为JSON字符串响应给客户端。需要引入Jackson的jar包。
示例代码:
@RequestMapping("/save6")
public @ResponseBody User save6(User user) {user.setUsername("hello");user.setAge(100);return user;
}
六、文件上传
6.1 配置文件上传解析器
在SpringMVC配置文件中配置CommonsMultipartResolver解析器。
示例代码:
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"><property name="maxUploadSize" value="8388608"/>
</bean>
6.2 文件上传的HTML页面
使用enctype="multipart/form-data"来指定表单的编码类型。
示例代码:
<form id="addForm" action="/SpringMvc/file/upload" method="post" enctype="multipart/form-data">选择文件:<input type="file" name="file" width="120px"><input type="submit" value="上传">
</form>
6.3 文件上传的Controller代码
使用@RequestParam注解绑定文件参数,并使用MultipartFile接口处理文件上传。
示例代码:
@RequestMapping(value="/upload", method= RequestMethod.POST)
@ResponseBody
public String upload(@RequestParam("file") MultipartFile file, HttpServletRequest request) throws IOException {String rootPath = request.getSession().getServletContext().getRealPath("WEB-INF/upload");String originalFileName = file.getOriginalFilename();File newFile = new File(rootPath + File.separator + originalFileName);if(!newFile.getParentFile().exists()) {newFile.getParentFile().mkdirs();}file.transferTo(newFile);return "{\"data\":\"success\"}";
}
本文详细介绍了SpringMVC中的请求与响应处理机制,包括RequestMapping注解的使用、请求参数的绑定、控制器中的Servlet API对象、结果跳转方式、响应JSON数据等内容。通过本文的学习,读者可以更加深入地理解SpringMVC的请求与响应处理流程,并在实际开发中灵活运用这些知识。