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:注解一个非请求处理方法

相关文章
|
11月前
|
XML 安全 Java
使用 Spring 的 @Aspect 和 @Pointcut 注解简化面向方面的编程 (AOP)
面向方面编程(AOP)通过分离横切关注点,如日志、安全和事务,提升代码模块化与可维护性。Spring 提供了对 AOP 的强大支持,核心注解 `@Aspect` 和 `@Pointcut` 使得定义切面与切入点变得简洁直观。`@Aspect` 标记切面类,集中处理通用逻辑;`@Pointcut` 则通过表达式定义通知的应用位置,提高代码可读性与复用性。二者结合,使开发者能清晰划分业务逻辑与辅助功能,简化维护并提升系统灵活性。Spring AOP 借助代理机制实现运行时织入,与 Spring 容器无缝集成,支持依赖注入与声明式配置,是构建清晰、高内聚应用的理想选择。
915 0
|
11月前
|
缓存 监控 Java
SpringBoot @Scheduled 注解详解
使用`@Scheduled`注解实现方法周期性执行,支持固定间隔、延迟或Cron表达式触发,基于Spring Task,适用于日志清理、数据同步等定时任务场景。需启用`@EnableScheduling`,注意线程阻塞与分布式重复问题,推荐结合`@Async`异步处理,提升任务调度效率。
1629 128
|
10月前
|
前端开发 Java 微服务
《深入理解Spring》:Spring、Spring MVC与Spring Boot的深度解析
Spring Framework是Java生态的基石,提供IoC、AOP等核心功能;Spring MVC基于其构建,实现Web层MVC架构;Spring Boot则通过自动配置和内嵌服务器,极大简化了开发与部署。三者层层演进,Spring Boot并非替代,而是对前者的高效封装与增强,适用于微服务与快速开发,而深入理解Spring Framework有助于更好驾驭整体技术栈。
|
11月前
|
Java 测试技术 数据库
使用Spring的@Retryable注解进行自动重试
在现代软件开发中,容错性和弹性至关重要。Spring框架提供的`@Retryable`注解为处理瞬时故障提供了一种声明式、可配置的重试机制,使开发者能够以简洁的方式增强应用的自我恢复能力。本文深入解析了`@Retryable`的使用方法及其参数配置,并结合`@Recover`实现失败回退策略,帮助构建更健壮、可靠的应用程序。
1174 1
使用Spring的@Retryable注解进行自动重试
|
10月前
|
JavaScript Java Maven
【SpringBoot(二)】带你认识Yaml配置文件类型、SpringMVC的资源访问路径 和 静态资源配置的原理!
SpringBoot专栏第二章,从本章开始正式进入SpringBoot的WEB阶段开发,本章先带你认识yaml配置文件和资源的路径配置原理,以方便在后面的文章中打下基础
668 4
|
10月前
|
XML Java 应用服务中间件
【SpringBoot(一)】Spring的认知、容器功能讲解与自动装配原理的入门,带你熟悉Springboot中基本的注解使用
SpringBoot专栏开篇第一章,讲述认识SpringBoot、Bean容器功能的讲解、自动装配原理的入门,还有其他常用的Springboot注解!如果想要了解SpringBoot,那么就进来看看吧!
807 2
|
11月前
|
XML Java 数据格式
常用SpringBoot注解汇总与用法说明
这些注解的使用和组合是Spring Boot快速开发和微服务实现的基础,通过它们,可以有效地指导Spring容器进行类发现、自动装配、配置、代理和管理等核心功能。开发者应当根据项目实际需求,运用这些注解来优化代码结构和服务逻辑。
716 12
|
11月前
|
传感器 Java 数据库
探索Spring Boot的@Conditional注解的上下文配置
Spring Boot 的 `@Conditional` 注解可根据不同条件动态控制 Bean 的加载,提升应用的灵活性与可配置性。本文深入解析其用法与优势,并结合实例展示如何通过自定义条件类实现环境适配的智能配置。
626 0
探索Spring Boot的@Conditional注解的上下文配置
|
11月前
|
智能设计 Java 测试技术
Spring中最大化@Lazy注解,实现资源高效利用
本文深入探讨了 Spring 框架中的 `@Lazy` 注解,介绍了其在资源管理和性能优化中的作用。通过延迟初始化 Bean,`@Lazy` 可显著提升应用启动速度,合理利用系统资源,并增强对 Bean 生命周期的控制。文章还分析了 `@Lazy` 的工作机制、使用场景、最佳实践以及常见陷阱与解决方案,帮助开发者更高效地构建可扩展、高性能的 Spring 应用程序。
433 0
Spring中最大化@Lazy注解,实现资源高效利用
|
11月前
|
安全 IDE Java
Spring 的@FieldDefaults和@Data:Lombok 注解以实现更简洁的代码
本文介绍了如何在 Spring 应用程序中使用 Project Lombok 的 `@Data` 和 `@FieldDefaults` 注解来减少样板代码,提升代码可读性和可维护性,并探讨了其适用场景与限制。
371 0
Spring 的@FieldDefaults和@Data:Lombok 注解以实现更简洁的代码

热门文章

最新文章