SpringMvc下

( 一、HTTP 请求方式与 RESTful 风格

  1. RESTful 风格请求方式

a.GET 查询资源 获取服务器端数据

b. POST 创建资源 向服务器提交新数据 增删改都可以

c. PUT 更新资源 全量更新服务器数据 主要是更新

d. DELETE 删除资源 移除服务器端数据

2. 请求方式指定

通过 `@RequestMapping` 注解的 `method` 属性指定:

java 复制代码
@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 类型

指定逻辑视图名称,由视图解析器解析为物理视图:

java 复制代码
@RequestMapping("/save1.do")
public String save1() {
    return "suc"; // 对应/pages/suc.jsp
}

(2)void 类型

需手动处理响应,可通过请求转发或重定向跳转:

java 复制代码
@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 对象

同时携带数据和视图信息:

java 复制代码
@RequestMapping("/save3.do")
public ModelAndView save3() {
    ModelAndView mv = new ModelAndView();
    mv.addObject("msg", "用户名或密码已存在"); // 存储数据
    mv.setViewName("suc"); // 设置视图
    return mv;
}

(4)JSON 数据

结合 `@ResponseBody` 注解返回 JSON 格式数据:

java 复制代码
@RequestMapping("/save6.do")
@ResponseBody
public User save6(@RequestBody User user) {
    return user; // 自动转换为JSON
}

2. 请求转发与重定向

(1)请求转发(Forward)

服务器内部跳转,地址栏不变

共享 request 域中的数据,会携带参数

发送一次请求

实现方式:

java 复制代码
// 方式1:返回字符串
return "forward:/pages/suc.jsp";

// 方式2:通过request对象
request.getRequestDispatcher("/pages/suc.jsp").forward(request, response);

(2)重定向(Redirect)

客户端跳转,地址栏改变

不共享 request 域中的数据

发送两次请求

实现方式:

java 复制代码
// 方式1:返回字符串
return "redirect:/pages/suc.jsp";

// 方式2:通过response对象
response.sendRedirect(request.getContextPath() + "/pages/suc.jsp");
  1. 返回 JSON 数据的两种方式

(1)在方法上添加 @ResponseBody 注解

java 复制代码
@RequestMapping("/getUser")
@ResponseBody
public User getUser() {
    User user = new User();
    user.setUsername("test");
    user.setAge(20);
    return user;
}

(2)在类上添加 @RestController 注解

相当于 `@Controller + @ResponseBody` 的组合:

java 复制代码
@RestController
@RequestMapping("/user")
public class UserController {
    @RequestMapping("/getUser")
    public User getUser() {
        // 方法返回值自动转为JSON
    }
}

(3)在具体的变量上加@RequestController

XML 复制代码
<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)导入依赖

XML 复制代码
<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)

XML 复制代码
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
    <property name="maxUploadSize" value="8388608" /> <!-- 8M -->
</bean>

(3)编写上传表单

html 复制代码
<form action="/fileupload.do" method="post" enctype="multipart/form-data">
    选择文件:<input type="file" name="upload" /><br/>
    <input type="submit" value="上传" />
</form>

2. 两种接收文件的方式

(1)使用 MultipartFile 对象(推荐)

java 复制代码
@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 转型

java 复制代码
@RequestMapping("/fileupload2.do")
public String upload2(HttpServletRequest request) throws IOException {
    // 转型为MultipartHttpServletRequest
    MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;
    // 获取文件
    MultipartFile upload = multipartRequest.getFile("upload");
    // 后续处理同上...
    return "suc";
}
相关推荐
小菜全8 小时前
HTML 和 JavaScript 关联的基础教程
servlet
遇见火星4 天前
如何在 Jenkins 中安装 Master 和 Slave 节点以优化 CI/CD 流程
servlet·ci/cd·jenkins
羊锦磊8 天前
[ Servlet 服务器]
运维·服务器·servlet
所愿ღ12 天前
JavaWeb-Servlet基础
笔记·servlet
clever10112 天前
在ubuntu系统上离线安装jenkins的做法
ubuntu·servlet·jenkins
鱼鱼说测试13 天前
Jenkins+Python自动化持续集成详细教程
开发语言·servlet·php
别来无恙14915 天前
JavaWeb核心:HttpServletRequest与HttpServletResponse详解
java·前端·servlet
典学长编程17 天前
JavaWeb从入门到精通!第二天!(Servlet)
数据仓库·servlet·javaweb
Elieal22 天前
深入浅出:Ajax 与 Servlet 实现前后端数据交互
前端·ajax·servlet