SpringMvc下
( 一、HTTP 请求方式与 RESTful 风格
1. RESTful 风格请求方式
a.GET 查询资源 获取服务器端数据
b. POST 创建资源 向服务器提交新数据 增删改都可以
c. PUT 更新资源 全量更新服务器数据 主要是更新
d. DELETE 删除资源 移除服务器端数据
2. 请求方式指定
通过 `@RequestMapping` 注解的 `method` 属性指定:
@RequestMapping(value = "/save", method = RequestMethod.POST)
二、参数接收注解方式
@RequestParam - 绑定请求参数到方法参数
示例:
public String save(@RequestParam("username") String name)
@PathVariable - 获取URL路径中的参数(RESTful风格)
示例:
@RequestMapping("/user/{id}")
public String findById(@PathVariable("id") Integer userId)
@RequestHeader - 获取请求头信息
示例:
public String getHeader(@RequestHeader("User-Agent") String userAgent)
@CookieValue - 获取Cookie值
示例:
public String getCookie(@CookieValue("JSESSIONID") String sessionId)
@RequestBody - 接收JSON格式的请求体
示例:
public String saveUser(@RequestBody User user)
三、响应数据和结果视图
1. Controller 方法返回值类型
(1)String 类型
指定逻辑视图名称,由视图解析器解析为物理视图:
@RequestMapping("/save1.do")
public String save1() {return "suc"; // 对应/pages/suc.jsp
}
(2)void 类型
需手动处理响应,可通过请求转发或重定向跳转:
@RequestMapping("/save2.do")
public void save2(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {// 请求转发request.getRequestDispatcher("/pages/suc.jsp").forward(request, response);// 或直接响应数据response.getWriter().print("hello");
}
(3)ModelAndView 对象
同时携带数据和视图信息:
@RequestMapping("/save3.do")
public ModelAndView save3() {ModelAndView mv = new ModelAndView();mv.addObject("msg", "用户名或密码已存在"); // 存储数据mv.setViewName("suc"); // 设置视图return mv;
}
(4)JSON 数据
结合 `@ResponseBody` 注解返回 JSON 格式数据:
@RequestMapping("/save6.do")
@ResponseBody
public User save6(@RequestBody User user) {return user; // 自动转换为JSON
}
2. 请求转发与重定向
(1)请求转发(Forward)
服务器内部跳转,地址栏不变
共享 request 域中的数据,会携带参数
发送一次请求
实现方式:
// 方式1:返回字符串
return "forward:/pages/suc.jsp";// 方式2:通过request对象
request.getRequestDispatcher("/pages/suc.jsp").forward(request, response);
(2)重定向(Redirect)
客户端跳转,地址栏改变
不共享 request 域中的数据
发送两次请求
实现方式:
// 方式1:返回字符串
return "redirect:/pages/suc.jsp";// 方式2:通过response对象
response.sendRedirect(request.getContextPath() + "/pages/suc.jsp");
3. 返回 JSON 数据的两种方式
(1)在方法上添加 @ResponseBody 注解
@RequestMapping("/getUser")
@ResponseBody
public User getUser() {User user = new User();user.setUsername("test");user.setAge(20);return user;
}
(2)在类上添加 @RestController 注解
相当于 `@Controller + @ResponseBody` 的组合:
@RestController
@RequestMapping("/user")
public class UserController {@RequestMapping("/getUser")public User getUser() {// 方法返回值自动转为JSON}
}
(3)在具体的变量上加@RequestController
<dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>2.9.0</version>
</dependency>
<dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-core</artifactId><version>2.9.0</version>
</dependency>
<dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-annotations</artifactId><version>2.9.0</version>
</dependency>
四、文件上传
1. 准备工作
(1)导入依赖
<dependency><groupId>commons-fileupload</groupId><artifactId>commons-fileupload</artifactId><version>1.3.1</version>
</dependency>
<dependency><groupId>commons-io</groupId><artifactId>commons-io</artifactId><version>2.4</version>
</dependency>
(2)配置文件上传解析器(springmvc.xml)
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"><property name="maxUploadSize" value="8388608" /> <!-- 8M -->
</bean>
(3)编写上传表单
<form action="/fileupload.do" method="post" enctype="multipart/form-data">选择文件:<input type="file" name="upload" /><br/><input type="submit" value="上传" />
</form>
2. 两种接收文件的方式
(1)使用 MultipartFile 对象(推荐)
@RequestMapping("/fileupload.do")
public String upload(MultipartFile upload, HttpServletRequest request) throws IOException {// 获取上传路径String realPath = request.getSession().getServletContext().getRealPath("/uploads");File file = new File(realPath);if (!file.exists()) {file.mkdirs();}// 处理文件名(避免重复)String filename = upload.getOriginalFilename();String uuid = UUID.randomUUID().toString().replace("-", "").toUpperCase();filename = uuid + "_" + filename;// 上传文件upload.transferTo(new File(file, filename));return "suc";
}
(2)通过 HttpServletRequest 转型
@RequestMapping("/fileupload2.do")
public String upload2(HttpServletRequest request) throws IOException {// 转型为MultipartHttpServletRequestMultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;// 获取文件MultipartFile upload = multipartRequest.getFile("upload");// 后续处理同上...return "suc";
}