当前位置: 首页 > wzjs >正文

那些网站可以做信息推广摄影 wordpress

那些网站可以做信息推广,摄影 wordpress,西城顺德网站建设,wordpress手机站如何做在 Spring MVC 中,SessionAttributes 是一个类级别的注解,用于表示 Spring MVC 将 Controller 中的属性存储到 HTTP Session 中,以便在同一用户会话的后续请求中可以访问这些属性。 简单来说,它的作用是将请求范围的模型&#xf…

在 Spring MVC 中,@SessionAttributes 是一个类级别的注解,用于表示 Spring MVC 将 Controller 中的属性存储到 HTTP Session 中,以便在同一用户会话的后续请求中可以访问这些属性。

简单来说,它的作用是将请求范围的模型(Model)属性“提升”到会话范围。

为什么需要 @SessionAttributes

模型属性(通过 Model, ModelMap, ModelAndView 添加的)只在当前请求的生命周期内有效。请求处理完成后,模型数据就会丢失。

但在某些场景下,我们需要在同一个用户的多个连续请求之间共享数据,最典型的例子就是多步骤表单 (Wizard Form)。用户在第一页填写一部分信息提交,然后跳转到第二页填写更多信息,最后在第三页或最终页将所有信息一起提交保存。此时,从第一页和第二页收集到的数据需要在整个过程中保持可用。

虽然可以直接使用 HttpSession 对象来存取数据,但 @SessionAttributes 提供了一种与 Spring MVC 的模型和请求处理机制更紧密集成的方式来管理会话范围的数据,特别是与 @ModelAttribute 结合使用时非常方便。

@SessionAttributes 的工作原理:

  1. 标注: 在 Controller 类上使用 @SessionAttributes 注解,指定一个或多个模型属性的名称(或类型)。
  2. 存储: 当 Controller 方法将一个属性添加到模型中,并且该属性的名称(或值的类型)与 @SessionAttributes 中指定的匹配时,Spring MVC 会在请求处理完成后,自动将这个模型属性存储到当前用户的 HTTP Session 中。
  3. 检索: 对于后续到达同一个 Controller 的请求,在请求处理方法执行之前,Spring MVC 会检查 HTTP Session 中是否存在与 @SessionAttributes 中指定的名称(或类型)匹配的属性。如果存在,Spring 会自动将这些属性从 Session 中加载回当前请求的模型中。
  4. 绑定 (@ModelAttribute): 这与自动绑定的过程结合得非常好。如果有一个方法参数使用 @ModelAttribute 标注,并且该参数的名称(或类型)与 @SessionAttributes 中指定的匹配,Spring 会尝试从 Session 中获取对应的对象,而不是从请求参数中新建一个对象。然后,它会根据请求参数更新这个从 Session 中取出的对象。

如何使用 @SessionAttributes

@SessionAttributes 可以通过两种方式指定要存储的属性:

  • 按名称指定: 使用 value 或其别名指定模型属性的名称。
  • 按类型指定: 使用 types 指定模型属性的类型。任何添加到模型中的对象,如果其类型匹配,就会被存储。

示例:一个简单的多步骤表单

假设我们有一个创建用户的三步流程。我们在 Controller 中使用 @SessionAttributes 来保存用户对象 UserForm

首先,定义一个 POJO (UserForm) 来封装表单数据:

public class UserForm implements Serializable { // 建议实现 Serializableprivate String firstName;private String lastName;private int age;// Getters and setterspublic String getFirstName() { return firstName; }public void setFirstName(String firstName) { this.firstName = firstName; }public String getLastName() { return lastName; }public void setLastName(String lastName) { this.lastName = lastName; }public int getAge() { return age; }public void setAge(int age) { this.age = age; }@Overridepublic String toString() {return "UserForm{" +"firstName='" + firstName + '\'' +", lastName='" + lastName + '\'' +", age=" + age +'}';}
}

然后,创建 Controller:

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.SessionAttributes;
import org.springframework.web.bind.support.SessionStatus;@Controller
@RequestMapping("/user/create")
// 1. 使用 @SessionAttributes 标注 Controller 类
//    指定要将名为 "userForm" 的模型属性存储到 Session 中
@SessionAttributes("userForm")
public class UserCreationController {// 2. @ModelAttribute 方法:用于在模型中初始化 userForm 对象//    这个方法会在任何请求处理方法执行前被调用一次 (通常是第一次访问该Controller时)//    返回的对象会以 "userForm" 为key添加到模型中 (因为方法名是userForm,或者可以用@ModelAttribute("userForm")指定)//    因为 @SessionAttributes("userForm"),这个对象会被存入 Session@ModelAttribute("userForm")public UserForm setUpUserForm() {return new UserForm();}// Step 1: 显示第一个表单页面@GetMapping("/step1")public String step1(Model model) {// @ModelAttribute("userForm") setUpUserForm() 方法已经把 userForm 加入模型// 这里可以直接返回视图名return "user/create/step1";}// Step 1: 处理第一个表单提交// 3. 使用 @ModelAttribute("userForm") 参数//    Spring 会从 Session 中加载 userForm (如果存在),然后将请求参数绑定到这个对象上@PostMapping("/step1")public String processStep1(@ModelAttribute("userForm") UserForm userForm) {System.out.println("Processed Step 1: " + userForm);// 跳转到下一步return "redirect:/user/create/step2";}// Step 2: 显示第二个表单页面@GetMapping("/step2")public String step2(@ModelAttribute("userForm") UserForm userForm) {// userForm 自动从 Session 加载并添加到模型return "user/create/step2";}// Step 2: 处理第二个表单提交@PostMapping("/step2")public String processStep2(@ModelAttribute("userForm") UserForm userForm) {System.out.println("Processed Step 2: " + userForm);// 跳转到下一步return "redirect:/user/create/step3";}// Step 3: 显示最终确认页面@GetMapping("/step3")public String step3(@ModelAttribute("userForm") UserForm userForm) {// userForm 自动从 Session 加载并添加到模型return "user/create/step3";}// Step 3: 处理最终提交并完成流程// 4. 在最终处理方法中,使用 SessionStatus 参数//    调用 setComplete() 方法清理 Session 中的 @SessionAttributes 属性@PostMapping("/complete")public String complete(@ModelAttribute("userForm") UserForm userForm, SessionStatus status) {System.out.println("Completing User Creation: " + userForm);// TODO: Save the userForm data to database etc.// 清理 Session 中的 "userForm" 属性status.setComplete();// 跳转到完成页面或首页return "redirect:/user/create/success";}@GetMapping("/success")public String success() {return "user/create/success";}
}

关键点解释:

  • @SessionAttributes("userForm"): 告诉 Spring 在处理完 Controller 方法后,将模型中名为 “userForm” 的属性存入 Session。在处理方法执行前,如果 Session 中有 “userForm”,会加载到模型中。
  • @ModelAttribute("userForm") public UserForm setUpUserForm(): 这个方法在第一次访问 /user/create/* 路径时会执行(或者如果 Session 中没有 “userForm” 时)。它创建一个新的 UserForm 对象并添加到模型中。
  • @ModelAttribute("userForm") UserForm userForm (作为方法参数): 在 processStep1, step2, processStep2, step3, complete 方法中,Spring 会因为 @ModelAttribute 注解尝试获取名为 “userForm” 的对象。由于 @SessionAttributes 的存在,它会首先去 Session 中查找。如果找到,就使用 Session 中的对象,并尝试将请求参数绑定到这个现有对象上。如果没有找到(通常是第一次访问 Step 1),它会调用 @ModelAttribute 方法(setUpUserForm)来创建对象。
  • SessionStatus status: 在流程的最后一步(complete 方法),我们注入了 SessionStatus 参数。调用 status.setComplete() 非常重要!它会通知 Spring 清理当前 Controller 标记为 @SessionAttributes 的所有属性。如果忘记这一步,“userForm” 对象将一直留在用户的 Session 中,直到 Session 过期,可能导致数据混乱或内存泄漏。

优点:

  • 简化了多步骤流程中的数据传递,无需手动操作 HttpSession
  • @ModelAttribute 集成,自动将请求参数绑定到 Session 中的对象。
  • 将与特定 Controller 相关的会话数据管理集中在该 Controller 中。

缺点/注意事项:

  • 必须手动清理 Session: 容易忘记调用 SessionStatus.setComplete()
  • 范围: @SessionAttributes 是类级别的,影响该 Controller 的所有请求处理方法。如果一个 Controller 处理多个不相关的流程,这可能导致问题。建议将 @SessionAttributes 用于专门处理特定工作流的 Controller。
  • Session 大小: 将大量数据或大型对象存储在 Session 中会占用服务器内存,可能影响应用的可伸缩性,尤其是在需要 Session 复制的分布式环境中。谨慎使用。
  • 并发问题: 如果同一个用户在多个浏览器标签页中同时进行同一个多步骤流程,可能会出现数据混乱。

总而言之,@SessionAttributes 是 Spring MVC 为简化特定场景(如多步骤表单)中的会话数据管理而提供的便捷机制,通过将模型属性自动在请求和会话之间同步来实现。使用时务必注意流程结束时的 Session 清理。


文章转载自:

http://va7hl0fv.Ljjmr.cn
http://54XeTPbt.Ljjmr.cn
http://nsfxqa2m.Ljjmr.cn
http://Jbnc5t7g.Ljjmr.cn
http://2JtsTDWf.Ljjmr.cn
http://sCcPiQa3.Ljjmr.cn
http://ZYTcP3QF.Ljjmr.cn
http://GfiMbz9l.Ljjmr.cn
http://WOZ55oQy.Ljjmr.cn
http://wFV2EMPj.Ljjmr.cn
http://9AyktRyc.Ljjmr.cn
http://uVhJhPVK.Ljjmr.cn
http://f9azae3e.Ljjmr.cn
http://6NpkZrnu.Ljjmr.cn
http://ahfsyM2S.Ljjmr.cn
http://zzjBkYZ0.Ljjmr.cn
http://2Nmco9My.Ljjmr.cn
http://rCCOplqB.Ljjmr.cn
http://Sq8vfI2z.Ljjmr.cn
http://m6sP89QQ.Ljjmr.cn
http://p1XcaXfj.Ljjmr.cn
http://6yaRuuKT.Ljjmr.cn
http://K1PgVPyP.Ljjmr.cn
http://84DHtSG4.Ljjmr.cn
http://UHuBfFDq.Ljjmr.cn
http://Tc63zvu2.Ljjmr.cn
http://YxaRlWQ2.Ljjmr.cn
http://I9Zro0cj.Ljjmr.cn
http://F9M19oc7.Ljjmr.cn
http://GgJNqYLi.Ljjmr.cn
http://www.dtcms.com/wzjs/614528.html

相关文章:

  • 建一个营销网站的步骤中国住房和城乡建设部
  • 公司网站能自己做么制作灯笼的手工做法简单漂亮
  • 电子商务网站建设前期规划方案网络营销方案的制定
  • 网站首页跳出弹窗学校网站班级网页建设制度
  • 网站留言板制作单机网页制作工具
  • 河北省住房和城乡建设厅网站微信网站技术方案
  • 图片库网站建设wordpress用户添加资源
  • 网站建设费用属于业务宣传费吗织梦移动端网站怎么做
  • 怎样做网站图清晰大连开发区邮编
  • 网站登录密码怎么取消保存WordPress博客手机主题
  • 用jquery做的网站wordpress 引号 主题 remove_filter
  • 网站开发能干什么男女做的那个视频网站
  • 网站建设 流程网络推广公司利润如何
  • 山东建设和城乡建设厅注册中心网站长春建站塔山双喜
  • 网页模板怎么做网站湖南建设厅网站首页
  • 做的网站百度搜索不出来温州推广团队
  • 网站公司网站定制wordpress 分类 文章前
  • 佛山手机建站模板ui做的好的网站
  • 百度生成手机网站许昌市住房建设局网站
  • 一个网站可以做多个描述吗交互效果网站
  • 河北省建设厅网站运行条件去成都需要隔离吗
  • 美橙网站建设怎么做58上海同城网
  • 温州15000 做网站的工作泰安房产网签查询
  • 深圳福田在线用什么软件做网站seo好
  • 石龙仿做网站wordpress 伪静态 tag
  • 济南营销型网站制作网店平台网站建设需求
  • 怎么把百度到自己的网站软文广告属于什么营销
  • 网站建设推广文案中国食品加工网
  • 个人网站源代码广告营销的好处
  • h5响应式网站建设方案怎么写宝塔面板加wordpress