SpringMVC框架02——SpringMVC的Controller详解

1、基于注解的控制器

1.1、@Controller 注解类型
在SpringMVC中使用org.springframework.stereotype.Controller注解类型声明某类的实例是一个控制器。

package com.sgh.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
public class Test {
    @RequestMapping("/test")
    public String test(){
        return "form";
    }
}

在SpringMVC中使用扫描机制找到应用中所有基于注解的控制器类,需要在springmvc.xml配置文件中,配置context:component-scan/元素指定控制器类的包:

  <!-- 注解扫描器 -->
    <context:component-scan base-package="com.sgh.controller"></context:component-scan>
    <!-- springmvc注解驱动 -->
    <mvc:annotation-driven></mvc:annotation-driven>

1.2、@RequestMapping 注解
在基于注解的控制器类中可以为每个请求编写对应的处理方法,需要使用org.springframework.web.bind.annotation.RequestMapping注解类型将请求与处理方法一一对应。
可以加在方法上,属性可以指定请求方法例:

public class Test {
    @RequestMapping("/test")
    public String test(){
        return "form";
    }
}

@Controller
public class Test {
    @RequestMapping(value="/test",method = RequestMethod.POST)
    public String test(){
        return "form";
    }
}


1.3、请求处理
请求处理方法中常出现的参数类型:
(1) javax.servlet.http.HttpServletRequest
(2) javax.servlet.http.HttpServletResponse
(3)javax.servlet.http.HttpSession
(4)输入输出流
(5)表单实体类
(6)注解类型
(7)org.springframework.ui.Model
请求处理方法常见的返回类型:

String类型,表示逻辑视图,需要在springmvc.xml中配置视图解析器;
ModelAndView类型

2、Controller接收请求参数的常见方式

2.1、通过实体Bean接收请求
通过一个实体Bean来接收请求参数,适用于get和post提交请求方式。需要注意的是,Bean的属性名称必须与请求参数名称相同。
2.2、通过处理方法的形参接收请求
直接把表单参数写到控制器类响应方法的形参中,即形参名称与请求参数名称完全相同,示例代码如下:
jsp页面的form表单:

<%--
  Created by IntelliJ IDEA.
  User: 石光辉
  Date: 2019/5/16
  Time: 19:17
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>注册</title>
</head>
<body>
<form action="${pageContext.request.contextPath}/register.do" method="post">
    <p>
        用户名:<input type="text" name="username">
    </p>
    <p>
        密码:<input type="password" name="password">
    </p>
    <p>
        <input type="submit" value="登录">
    </p>
</form>

</body>
</html>

控制器代码:

@Controller
public class TestController {
    @RequestMapping("/register")
    public String register(String username,String password)
        //业务逻辑代码
        return "index";
    }
}

2.3、通过HttpServletRequest接收请求
表单代码:
参考上面的form表单。

控制器代码:

@Controller
public class Test {
    @RequestMapping(value = "/register",method = RequestMethod.POST)
    public String test(HttpServletRequest request){
        String username=request.getParameter("username");
        String password=request.getParameter("password");
        return "index";

    }
}

2.4、通过@PathVariable接收URL中的请求参数
jsp页面代码参考本节第2点的form表单,controller类接收请求参数代码如下:

@Controller
public class TestController {
    @RequestMapping("/register/{username}/{passwordwd}")
    public String login(@PathVariable String username,@PathVariable String password) {
        //业务逻辑代码
        return "index";
    }
}
 在访问“http://localhost:8080/register/sgh/123456”路径时,上述代码自动将URL中的模板变量{username}和{password}绑定到通过@PathVariable注解到同名参数上,即username=sgh,password=123456

2.5、通过@RequestParam接收请求参数
jsp页面代码参考本节第2点的form表单,controller类接收请求参数代码如下:

@Controller
public class TestController {
    @RequestMapping("/register")
    public String register(@RequestParam String username, @RequestParam String password) {
        //业务逻辑代码
        return "index";
    }
}

该方式与本节第2点中提到的“通过处理方法的形参接收请求参数”的区别是:当请求参数与接收参数名不一致时,“通过处理方法的形参接收请求参数”不会报404错误,而“通过@RequestParam接收请求参数”会报404错误,提示效果如下:
在这里插入图片描述

3、重定向与转发

在SpringMVC框架中,控制器类中处理方法的return语句默认就是转发实现,只不过实现的是转发到视图,示例代码如下:

@RequestMapping("/login")
public String login() {
    //转发到index.jsp
    return "index";
}

在SpringMVC框架中,重定向与转发的示例代码如下:

@Controller
@RequestMapping("/index")
public class TestController {
    @RequestMapping("/login")
    public String login() {
        //转发到一个请求方法(同一个控制器类中可以省略/index/)
        return "forward:/index/isLogin";
    }

    @RequestMapping("/isLogin")
    public String isLogin(){
        //重定向到一个请求方法
        return "redirect:/index/isRegister";
    }
    
    @RequestMapping("/isRegister")
    public String isRegister(){
        //转发到一个视图
        return "register";
    }
}

4、应用@Autowired进行依赖注入

在Controller类中需要使用org.springframework.beans.factory.annotation.Autowired注解类型将依赖注入到一个属性或方法,例如:

@Autowired
private UserService userService;

在Spring MVC中,为了能被作为依赖注入,类必须使用org.springframework.stereotype.Service注解类型注明为@Service(一个服务)。另外还需要在配置文件中使用context:component-scan元素来扫描依赖基础包

Service类代码如下:

import org.springframework.stereotype.Service;

@Service
public class UserService {
    public void login(User user){
        System.out.println(user);
    }
}

在springmvc.xml中添加扫描:

<context:component-scan base-package="com.sgh.service"></context:component-scan>

Controller类代码如下:

@Controller
public class TestController {

    @Autowired
    //将一个UserServiceimpl对象自动赋值给userService
    private UserService userService;

    @RequestMapping("/login")
    public String login(User user){
        userService.login(user);
        return "test";
    }
}

5、@ModelAttribute注解 通过org.springframework.web.bind.annotation.ModelAttribute注解类型可以经常实现以下两个功能:

5.1、绑定请求参数到实体对象
Controller类代码示例:

@Controller
public class TestController {
    @RequestMapping("/login")
    public String login(@ModelAttribute("user") UserForm user) {
        //业务逻辑代码
        return "index";
    }
}

上述代码中的形参 @ModelAttribute("user") UserForm user 的功能有两个:

(1)一是将请求参数的输入封装到user对象中
(2)二是创建UserForm实例,以user为键值存储在Model对象中,和 model.addAttribute(“user”,user) 语句的功能一样。
如果没有指定键值,即使用 @ModelAttribute UserForm user 为形参,那么在创建UserForm实例时以"userForm"为键值存储在Model对象中,和 model.addAttribute(“userForm”,user) 语句的功能一样

补充:表单中<form action="${pageContext.request.contextPath}/register.do" method="post">${pageContext.request.contextPath}/register.do如果被解析为 $%7BpageContext.request.contextPath%7D,一般是web.xml中版本不对,在web.xml中头部改为:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xmlns="http://java.sun.com/xml/ns/javaee"
         xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
         id="WebApp_ID" version="3.0">

${pageContext.request.contextPath}代表当前部署到服务器的应用名称(项目名)

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值