Spring Boot之Spring MVC基于注解的控制器(RequestMapping注解类型 重定向与转发 依赖注入)

简介: Spring Boot之Spring MVC基于注解的控制器(RequestMapping注解类型 重定向与转发 依赖注入)

前言:

在使用Spring MVC进行Web应用开发时,Controller是Web应用的核心。Controller实现类包含了对用户请求的处理逻辑,是用户请求和业务逻辑之间的桥梁,是Spring MVC框架的核心部分,负责具体的业务逻辑处理

RequestMappint注解类型

使用org.springframework.web.bind.annotation.RequestMapping注解类型将请求与处理方法一一对应。

1:方法级别注解

@Controller
public class IndexController{
@RequestMapping(value="/index/login")
public String login()}
return "login";
}
@RequestMapping(value="/index/register")
public String register(){
return "register";
}
}

上述代码中有两个RequestMapping注解语句,它们都作用在处理方法上。

2:类级别注解

public class IndexController{
@RequestMapping(value="/login")
public String login()}
return "login";
}
@RequestMapping(value="/register")
public String register(){
return "register";
}
}

在类级别注解的情况下,控制器类中的所有方法都将映射为类级别的请求。

编写请求处理方法

在控制类中每个请求处理方法可以有多个不同类型的参数以及一个多种类型的返回结果

如果要在请求处理方法中使用Servlet API类型,那么可以将这些类型作为请求处理方法的参数类型

public class IndexController{
@RequestMapping(value="/index/login")
public String login()}
return "login";
}
@RequestMapping(value="/index/register")
public String login(HttpSession,HttpServletRequest request){
session.setAttribute("skey","session范围的值");
request.setAttribute("rkey","reqeust范围的值");
return "register";
}
}

Controller接受请求参数的常见方式

Controller接受请求参数的方式有很多种,有的适合get请求方式,有的适合post请求方式,有的二者都适合 下面通过一个实例讲解

通过实体bean接受请求参数

创建Web应用ch2_3

在他的WEB/INF/JSP/目录下创建register.jsp 和login.jsp

register.jsp代码如下

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<form action="${pageContext.request.contextPath }/user/register" method="post" name="registForm">
  <table border=1>
      <tr>
        <td>姓名:</td>
        <td>
          <input type="text" name="uname" value="${user.uname }"/>
        </td>
      </tr>
      <tr>
        <td>密码:</td>
        <td><input type="password"  name="upass"/></td>
      </tr>
      <tr>
        <td>确认密码:</td>
      <td><input type="password"  name="reupass"/></td>
      </tr>
      <tr>
      <td colspan="2" align="center">
        <input type="submit" value="注册" />
      </td>
      </tr>
    </table>
  </form>
</body>
</html>

login.jsp代码如下

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
  <form action="${pageContext.request.contextPath }/user/login" method="post">
  <table>
    <tr>
      <td align="center" colspan="2">登录</td>
    </tr>
    <tr>
      <td>姓名:</td>
      <td><input type="text" name="uname"></td>
    </tr>
    <tr>
      <td>密码:</td>
      <td><input type="password" name="upass"></td>
    </tr>
    <tr>
      <td colspan="2">
        <input type="submit" value="提交" >
        <input type="reset" value="重置" >
      </td>
    </tr>
  </table>
  ${messageError }
  </form>
</body>
</html>

index.jsp代码如下

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
  没注册的用户,请<a href="user/register">注册</a>!<br>
  已注册的用户,去<a href="user/login">登录</a>!
</body>
</html>

创建POJO实体类

在src目录下创建pojo包 并创建实体类UserForm

package pojo;
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;
  }
}

创建控制器类

package controller;
import javax.servlet.http.HttpSession;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import pojo.UserForm;
import service.UserService;
@Controller
@RequestMapping("/user")
public class UserController {
  //得到一个用来记录日志的对象,这样打印信息的时候能够标记打印的是那个类的信息
  private static final Log logger = LogFactory.getLog(UserController.class);
  //将服务层依赖注入到属性userService
  @Autowired
   public UserService userService;
  /**
   * 处理登录
   */
  @RequestMapping("/login")
  public String login(UserForm user, HttpSession session, Model model) {
    if(userService.login(user)){
      session.setAttribute("u", user);
      logger.info("成功");
      return "main";//登录成功,跳转到main.jsp
    }else{
      logger.info("失败");
      model.addAttribute("messageError", "用户名或密码错误");
      return "login";
    } 
  }
  /**
   *处理注册
   */
  @RequestMapping("/register")
  public String register(@ModelAttribute("user") UserForm user) {
    if(userService.register(user)){
      logger.info("成功");
      return "login";//注册成功,跳转到login.jsp
    }else{
      logger.info("失败");
      //使用@ModelAttribute("user")与model.addAttribute("user", user)功能相同
        //在register.jsp页面上可以使用EL表达式${user.uname}取出ModelAttribute的uname值
      return "register";//返回register.jsp
    }
  }
}

然后发布并运行应用即可

重定向与转发

重定向是将用户从当前处理请求定向到另一个视图或处理请求,以前的请求中存放的信息全部失效,并进入了新一个的request作用域,转发是将用户对当前处理的请求转发给另一个视图或处理请求,以前request中存放的信息不会失效

转发过程:客户浏览器发送http请求,Web服务器接受此请求,调用内部的一个方法,在容器内部完成请求处理和转发动作,将目标资源发送给客户

重定向过程:客户浏览器发送http请求,Web服务器接收后发送302状态码相应以及对应新的location给客户浏览器

在Spring MVC框架中 控制器类中的处理方法return语句默认就是转发实现,只不过实现的是转发到视图

应用@Autowired进行依赖注入

Spring MVC框架本身就是一个非常优秀的MVC框架,它拥有一个依赖注入的有点,可以通过Atuowired注解类型将依赖注入一个属性或方法

下面实例将应用的登录和注册业务逻辑处理分离出来 使用Service层实现

创建service包 创建一个接口和它的实现类

接口代码如下

package service;
import pojo.UserForm;
public interface UserService {
  boolean login(UserForm user);
  boolean register(UserForm user);
}

实现类代码如下

package service;
import org.springframework.stereotype.Service;
import pojo.UserForm;
//注解为一个服务
@Service
public class UserServiceImpl implements UserService{
  @Override
  public boolean login(UserForm user) {
    if("zhangsan".equals(user.getUname()) 
        && "123456".equals(user.getUpass()))
      return true;
    return false;
  }
  @Override
  public boolean register(UserForm user) {
    if("zhangsan".equals(user.getUname()) 
        && "123456".equals(user.getUpass()))
      return true;
    return false;
  }
}

@ModelAttribute可以实现以下两个功能

1:绑定请求参数到实体对象(表单的命令对象)

2:注解一个非请求处理方法

相关文章
|
2月前
|
安全 Java Apache
微服务——SpringBoot使用归纳——Spring Boot中集成 Shiro——Shiro 身份和权限认证
本文介绍了 Apache Shiro 的身份认证与权限认证机制。在身份认证部分,分析了 Shiro 的认证流程,包括应用程序调用 `Subject.login(token)` 方法、SecurityManager 接管认证以及通过 Realm 进行具体的安全验证。权限认证部分阐述了权限(permission)、角色(role)和用户(user)三者的关系,其中用户可拥有多个角色,角色则对应不同的权限组合,例如普通用户仅能查看或添加信息,而管理员可执行所有操作。
110 0
|
2月前
|
安全 Java 数据安全/隐私保护
微服务——SpringBoot使用归纳——Spring Boot中集成 Shiro——Shiro 三大核心组件
本课程介绍如何在Spring Boot中集成Shiro框架,主要讲解Shiro的认证与授权功能。Shiro是一个简单易用的Java安全框架,用于认证、授权、加密和会话管理等。其核心组件包括Subject(认证主体)、SecurityManager(安全管理员)和Realm(域)。Subject负责身份认证,包含Principals(身份)和Credentials(凭证);SecurityManager是架构核心,协调内部组件运作;Realm则是连接Shiro与应用数据的桥梁,用于访问用户账户及权限信息。通过学习,您将掌握Shiro的基本原理及其在项目中的应用。
117 0
|
2月前
|
NoSQL Java 关系型数据库
微服务——SpringBoot使用归纳——Spring Boot 中集成Redis——Redis 介绍
本文介绍在 Spring Boot 中集成 Redis 的方法。Redis 是一种支持多种数据结构的非关系型数据库(NoSQL),具备高并发、高性能和灵活扩展的特点,适用于缓存、实时数据分析等场景。其数据以键值对形式存储,支持字符串、哈希、列表、集合等类型。通过将 Redis 与 Mysql 集群结合使用,可实现数据同步,提升系统稳定性。例如,在网站架构中优先从 Redis 获取数据,故障时回退至 Mysql,确保服务不中断。
123 0
微服务——SpringBoot使用归纳——Spring Boot 中集成Redis——Redis 介绍
|
1月前
|
前端开发 Java Maven
Spring 和 Spring Boot 之间的比较
本文对比了标准Spring框架与Spring Boot的区别,重点分析两者在模块使用(如MVC、Security)上的差异。Spring提供全面的Java开发基础设施支持,包含依赖注入和多种开箱即用的模块;而Spring Boot作为Spring的扩展,通过自动配置、嵌入式服务器等功能简化开发流程。文章还探讨了两者的Maven依赖、Mvc配置、模板引擎配置、启动方式及打包部署等方面的异同,展示了Spring Boot如何通过减少样板代码和配置提升开发效率。总结指出,Spring Boot是Spring的增强版,使应用开发、测试与部署更加便捷高效。
283 10
|
2月前
|
消息中间件 存储 Java
微服务——SpringBoot使用归纳——Spring Boot中集成ActiveMQ——ActiveMQ安装
本教程介绍ActiveMQ的安装与基本使用。首先从官网下载apache-activemq-5.15.3版本,解压后即可完成安装,非常便捷。启动时进入解压目录下的bin文件夹,根据系统选择win32或win64,运行activemq.bat启动服务。通过浏览器访问`http://127.0.0.1:8161/admin/`可进入管理界面,默认用户名密码为admin/admin。ActiveMQ支持两种消息模式:点对点(Queue)和发布/订阅(Topic)。前者确保每条消息仅被一个消费者消费,后者允许多个消费者同时接收相同消息。
74 0
微服务——SpringBoot使用归纳——Spring Boot中集成ActiveMQ——ActiveMQ安装
|
2月前
|
消息中间件 Java 微服务
微服务——SpringBoot使用归纳——Spring Boot中集成ActiveMQ——发布/订阅消息的生产和消费
本文详细讲解了Spring Boot中ActiveMQ的发布/订阅消息机制,包括消息生产和消费的具体实现方式。生产端通过`sendMessage`方法发送订阅消息,消费端则需配置`application.yml`或自定义工厂以支持topic消息监听。为解决点对点与发布/订阅消息兼容问题,可通过设置`containerFactory`实现两者共存。最后,文章还提供了测试方法及总结,帮助读者掌握ActiveMQ在异步消息处理中的应用。
109 0
|
2月前
|
消息中间件 网络协议 Java
微服务——SpringBoot使用归纳——Spring Boot中集成ActiveMQ——ActiveMQ集成
本文介绍了在 Spring Boot 中集成 ActiveMQ 的详细步骤。首先通过引入 `spring-boot-starter-activemq` 依赖并配置 `application.yml` 文件实现基本设置。接着,创建 Queue 和 Topic 消息类型,分别使用 `ActiveMQQueue` 和 `ActiveMQTopic` 类完成配置。随后,利用 `JmsMessagingTemplate` 实现消息发送功能,并通过 Controller 和监听器实现点对点消息的生产和消费。最后,通过浏览器访问测试接口验证消息传递的成功性。
67 0
|
2月前
|
消息中间件 Java API
微服务——SpringBoot使用归纳——Spring Boot中集成ActiveMQ—— JMS 和 ActiveMQ 介绍
本文介绍如何在Spring Boot中集成ActiveMQ,首先阐述了JMS(Java消息服务)的概念及其作为与具体平台无关的API在异步通信中的作用。接着说明了JMS的主要对象模型,如连接工厂、会话、生产者和消费者等,并指出JMS支持点对点和发布/订阅两种消息类型。随后重点讲解了ActiveMQ,作为Apache开源的消息总线,它完全支持JMS规范,适用于异步消息处理。最后,文章探讨了在Spring Boot中使用队列(Queue)和主题(Topic)这两种消息通信形式的方法。
62 0
|
2月前
|
NoSQL Java API
微服务——SpringBoot使用归纳——Spring Boot 中集成Redis——Spring Boot 集成 Redis
本文介绍了在Spring Boot中集成Redis的方法,包括依赖导入、Redis配置及常用API的使用。通过导入`spring-boot-starter-data-redis`依赖和配置`application.yml`文件,可轻松实现Redis集成。文中详细讲解了StringRedisTemplate的使用,适用于字符串操作,并结合FastJSON将实体类转换为JSON存储。还展示了Redis的string、hash和list类型的操作示例。最后总结了Redis在缓存和高并发场景中的应用价值,并提供课程源代码下载链接。
128 0
|
2月前
|
NoSQL Java Redis
微服务——SpringBoot使用归纳——Spring Boot 中集成Redis——Redis 安装
本教程介绍在 VMware 虚拟机(CentOS 7)或阿里云服务器中安装 Redis 的过程,包括安装 gcc 编译环境、下载 Redis(官网或 wget)、解压安装、修改配置文件(如 bind、daemonize、requirepass 等设置)、启动 Redis 服务及测试客户端连接。通过 set 和 get 命令验证安装是否成功。适用于初学者快速上手 Redis 部署。
50 0