东湖之滨 发表于 2024-11-15 15:27:17

Spring MVC进阶

目录

1.Spring MVC控制器技术
定义控制器
 定义Action
 Action地址中利用路径变量
Action限定哀求范例
2.视图向控制器传值 
 视图向控制器传参的常用方式
 案例演示:
 登录页面核心逻辑:
 2.2视图向控制器传参
第一种方式:利用HttpServletRequest吸收哀求参数
第二种方式:利用简单数据范例吸收哀求参数
 第三种方式:利用实体类对象吸收哀求参数
3. 控制器向视图传值 
 控制器向视图传参的常用方式
 控制器向视图传参(续上面的案例)
 用HttpServletRequest通报数据
 用Model大概Map通报数据
 用ModelAndView通报数据
 推荐方式:
 视图获取数据
4. 编程实操
 Spring-mvc.xml设置
登录视图user/login.jsp:
系统首页视图home/index.jsp
 实体类User:
用户登录时的提交对象LoginPo
业务层UserService
控制器UserController 
 控制器HomeController
 运行验证:
至此,完成了mvc实操的要求与显示结果

1.Spring MVC控制器技术

定义控制器


   Spring MVC   中利用org.springframework.stereotype.Controller注解声明某类的实例是控制器    定义控制器步骤如下:    ①为控制器类加注解@Controller    ②自动扫描控制器所在包 https://i-blog.csdnimg.cn/direct/e1569710b774454aa0a465dbfc79bc59.png
 定义Action

   Spring MVC 中利用   @RequestMapping将哀求与处理方法一一对应    @RequestMapping负责将不同哀求映射到对应的控制器方法,即Action    @RequestMapping不仅仅可以定义在方法处,还可以定义在类上   建议接纳类级别注解,将相关处理放在同一控制器中    类注解url+方法注解的url     Action地址中利用路径变量

 
   在@RequestMapping指定的URL时可含有变量    利用@PathVariable指定形参吸收url的参数值    https://i-blog.csdnimg.cn/direct/b3a6692703c94ed4afdc3bc583fe1afb.pngAction限定哀求范例

   @RequestMapping可通过method   属性来限定哀求范例,如GET、POST等。    https://i-blog.csdnimg.cn/direct/cade487fc16943769d2ae9ad1a900922.png   method   利用枚举类RequestMethod来定义哀求范例    URL哀求方式和Action中method属性值不符,将拒绝哀求   也可以利用组合注解来限定方法吸收哀求的范例。 
https://i-blog.csdnimg.cn/direct/f21e69779ded49dbb096b225ebf5b84b.png
 
2.视图向控制器传值 

 视图向控制器传参的常用方式

   ①利用HttpServletRequest吸收哀求参数    ②利用简单数据范例吸收哀求参数    ③利用实体类对象吸收哀求参数    案例演示:

案例:用户登录
输入用户名、暗码
提交验证登录
登录成功到成功页面
登录失败到失败页面
咱不访问数据库,而假定
登录账号=admin
登录暗码password=123456
为登录成功的充要条件
 
 登录页面核心逻辑:

https://i-blog.csdnimg.cn/direct/56ee209fc6f74c38b9c58f58a627729d.png
 2.2视图向控制器传参

第一种方式:利用HttpServletRequest吸收哀求参数

   利用HttpServletRequest作为Action的参数来吸收用户哀求,从用户哀求中获取参数值,如下:    https://i-blog.csdnimg.cn/direct/d692f0ffcc43465298c97cb7fbb04b90.png 
第二种方式:利用简单数据范例吸收哀求参数

   https://i-blog.csdnimg.cn/direct/108ff5bcd67943209f9d0ec1effb26da.png   这种方式要保证方法形参名要和用户哀求参数名保持一致    扩展:如果不一致,则利用@RequestParam指定    https://i-blog.csdnimg.cn/direct/101780608f074cc894709b4f5ad02c4d.png
 这种方式@RequestParam里的值要和哀求参数名保持一致
 第三种方式:利用实体类对象吸收哀求参数

   (1)在项目下新建“entity”包,包下新建一个实体类“LoginParam”用于吸收参数 https://i-blog.csdnimg.cn/direct/2a7d3dcf13844906842fd778691e1ada.png
 (2)在Action中利用“LoginParam”对象作为参数来吸收表单数据
   https://i-blog.csdnimg.cn/direct/5084ecd1f69b4cb18c98ebaa4ff9747d.png3. 控制器向视图传值 

 控制器向视图传参的常用方式

 控制器获取到数据后,需要将数据渲染到视图中
   常用方式如下    ①通过HttpServletRequest通报数据    ②利用Model大概Map大概ModelMap通报数据    ③利用ModelAndView通报数据    控制器向视图传参(续上面的案例)

https://i-blog.csdnimg.cn/direct/0d270774cf8d432ab0be631d6fbbd2f8.png
 用HttpServletRequest通报数据

   通过request.setAttribute(key,value)将通报到视图的数据放入哀求域中    https://i-blog.csdnimg.cn/direct/5bc6dc793a944dc48bd6a84bff4dfb85.png
 用Model大概Map通报数据

 可利用SpringMVC提供的Model对象来完成控制器和视图间数据的通报
   Model是Map布局,可用Map/ModelMap作为入参    model.addAttribute(key,value)将通报数据放入哀求中    https://i-blog.csdnimg.cn/direct/40e932e2f6af4227bdde692f243319a8.png
 用ModelAndView通报数据

 推荐方式:

https://i-blog.csdnimg.cn/direct/3e04b87eb3f34fad9f1f15b0f88f34c3.png
 视图获取数据

 视图端通过EL表达式${键名}来获取数据
   在login_succ.jsp页面中通过${param.username}大概${requestScope.param.username}取值    https://i-blog.csdnimg.cn/direct/71993f3bec3d4aa4934b6ae5c67ff95f.png
4. 编程实操

   实现用户登录功能    登录成功跳转到系统首页    登录失败返回登录页面,并显示错误信息 Spring-mvc.xml设置

<?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
http://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="org.flowerfog.service"/>
    <context:component-scan base-package="org.flowerfog.controller"/>
    <!-- 开启SpringMVC框架的注解驱动 -->
    <mvc:annotation-driven/>
    <!--视图解析器-->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
      <property name="prefix" value="/WEB-INF/views/"/>
      <property name="suffix" value=".jsp"/>
    </bean>

</beans>


登录视图user/login.jsp:

<%--
Created by IntelliJ IDEA.
User: flowerfog
Date: 2024/11/14
Time: 15:13
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>
<html>
<head>
    <title>用户登录</title>
</head>
<body>
<h1>用户登录</h1>
<form method="POST" action="${pageContext.request.contextPath}/user/doLogin">
    登录账号:<input type="text" name="account"><br />
    登录密码:<input type="password" name="password"><br />
    <input type="submit" value="登录" /> &nbsp;
    <input type="reset" value="重置" />
</form>
<div style="color: red">${message}</div>
</body>
</html>


系统首页视图home/index.jsp

<%--
Created by IntelliJ IDEA.
User: flowerfog
Date: 2024/11/14
Time: 15:14
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>
<html>
<head>
<title>首页</title>
</head>
<body>
欢迎:${loginUser.name}进入系统
</body>
</html>


 实体类User:

package org.flowerfog.pojo;

import lombok.Data;

/**
* 实体类:用户
*/
@Data
public class User {
    private Integer id;
    private String name;
    private String account;
    private String password;
    private Integer status;
}



 
用户登录时的提交对象LoginPo

package org.flowerfog.dto;

import lombok.Data;

/**
* 用户登录提交对象
*/
@Data
public class LoginPo {
    private String account;
    private String password;
}



业务层UserService

 
package org.flowerfog.service;

import org.flowerfog.dto.LoginPo;
import org.flowerfog.pojo.User;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;

@Service
public class UserService {

    public User login(LoginPo loginPo) {
      //暂不访问数据库
      if("admin".equals(loginPo.getAccount()) && "123456".equals(loginPo.getPassword())) {
            User user = new User();
            BeanUtils.copyProperties(loginPo, user);
            user.setId(1);
            user.setName("系统管理员");
            user.setStatus(0);

            return user;
      }else{
            return null;
      }
    }
}



控制器UserController 

package org.flowerfog.controller;

import org.flowerfog.dto.LoginPo;
import org.flowerfog.pojo.User;
import org.flowerfog.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;

@Controller
@RequestMapping("/user")
public class UserController {
    @Autowired
    UserService userService;

    @GetMapping(value = "/login")
    public ModelAndView login() {
      ModelAndView mv = new ModelAndView();
      mv.setViewName("user/login");

      return mv;
    }

    @PostMapping(value = "/doLogin")
    public ModelAndView doLogin(LoginPo loginPo) {
      ModelAndView mv = new ModelAndView();
      User user = userService.login(loginPo);
      if (user != null) {
            mv.setViewName("home/index");
            mv.addObject("loginUser", user);
      } else {
            mv.setViewName("user/login");
            mv.addObject("message","账号或密码错误");
      }
      return mv;
    }
}



 控制器HomeController

package org.flowerfog.controller;
import org.flowerfog.pojo.User;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;

@Controller
@RequestMapping("/home")
public class HomeController {
    @GetMapping(value = "/index")
    public ModelAndView index() {
      ModelAndView mv = new ModelAndView();
      mv.setViewName("home/index");
      User user = new User();
      user.setName("");
      mv.addObject("loginUser", user);

      return mv;
    }
}

 运行验证:

https://i-blog.csdnimg.cn/direct/c469e61323fe4eeca2d95fe5df367e31.png
https://i-blog.csdnimg.cn/direct/9e4ec81aaab14ff0a527e0013a7d5c72.png
 
https://i-blog.csdnimg.cn/direct/63efa6f4015d423fb82f586218bdd3e9.png
https://i-blog.csdnimg.cn/direct/02bf10a6e8c84be48b0bac60f2b3e79b.png 
 
至此,完成了mvc实操的要求与显示结果


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: Spring MVC进阶