SpringMVC基于注解的Controller

Posted nuist__NJUPT

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SpringMVC基于注解的Controller相关的知识,希望对你有一定的参考价值。

SpringMVC基于注解的Controller

基于注解的控制器与传统风格的控制器的区别主要有两点。
1-传统风格的控制器需要在SpringMVC配置文件中配置请求与控制器类的映射关系,而基于注解的控制器不需要在SpringMVC配置文件中部署映射,仅需使用RequestMapping注解类注解一个方法进行请求处理。
2-传统风格的控制器只能编写一个处理方法,不够灵活,使用基于注解的的控制可以在一个控制器类中编写多个请求处理方法,从而减少控制器类的数量,方便以后维护。
SpringMVC中最重要的两个注解是Controller和RequestMapping

使用@Controller注解的类表示为一个控制器类,注解完成后还需要在SpringMVC的配置文件中扫描指定控制器类的基本包,确保控制器类都在所扫描的基本包下。

在基于注解的控制器类中可以为每个请求编写相应的处理方法,使用@RequestMapping使得处理方法与请求方法一一对应。
@RequestMapping有方法级别的注解和类级别的注解,方法级别的注解使得请求路径与处理方法一一对应,类级别的注解控制器中所有方法都映射为类级别的请求,将相关处理放到同一个控制器类中,方便后期维护。

在控制器类中编写请求处理方法时可以有多个不同类型的参数,以及一个多种类型的返回值。如果在请求处理方法中使用Servlet API类型,那么可以将这些类型作为请求处理方法的参数类型。

Controller接收请求处理参数的方式有很多种,有个适合get方式,有的适合post方式,有的两者都适合。
Controller接收请求参数的常用方式有如下几种:
1-通过实体Bean接收请求参数,Bean的属性名必须和请求参数名相同。
2-通过处理方法的形参接收请求参数,形参名称必须与请求参数名相同。
3-通过HttpRequest接收请求参数
4-通过@PathVariable接收URL请求参数
5-通过@RequestParam接收请求参数
6-通过@ModelAttribute接收请求参数(可自动暴露为数据模型)

@ModelAttribute可以实现绑定请求参数到实体对象,注解一个非请求处理方法,每次调用该控制器的请求处理方法,都会调用被注解的非请求处理方法。

下面介绍通过实体Bean接收请求参数的方式,适用于get和post提交请求方式,需要注意的是Bean的属性名必须请求参数名称相同。
1-使用IDEA创建名为ch12的web应用,并在WEB-INF下创建目录lib,在该目录下导入相关jar包,将lib添加为项目库。

2-在web目录下的index.jsp文件中编写注册链接和登录链接页面。

<%--
  Created by IntelliJ IDEA.
  User: nuist__NJUPT
  Date: 2021/8/6
  Time: 21:57
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
  <meta http-equiv="Content-Type" content="text/html" charset="UTF-8">
  <title>Insert title here</title>
</head>
<body>
未注册的用户,请<a href="${pageContext.request.contextPath}/index/register">注册</a>!<br>
已注册的用户,去<a href="${pageContext.request.contextPath}/index//login">登录</a>!
</body>
</html>

3-在WEB-INF的目录下的web.xml中部署DispatcherServlet,拦截匹配的请求,根据相应的规则分发到目标Controller处理。

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
         http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         id = "WebApp_ID" version="4.0">
    <!--部署DispatcherServlet-->
    <servlet>
        <servlet-name>springmvc</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>WEB-INF/springmvc-servlet.xml</param-value>
        </init-param>
        <!--表示容器启动时加载的servlet-->
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>springmvc</servlet-name>
        <!--任意的请求都通过DispatcherServlet-->
        <url-pattern>/</url-pattern>
    </servlet-mapping>
</web-app>

4-在WEB-INF目录下创建SpringMVC的配置文件springmvc-servlet.xml,在配置文件中需要是要扫描机制扫描控制器所在的包,访问jsp文件的绝对路径采用视图解析器解析。

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd
       http://www.springframework.org/schema/context
        https://www.springframework.org/schema/context/spring-context.xsd
        http://www.springframework.org/schema/mvc
        http://www.springframework.org/schema/mvc/spring-mvc.xsd">

    <!--使用扫描机制,扫描控制器类-->
    <context:component-scan base-package="controller"/>
    <mvc:annotation-driven />
    <!--annotation-driven用于简化开发的配置,注解DefaultAnnotationHandlerMapping和AnnotationMethodHandlerAdapter-->
    <!--使用resources过滤掉不需要dispatcherservlet的资源,例如静态资源,在使用resources时必须使用annotation-driven,否则resources会阻止任意控制器被调用-->

    <mvc:resources location="/image/" mapping="/image/**"></mvc:resources>

    <!--配置视图解析器-->
    <bean class = "org.springframework.web.servlet.view.InternalResourceViewResolver" id = "internalResourceViewResolver">
        <!--前缀-->
        <property name = "prefix" value = "/WEB-INF/jsp/"/>
        <!--后缀-->
        <property name = "suffix" value = ".jsp"/>
    </bean>
</beans>

5-需要使用Bean对象接收请求参数类型,所以在src目录下创建pojo包,在该包中创建实体类UserForm,所需要接收的参数均定义在UserForm类中。

/**
 *通过实体Bean接收请求参数,适用于get和post请求方式,要求Bean的属性名称必须和请求参数名称相同。
 */
public class UserForm {
    private String uname ; //用户名
    private String upass ; //密码
    private String reupass ; //确认密码

    public String getUname() {
        return uname;
    }

    public void setUname(String uname) {
        this.uname = uname;
    }

    public String getUpass() {
        return upass;
    }

    public void setUpass(String upass) {
        this.upass = upass;
    }

    public String getReupass() {
        return reupass;
    }

    public void setReupass(String reupass) {
        this.reupass = reupass;
    }
}

6-在src目录下创建controller包,在该包中创建控制器类IndexController和UserController,第一个控制器类用于处理登录与注册链接的跳转,第二个控制器类用于处理注册和登录事件。
IndexController类:

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
@RequestMapping("/index")
public class IndexController {
    @RequestMapping("/login")
    public String login(){
        return "login" ; //跳转到WEB-INF/jsp文件下的login.jsp
    }
    @RequestMapping("/register")
    public String register(){
        return "register"  ; //跳转到WEB-INF/jsp下的register.jsp
    }
}

UserController类:


import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import pojo.UserForm;

import javax.servlet.http.HttpSession;

@Controller
@RequestMapping("/user")
public class UserController {
    //得到一个记录日志的对象,打印信息时候能够标记打印的是哪个类的信息
    private static final Log logger = LogFactory.getLog(UserController.class) ;
    //处理登录,使用UserForm对象user接收登录页面提交的请求参数
    @RequestMapping("/login")
    public String login(UserForm user, HttpSession session, Model model){
        if("wgd".equals(user.getUname()) && "123456".equals(user.getUpass())){
            session.setAttribute("u", user);
            logger.info("登录成功") ;
            return "main" ; //登录成功,跳转到main.jsp
        }else{
            logger.info("登录失败") ;
            model.addAttribute("messageError", "用户名或者密码错误") ;
            return "login" ; //返回login.jsp

        }
    }
    //处理注册,使用UserForm对象user接收注册页面提交的请求参数
    @RequestMapping("/register")
    public String register(UserForm user, HttpSession session, Model model){
        if("wgd".equals(user.getUname()) && "123456".equals(user.getUpass())){
            logger.info("注册成功") ;
            return "login" ; //注册成功,跳转到login.jsp
        }else{
            logger.info("注册失败") ;
            //在register.jsp页面可以使用EL表达式取出model的uname值
            model.addAttribute("user", user.getUname()) ;
            model.addAttribute("messageError", "注册失败") ; //暴露数据给模型,等待在jsp页面提取数据
            return "register" ; //注册失败,跳转到register.jsp
        }
    }
}

7-在WEB-INF目录下创建jsp目录,在该目录下创建页面视图login.jsp , register.jsp , main.jsp

login.jsp页面:

<%@ page language="java" contentType="text/html; charset=UTF-8"
         pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>Insert title here</title>
</head>
<body>
<form action = "${pageContext.request.contextPath}/user/login" method = "post" accept-charset="UTF-8">
    <table >
        <tr>
            <td colspan = "2"> <img src="${pageContext.request.contextPath}/image/login.png"></td>
        </tr>
        <tr>
            <td>用户名:</td>
            <td><input type = "text" name = "uname" class = "textSize"></td>
        </tr>
        <tr>
            <td>密码:</td>
            <td><input type = "password" name = "upass" class = "textSize"/></td>
        </tr>
        <tr>
            <td colspan = "2">
                <input type = "submit"  value = "提交">
                <input type = "submit"  value = "取消">
            </td>
        </tr>
    </table>
   ${messageError}
</form>
</body>
</html>

register.jsp页面:

<%@ page language="java" contentType="text/html; charset=UTF-8"
         pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>Insert title here</title>
</head>
<body>
<form action = "${pageContext.request.contextPath}/user/register" method = "post" name = "registerForm" >
    <table border=1 bgcolor="#00bfff" align = "center">
        <tr>
            <td>用户名:</td>
            <td>
                <input class = "textSize" type = "text" name = "uname" value = "${uname}"/>
            </td>
        </tr>
        <tr>
            <td>密码:</td>
            <td>
                <input class = "textSize" type = "password" maxLength = "20" name = "upass"/>
            </td>
        </tr>
        <tr>
            <td>确认密码:</td>
            <td>
                <input class = "textSize" type = "password" maxLength = "20" name = "reupass"/>
            </td>
        </tr>
        <tr>
            <td colspan="2" align="center">
                <input type = "submit" value = "注册" />
            </td>
        </tr>
    </table>
    <table align = "center">
        <tr>
            <td colspan = "5" > ${messageError} </td>
        </tr>
    </table>

</form>
</body>
</html>

main.jsp页面:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html" charset="UTF-8">
    <title>主页面</title>
</head>
<body>
主页面
Spring MVC注解版本--初识--12

SpringMVC的controller学习

Spring MVC学习—基于注解的Controller控制器的配置全解一万字

SpringMVC基于注解开发

SpringMVC 注解详解

springmvc注解之@Controller和@RestController注解