SpringMVC第一天

该文档是:SpringMVC框架学习...

博客连接:https://www.loveuluo.cn

日期:2021-01-07

1. 三层架构和MVC

image-20210107094832334

1.1 三层架构

image-20210107094220309

1.2 MVC模型

image-20210107094817439

2. SpringMVC概述

2.1 SpringMVC是什么

image-20210107100709511

2.2 SpringMVC在三层架构的位置

image-20210107100729660

2.3 SpringMVC的优势

image-20210107100743834

2.4 SpringMVC和Struts2的优略分析

image-20210107100801384

3. SpringMVC的入门案例

3.1 SpringMVC的入门程序

1、创建一个maven项目选用webapp模版。

image-20210107102820745

2、pom.xml中引入jar包。

<properties>
  <!-- 版本锁定 ,下边可以引用这个版本号-->
  <spring.version>5.0.2.RELEASE</spring.version>
</properties>

<dependencies>
  <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context</artifactId>
    <version>${spring.version}</version>
  </dependency>
  <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-web</artifactId>
    <version>${spring.version}</version>
  </dependency>
  <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-webmvc</artifactId>
    <version>${spring.version}</version>
  </dependency>
  <dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>servlet-api</artifactId>
    <version>2.5</version>
    <scope>provided</scope>
  </dependency>
  <dependency>
    <groupId>javax.servlet.jsp</groupId>
    <artifactId>jsp-api</artifactId>
    <version>2.0</version>
    <scope>provided</scope>
  </dependency>
</dependencies>

3、把main中的文件夹补全,并分别进行make Directory as ...处理。

image-20210107103351536

4、在web.xml中配置核心的控制器(配置DispatcherServlet)。

<web-app>
  <display-name>Archetype Created Web Application</display-name>
  <!-- 配置spring mvc的核心控制器 -->
  <servlet>
    <servlet-name>DispatcherServlet</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <!-- 配置Servlet的初始化参数,读取springmvc的配置文件,创建spring容器 -->
    <init-param>
      <param-name>contextConfigLocation</param-name>
      <param-value>classpath:springmvc.xml</param-value>
    </init-param>
    <!-- 配置servlet启动时加载对象 -->
    <load-on-startup>1</load-on-startup>
  </servlet>

   <!--写一个/代表访问这个工程都会先经过控制器 -->
  <servlet-mapping>
    <servlet-name>DispatcherServlet</servlet-name>
    <url-pattern>/</url-pattern>
  </servlet-mapping>
</web-app>

5、在resources的目录下创建一个配置文件springmvc.xml。

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">

    <!-- 开启注解扫描 -->
    <context:component-scan base-package="com.Luo"></context:component-scan>

    <!-- 配置视图解析器 -->
    <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <!--prefix代表会去访问路径-->
        <property name="prefix" value="/WEB-INF/pages/"></property>
        <!--suffix代表访问的东西的后缀名-->
        <property name="suffix" value=".jsp"></property>
    </bean>

    <!-- 配置spring开启注解mvc的支持,例如@RequestMapping这个注解-->
    <mvc:annotation-driven></mvc:annotation-driven>
</beans>

6、编写index.jsp和HelloController控制器类

index.jsp:

<body>
    <h3>入门程序</h3>
     <%--相对路劲--%>
    <a href="hello">入门程序</a>
</body>

HelloController:

/**
 * 控制器
 */
@Controller
public class HelloController {
    /**
     * 接收请求
     * @return
     */
    //这个path相当于到时候可以通过访问这个/hello来访问这个程序
    @RequestMapping(path = "/hello")
    public String sayHello(){
        System.out.println("Hello SpringMVC!");
        //因为配置了视图解析器,相当于会跳转到webapp/WEB-INF/pages/success.jsp页面
        return "success";
    }
}

7、在WEB-INF目录下创建pages文件夹,编写success.jsp的成功页面

<body>
    <h3>入门成功!!</h3>
</body>

8、配置一个tomcat。

image-20210107111815588

9、最终视图。

image-20210107111846645

3.2 入门案例的执行过程分析

3.2.1 简单流程

  1. 当启动Tomcat服务器的时候,因为配置了load-on-startup标签,所以会创建DispatcherServlet对象,就会加载springmvc.xml配置文件
  2. 开启了注解扫描,那么HelloController对象就会被创建
  3. 从index.jsp发送请求,请求会先到达DispatcherServlet核心控制器,根据配置@RequestMapping注解找到执行的具体方法
  4. 根据执行方法的返回值,再根据配置的视图解析器,去指定的目录下查找指定名称的JSP文件
  5. Tomcat服务器渲染页面,做出响应

image-20210107124539581

3.2.2 详细流程

图解分析:

image-20210107125954724

3.2.3 详细流程中的组建分析

DispatcherServlet:前端控制器

image-20210107130227482

HandlerMapping:处理器映射器

image-20210107130240111

Handler:处理器

image-20210107130254505

HandlAdapter:处理器适配器

image-20210107130325662

View Resolver:视图解析器

image-20210107130348625

View:视图

image-20210107130410584

3.2.4 <mvc:annotation-driven>分析

入门程序中springmvc.xml配置文件中的<mvc:annotation-driven>的分析。

image-20210107130749083

它就相当于在xml中配置了:

<!-- 配置spring开启注解mvc的支持-->
<!--<mvc:annotation-driven></mvc:annotation-driven>-->
<!-- 上面的标签相当于 如下配置-->
<!-- Begin -->
<!-- HandlerMapping -->
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"></bean>
<bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"></bean>
<!-- HandlerAdapter -->
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"></bean>
<bean class="org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter"></bean>
<bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"></bean>
<!-- HadnlerExceptionResolvers -->
<bean class="org.springframework.web.servlet.mvc.method.annotation.ExceptionHandlerExceptionResolver"></bean>
<bean class="org.springframework.web.servlet.mvc.annotation.ResponseStatusExceptionResolver"></bean>
<bean class="org.springframework.web.servlet.mvc.support.DefaultHandlerExceptionResolver"></bean>
<!-- End -->

注意: 一般开发中,我们都需要写上此标签(虽然从入门案例中看,我们不写也行,随着课程的深入,该标签还有具体的使用场景)。

明确: 我们只需要编写处理具体业务的控制器以及视图。

3.3 RequestMapping注解

3.3.1 使用说明

作用: 用于建立请求URL和处理请求方法之间的对应关系。

image-20210107143149985

3.3.2 注解出现位置示例

  1. 作用在类上:第一级的访问目录
  2. 作用在方法上:第二级的访问目录
  3. 细节:路径可以不编写 / 表示应用的根目录开始
  4. 细节:${ pageContext.request.contextPath }也可以省略不写,但是路径上不能写 /

在类上加上@RequestMapping注解:

代表访问这个类里边的方法时前边要带上/user

@RequestMapping(path = "/user")
@Controller
public class HelloController {
    
    @RequestMapping(path = "/save")
    public String userSave(){
        System.out.println("SaveUser!");
        return "success";
    }
}

index.jsp代码修改:

<body>
    <h3>入门程序</h3>
     <%--相对路劲,前边要加上user--%>
    <a href="user/save">SaveUser</a>
</body>

image-20210107143810359

3.3.3 value属性

效果和path相同,但是因为注释中只有一个值的时候value属性可以省略,所以也可以这样写:

@RequestMapping("/save")
public String userSave(){
    System.out.println("SaveUser!");
    return "success";
}

3.3.4 method属性

指定该方法的请求方式:

这样的话就代表该方法只接受POST或PUT请求,而超链接默认是get请求,所以无法访问。

@RequestMapping(path = "/save",method = {RequestMethod.POST,RequestMethod.PUT})
public String userSave(){
    System.out.println("SaveUser!");
    return "success";
}

image-20210107144732604

3.3.4 params属性

指定限制请求参数的条件。

例子一:

这样的话就代表请求的参数里必须有username属性。

@RequestMapping(path = "/save",params = {"username"})
public String userSave(){
    System.out.println("SaveUser!");
    return "success";
}

例子二:

这样的话就代表请求的参数里必须有username属性,并且username的值是hehe,例如超链接跳转user/save?username=hehe。

@RequestMapping(path = "/save",params = {"username=hehe"})
public String userSave(){
    System.out.println("SaveUser!");
    return "success";
}

3.3.5 headers属性

发送的请求中必须包含的请求头:

这就代表发送的请求中必须带有Accept这个请求头。

@RequestMapping(path = "/save",headers = {"Accept"})
public String userSave(){
    System.out.println("SaveUser!");
    return "success";
}

4. 请求参数的绑定(重要)

4.1 绑定的机制

  1. 表单提交的数据都是key=value格式的 例如accountId=10
  2. SpringMVC的参数绑定过程是把表单提交的请求参数,作为控制器中方法的参数进行绑定的
  3. 要求:提交表单的name和参数的名称是相同的

image-20210107163024430

4.2 支持的数据类型

image-20210107163637477

使用要求:

image-20210107164350972

4.3 示例一:基本类型为参数

Controller类:

@Controller
@RequestMapping("/param")
public class ParamController {
    @RequestMapping("testParam")
    public String testParam(String username,String password){
        System.out.println("执行了....");
        System.out.println("用户名:"+username);
        System.out.println("密码:"+password);
        return "success";
    }
}

jsp页面:

<body>
    <a href="param/testParam?username=Luo&password=heihei">请求参数</a>
</body>

执行结果:

image-20210107165258620

4.4 示例二:实体类里边包含一个实体类为参数

jsp页面:

input框的name属性的值得和实体类的属性名对象,才能封装进去。

<form action="param/saveAccount" method="post">
    <%--这里的name的值要和实体类的属性名对上才能封装进去--%>
    姓名:<input type="text" name="username">
    密码:<input type="text" name="password">
    金额:<input type="text" name="money">
    <%--Account类里的user属性里的uname属性--%>
    用户姓名: <input type="text" name="user.uname">
    用户年龄:<input type="text" name="user.uage">
    <input type="submit" value="提交">
</form>

User类:

public class User implements Serializable {
    private String uname;
    private Integer uage;
}

Account类:

public class Account {
    private String username;
    private String password;
    private Double money;
    private User user;
}

Controller类:

//类的@RequestMapping值是/param
@RequestMapping("/saveAccount")
public String saveAccount(Account account){
    System.out.println(account);
    return "success";
}

输出结果:

结果乱码了,一会儿解决。

image-20210107183156658

4.5 请求参数中文乱码的解决

在web.xml中配置过滤器:

<!--配置解决中文乱码过滤器-->
<filter>
  <filter-name>characterEncodingFilter</filter-name>
  <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
  <!--设置初始参数-->
  <init-param>
    <param-name>encoding</param-name>
    <param-value>UTF-8</param-value>
  </init-param>
</filter>
<filter-mapping>
  <filter-name>characterEncodingFilter</filter-name>
  <url-pattern>/*</url-pattern>
</filter-mapping>

4.6 示例三:集合类型为参数

jsp页面:

<%--这里的name的值要和实体类的属性名对上才能封装进去--%>
<form action="param/saveAccount" method="post">
姓名:<input type="text" name="username">
密码:<input type="text" name="password">
金额:<input type="text" name="money">
<%--往集合中下边为0存值--%>
用户姓名: <input type="text" name="listUser[0].uname">
用户年龄:<input type="text" name="listUser[0].uage">
<%--键就是one--%>
用户姓名: <input type="text" name="mapUser['one'].uname">
用户年龄:<input type="text" name="mapUser['one'].uage">
<input type="submit" value="提交">
</form>

Account类:

public class Account {
    private String username;
    private String password;
    private Double money;

    private List<User> listUser;
    private Map<String,User> mapUser;
}

Controller类:

//类的@RequestMapping值是/param
@RequestMapping("/saveAccount")
public String saveAccount(Account account){
    System.out.println(account);
    return "success";
}

输出结果:

image-20210107185420577

4.7 特殊情况示例一:自定义类型转换器

  1. 表单提交的任何数据类型全部都是字符串类型,但是后台定义Integer类型,数据也可以封装上,说明Spring框架内部会默认进行数据类型转换。
  2. 如果想自定义数据类型转换,可以实现Converter的接口

有一种情况可能数据不会封装上,当实体类中有private Date birthday属性的时候,你传2020/10/10这种格式可能可以封装上,但是传2020-10-10就会报错。这里我们使用自定义类型转换器解决该问题。

User类:

public class User implements Serializable {
    private String uname;
    private Integer uage;
    private Date birthday;
}

第一步:自定义类型转换器类

/**
 * 把字符串转换成日期 泛型左边的代表的是接受的类型,右边代表的是转换成什么类型</>
 */
public class StringToDateConverter implements Converter<String, Date> {
    /**
     * @param source 代表传进来的字符串
     * @return
     */
    @Override
    public Date convert(String source) {
        DateFormat df=new SimpleDateFormat("yyyy-MM-dd");
        if (source==null){
            throw new RuntimeException("请您传入数据");
        }
        try {
            //把字符串转化成日期类型,没有错的话直接返回
            return df.parse(source);
        } catch (ParseException e) {
            throw new RuntimeException("数据类型转换出现错误");
        }
    }
}

第二步:注册自定义类型转换器,在springmvc.xml配置文件中编写配置

<!--配置自定义类型转换器-->
<bean id="converterService" class="org.springframework.context.support.ConversionServiceFactoryBean">
    <!--注入converters属性-->
    <property name="converters">
        <!--converters属性是一个set集合,注入set集合-->
        <set>
            <!--注入内部bean,也就是自己写的自定义类型转换器-->
            <bean class="com.Luo.util.StringToDateConverter"></bean>
        </set>
    </property>
</bean>

 <!--配置spring开启注解mvc的支持,让自定义类型转换器生效
 annotation-driven:默认会把适配器、处理器、映射器那些组建生效
 conversion-service:让类型转换器生效
 -->
<mvc:annotation-driven conversion-service="converterService"></mvc:annotation-driven>

第三步:用jsp页面搭配Controller测试一下是否成功:

jsp页面:

<form action="param/saveUser" method="post">
    用户姓名:<input type="text" name="uname">
    用户年龄:<input type="text" name="uage">
    用户生日:<input type="text" name="birthday">
    <input type="submit" value="提交">
</form>

Controller类:

@RequestMapping("/saveUser")
public String saveUser(User user){
    System.out.println(user);
    return "success";
}

测试结果:

image-20210107194838945

image-20210107194846844

4.8 特殊情况例子二:在控制器中使用原生的ServletAPI对象

image-20210107200033790

@RequestMapping("/testServlet")
//想获得谁就在方法参数上写上就行
public String testServlet(HttpServletRequest request, HttpServletResponse response){
    System.out.println(request);
    //通过request获得session
    HttpSession session = request.getSession();
    System.out.println(session);
    //通过session获得ServletContext
    ServletContext context = session.getServletContext();
    System.out.println(context);

    System.out.println(request);
    return "success";
}

5. 常用注解

5.1 @RequestParam

1、作用:

⚫请求参数和Controller类中方法的参数名称不同时使用。

2、属性:

value:请求参数中的名称。

required:请求参数中是否必须提供此参数。默认值:true。如果为true,传过来的参数必须有设置的value。

3、使用示例

jsp页面:

<%--常用的注解--%>
<a href="anno/testAnoo01?uname=哈哈">testAnoo01</a>

Controller类:

@Controller
@RequestMapping("/anno")
public class AnnoController {

    @RequestMapping("/testAnoo01")
    //uname代表请求过来的参数名称是uname 然后会赋值给String username
    public String testAnoo01(@RequestParam(name = "uname")String username){
        System.out.println(username);
        return "success";
    }
}

5.2 @RequestBody

1、作用:

⚫该注解常用来处理Content-Type: 不是application/x-www-form-urlencoded编码的内容,例如application/json, application/xml等;

⚫就是将前端的对象映射成后端的一个对象。比如:前端传递一个User对象,使用这个注解,后端的相应的方法就可以使用user对象来接受这个参数。Get方法不适用,因为Get方法没有请求体。@RequestBody使用json字符串的格式传递数据,把json字符串数据封装到对象中来。如果用@RequestBody,那么就需要使用post方式提交。在使用了jackson依赖后才能将json字符串封装到对应的对象中。

2、属性:

required:是否必须有请求体。默认值是:true。当取值为true时,get请求方式会报错。如果取值为false,get请求得到是null。

注意两点:

⚫就是前端传递的对象属性必须和后端对应。比如 后端定义的user属性为 int id ,String name ,前端也必须使用相同的类型和字段来定义。

⚫要使用Json数据集进行传递,也就是设置为 contentType: "application/json"

⚫其实@RequestBody接收的是一个Json对象的字符串,而不是一个Json对象。

3、使用示例

jsp页面:

<script type="text/javascript">  
    $(document).ready(function(){  
        var saveDataAry=[];  
        var data1={"userName":"test","address":"gz"};  
        var data2={"userName":"ququ","address":"gr"};  
        saveDataAry.push(data1);  
        saveDataAry.push(data2);         
        $.ajax({ 
            type:"POST", 
            url:"user/saveUser", 
            dataType:"json",      
            contentType:"application/json",               
            data:JSON.stringify(saveData), //该方法能将对象变成字符串
            success:function(data){ 
                                       
            } 
         }); 
    });  
</script> 

Controller类:

@RequestMapping(value = "saveUser", method = {RequestMethod.POST }}) 
@ResponseBody  
public void saveUser(@RequestBody List<User> users) { 
    userService.batchSave(users); 
} 

5.3 @PathVaribale

1、作用:

⚫用于绑定url中的占位符。例如:请求url中 /delete/{id},这个{id}就是url占位符。 url支持占位符是spring3.0之后加入的。是springmvc支持rest风格URL的一个重要标志。(restful编程风格以后会讲)

image-20210107210149524

2、属性:

value:用于指定url中占位符名称。

required:是否必须提供占位符。

3、使用示例

jsp页面:

<a href="anno/testAnoo03/10">testAnoo03</a>

Controller类:

@RequestMapping("/testAnoo03/{sid}")
//注释中的name代表的是上边的/{sid},可以得到这个的值
public String testAnoo03(@PathVariable(name = "sid") String id){
    System.out.println(id);
    return "success";
}

输出结果:

image-20210107205251382

5.4 RequestHeader

1、作用:

⚫用于获取请求头中的消息头。

2、属性:

value:提供请求头中的消息头名称

required:是否必须有此消息头

注: 在实际开发中一般不怎么用。

3、使用示例

jsp页面:

<!-- RequestHeader注解 --> 
<a href="anno/testAnoo04">获取请求消息头</a>

Controller类:

@RequestMapping("/testAnoo04") 
public String testAnoo04(@RequestHeader(value="Accept-Language", required=false)String requestHeader){
    System.out.println(requestHeader);
    return "success"; 
}

输出结果:

image-20210107210655666

5.5 @CookieValue

1、作用:

⚫用于把指定cookie名称的值传入控制器方法参数。

2、属性:

value:指定cookie的名称。

required:是否必须有此cookie。

3、使用示例

jsp页面:

<!-- CookieValue注解 --> 
<a href="anno/testAnoo05">获取cookie的值</a>

Controller类:

@RequestMapping("/testAnoo05")
//这个Cookie其实就是Session,Session底层使用的Cookie技术
public String testAnoo05(@CookieValue(value="JSESSIONID",required=false) String cookieValue){
    System.out.println(cookieValue); 
    return "success"; 
}

输出结果:

image-20210107211455228

5.6 @ModelAttribute

1、作用:

⚫出现在方法上:表示当前方法会在控制器方法执行前线执行。

⚫出现在参数上:获取指定的数据给参数赋值。

2、属性:

value:用于获取数据的key。key可以是POJO的属性名称,也可以是map结构的key。

3、应用场景:

⚫当提交表单数据不是完整的实体数据时,保证没有提交的字段使用数据库原来的数据。

4、使用示例①:有返回值的情况

jsp页面:

<form action="anno/testAnoo06" method="post">
    用户姓名:<input type="text" name="uname">
    用户年龄:<input type="text" name="uage">
    <input type="submit" value="提交">
</form>

Controller类:

/**
 * 该方法会先执行
 */
@ModelAttribute
//表单里有uname,可以直接拿到
public User shouUser(String uname){
    System.out.println("showUser方法执行了");
    //1.通过用户名查询数据库(模拟一下)
    //  模拟这是根据用户名查到的对象
    User user=new User();
    //  假设下边的这三个都是从数据库查到的User对象的数据
    user.setUname(uname);
    user.setUage(20);
    user.setBirthday(new Date());
    //2.把刚查到的user对象返回回去,然后下边的testAnoo06方法执行,它能接收到user类。
    //  重点:如果表单中有uname或者uage,这两个就算设置到user里边并且返回给testAnoo06方法,它也无法拿到,它只能拿到Birthday也就是表单中没有的那个。
    return user;
}

@RequestMapping("/testAnoo06")
public String testAnoo06(User user){
    /*
    此时从shouUser方法中获得了user对象,因为表单中存在uname和uage,所以现在这个user对象的值只有birthday,别的都是null。
    然后从表单中获取uname和uage的值设置进这个user对象中!
     */
    System.out.println("testModelAttribute执行了");
    System.out.println(user);
    return "success";
}

情况①-不输入年龄查询结果:

image-20210107222115159

image-20210107222150629

情况②-输入年龄查询结果:

image-20210107221130443

image-20210107221140365

5、使用示例②:通过Map集合,不写返回值

jsp页面:

<form action="anno/testAnoo06" method="post">
    用户姓名:<input type="text" name="uname">
    用户年龄:<input type="text" name="uage">
    <input type="submit" value="提交">
</form>

Controller类:

/**
 * 该方法会先执行
 */
@ModelAttribute
//表单里有uname,可以直接拿到(添加一个map集合参数)
public void shouUser(String uname, Map<String,User> map){
    System.out.println("showUser方法执行了");
    //1.通过用户名查询数据库(模拟一下)
    //  模拟这是根据用户名查到的对象
    User user=new User();
    //  假设下边的这三个都是从数据库查到的User对象的数据
    user.setUname(uname);
    user.setUage(20);
    user.setBirthday(new Date());
    //2.把刚查到的user对象存到map集合当中。
    //  重点:如果表单中有uname或者uage,这两个就算设置到user里边并且放入集合,它也无法拿到,它只能拿到Birthday也就是表单中没有的那个。
    map.put("abc",user);
}

/**
 * ModelAttribute注解
 * @return
 */
@RequestMapping("/testAnoo06")
//这里的@ModelAttribute代表从map中取出key是abc的那个user对象
public String testAnoo06(@ModelAttribute("abc")User user){
    /*
    此时从map集合中获得了user对象,因为表单中存在uname和uage,所以现在这个user对象的值只有birthday,别的都是null。
    然后从表单中获取uname和uage的值设置进这个user对象中!
     */
    System.out.println("testModelAttribute执行了");
    System.out.println(user);
    return "success";
}

输出结果:

情况①-不输入年龄查询结果:

image-20210107222115159

image-20210107222150629

情况②-输入年龄查询结果:

image-20210107221130443

image-20210107221140365

5.7 @SessionAttribute

1、作用:

⚫用于多次执行控制器方法间的参数共享。

2、属性:

value:用于指定存入的属性名称

required:用于指定存入的数据类型。

3、使用示例

jsp页面:

<!-- SessionAttribute注解的使用 --> <
a href="user/save">存入SessionAttribute</a>
<a href="user/find">取出SessionAttribute</a> 
<a href="user/delete">清除SessionAttribute</a>

Controller类:

@Controller
@RequestMapping(path="/user")
@SessionAttributes(value= {"username","password","age"},types={String.class,Integer.class}) // 把数据存入到session域对象中
public class UserController {
    /**
     * 向session中存入值
     * @return
     */
    @RequestMapping(path="/save")
    public String save(Model model) {
        System.out.println("向session域中保存数据");
        model.addAttribute("username", "root");
        model.addAttribute("password", "123");
        model.addAttribute("age", 20);
        return "success";
    }
    /**
     * 从session中获取值
     * @return
     */
    @RequestMapping(path="/find")
    public String find(ModelMap modelMap) {
        String username = (String) modelMap.get("username");
        String password = (String) modelMap.get("password");
        Integer age = (Integer) modelMap.get("age");
        System.out.println(username + " : "+password +" : "+age);
        return "success";
    }
    /**
     * 清除值
     * @return
     */
    @RequestMapping(path="/delete")
    public String delete(SessionStatus status) {
        status.setComplete();
        return "success";
    }
}

5.8 @RequestBody

1、作用:

⚫返回数据或者返回json数据,返回的如果是对象的话会自动转化成json字符串返回。

2、属性:

required:这个值可以没有,也就是为空没传过来的意思。

最后修改:2021 年 02 月 10 日 08 : 55 PM
如果觉得我的文章对你有用,请随意赞赏