9月19日Spring笔记

标签

java

后端

spring

springMVC

发布时间:

本文字数:789 字 阅读完需:约 3 分钟

SPEL 表达式

spring 表达式语言(简称SpEL):是一个支持运行时查询和操作对象图的强大的表达式语言;
语法类似于 EL:SpEL 使用 #{…} 作为定界符,所有在大框号中的字符都将被认为是 SpEL;
SpEL 为 bean 的属性进行动态赋值提供了便利;

通过 SpEL 可以实现:

  1. 通过 bean 的 id 对 bean 进行引用;
  2. 调用方法以及引用对象中的属性;
  3. 计算表达式的值;
  4. 正则表达式的匹配;

字面量的表示

整数:<property name="count" value="#{5}"/>
小数:<property name="frequency" value="#{89.7}"/>
科学计数法:<property name="capacity" value="#{1e4}"/>
String可以使用单引号或者双引号作为字符串的定界符号:<property name=“name” value="#{'Chuck'}"/><property name='name' value='#{"Chuck"}'/>
Boolean:<property name="enabled" value="#{false}"/>

alt alt alt alt

SpringMVC

SpringMVC 原理

alt

HandlerMapping: 映射处理器
HandlerAdapter: 映射适配器
HttpMessageConveter: 消息转换器

原理解析:
1、用户向服务器发送请求,请求被Spring前端控制ServeltDispatcherServlet捕获;
2、DispatcherServlet对请求URL进行解析,得到请求资源标识符(URI)。然后根据该URI,调用HandlerMapping获得该Handler配置的所有相关的对象(包括Handler对象以及Handler对象对应的拦截器),最后以HandlerExecutionChain对象的形式返回;
3、DispatcherServlet根据获得的Handler,选择一个合适的HandlerAdapter。执行相应的Controller(附注:如果成功获得HandlerAdapter后,此时将开始执行拦截器的preHandler(...)方法);
4、提取Request中的模型数据,填充Handler入参,开始执行Handler(Controller)。在填充Handler的入参过程中,根据配置,Spring将帮你做一些额外的工作:
HttpMessageConveter:将请求消息(如Json、xml等数据)转换成一个对象,将对象转换为指定的响应信息;
数据转换:对请求消息进行数据转换。如String转换成Integer、Double等;
数据根式化:对请求消息进行数据格式化。如将字符串转换成格式化数字或格式化日期等;
数据验证:验证数据的有效性(长度、格式等),验证结果存储到BindingResult或Error中;
5、Handler执行完成后,向DispatcherServlet返回一个ModelAndView对象;
6、根据返回的ModelAndView,选择一个适合的ViewResolver(必须是已经注册到Spring容器中的ViewResolver)返回给DispatcherServlet;
7、ViewResolver结合Model和View,来渲染视图;
8、将渲染结果返回给客户端;

配置示例

web.xml

<?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"
         version="4.0">
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:spring-config.xml</param-value>
    </context-param>
    <servlet>
        <servlet-name>DispatcherServlet</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:spring-mvc.xml</param-value>
        </init-param>
    </servlet>
    <servlet-mapping>
        <servlet-name>DispatcherServlet</servlet-name>
        <url-pattern>*.action</url-pattern>
    </servlet-mapping>
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>
</web-app>

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 https://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd">
<!--    包扫描-->
    <context:component-scan base-package="com.zr"></context:component-scan>
    <!--映射处理器-->
<!--    <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"></bean>-->
    <!--映射适配器-->
<!--    <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"></bean>-->

<!--    开启RequestMapping映射处理器和适配器-->
    <mvc:annotation-driven></mvc:annotation-driven>
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/views/"></property>
        <property name="suffix" value=".jsp"></property>
    </bean>
</beans>

UserController.java

package com.zr.controller;

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

@Controller

public class UserController {
    @RequestMapping("user/login.action")
    public ModelAndView login(String userId, String password){
        System.out.println("userId:"+userId+", password"+password);
        ModelAndView mav = new ModelAndView();
        mav.setViewName("main");
        return mav;
    }

}

index.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<body>
<h2>Hello World!</h2>
<form action="user/login.action" method="post">
    账号: <input type="text" name="userId"><br>
    密码: <input type="password" name="password"><br>
    <input type="submit">
</form>
</body>
</html>

WEB-INF/views/main.jsp

<%--
  Created by IntelliJ IDEA.
  User: smile
  Date: 2022/9/19
  Time: 16:14
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>main</title>
</head>
<body>
Main
</body>
</html>

效果:在主页输入账号密码后,自动解析账号密码,调用controller层的方法,控制台输出账号密码,同时ModelAndView选择ViewResolver渲染,用户最后会跳转至main页面