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>
主页面
</body>
</html>

8-因为登录页面用到了一个图片,所以在web目录下创建image目录,在该目录中放置图片login.png
在这里插入图片描述
9-发布并运行SpringMVC应用,运行tomcat服务器,首先通过地址访问index.jsp页面,如下所示:
在这里插入图片描述
点击注册,输入用户名wgd,密码123456,确认密码123456,完成注册。
在这里插入图片描述
在登录页面,输入用户名wgd,密码123456,完成登录,进入主页面。

在这里插入图片描述
在这里插入图片描述
注册失败和登录失败如下:
在这里插入图片描述

在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

nuist__NJUPT

给个鼓励吧,谢谢你

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值